Сделал я одно устройство типа генератора сигнала - измерения отклика на LPC2148 и кодеке PCM3002. Частота дискретизации определяется внешним кварцевым генератором, сигнал которого подается на таймер-счетчик в LPC2148, он генерирует сигналы для кодека. Кодек подключен к LPC на SPI1 в 16 разрядном режиме. Проект построен на IAR USB Audio Device, он оказался наиболее полным (и ввод, и вывод). Возникла проблема, бьюсь уже несколько недель - генерация сигнала искажается через каждые 20с на 1-2 сек. Увеличение буффера помогает немного - искажения возникают реже, но не исчезают, так как в этом проекте генерация начинается только после заполнения буффера на 2/3. Адаптивный режим (как в исходном проекте) отключил (не устраивает! ), прерывания fiq происходят регулярно синхронно с частотой дискретизации кодека. Подозреваю - причина в том, что скорость поступления данных по USB меньше, чем вывожу в кодек. Искал по форуму (http://electronix.ru/forum/index.php?showtopic=20117&hl=), изучал стандарты - audio10.pdf (с usb.org), пробовал различные режимы - не получается. Может подскажете чего-нибуть, или объясните, как настроить правильно USB дескрипторы и задержки в них , использовать ли синхронный режим? Вот дескрипторы интерфейса 1 - генерация сигнала (Speaker в проекте)
// Interface 1 // AudioStreaming Interface Descriptor // Zero-bandwidth Alternate Setting 0 // Standard AS Interface Descriptor sizeof(UsbStandardInterfaceDescriptor_t), UsbDescriptorInterface, 1, 0, 0, UsbDeviceClassAudio, AUDIOSTREAMING, PR_PROTOCOL_UNDEFINED, 0,
// Operational Alternate Setting 1 // Standard AS Interface Descriptor sizeof(UsbStandardInterfaceDescriptor_t), UsbDescriptorInterface, 1, 1, 1, UsbDeviceClassAudio, AUDIOSTREAMING, PR_PROTOCOL_UNDEFINED, 0,
// Class-specific AS General Interface Descriptor sizeof(UsbClassSpecificASInterfaceDescriptor_t), CS_INTERFACE, AS_GENERAL, SpkInTermID, 2, _2BL(PCM),
// USB Spk Type I Format Type Descriptor sizeof(UsbTypeIFormatTypeDescriptor_t)+ 3, CS_INTERFACE, FORMAT_TYPE, FORMAT_TYPE_I, 1, SubFrameSize, 8*SubFrameSize, 1, (Int8U)(SampFreq),(Int8U)(SampFreq>>8),(Int8U)(SampFreq>>16),
// USB SPK Standard Endpoint Descriptor sizeof(StandardASEndpointDescriptor_t), UsbDescriptorEp, UsbEpOut(SpkEp>>1), // (Int8U)UsbEpTransferIsochronous + (Int8U)UsbEpSynchAdaptive, (Int8U)UsbEpTransferIsochronous + (Int8U)UsbEpSynchAsynchronous, _2BL(SpkEpMaxSize), 1, 0, 0,
// USB SPK Class-specific Isoc. Audio Data Endpoint Descriptor sizeof(ClassSpecASEndpointDescriptor_t), CS_ENDPOINT, EP_GENERAL, 0, 0, _2BL(0),
|