|
STM32 Audio device class |
|
|
|
Jun 10 2015, 07:00
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Приветствую. До этого работал только с плис и дсп, теперь осваиваю стм и юсб. Необходимо по юсб принять аудиопоток на стм. Собрал в CubeMX проект, потом подправил дескрипторы под 48kHz, 24bit, увеличил стек и кучу чтоб все завелось. Устройство в виндовсе определяется без ошибок, аудио выплёвывает. Теперь вопрос, а где эти данные искать в микроконтроллере?!? В описании библиотеки: Цитата How to use this driver This driver uses an abstraction layer for hardware driver (i.e. HW Codec, I2S interface, I2C control interface...). This abstraction is performed through a lower layer (i.e. usbd_audio_if.c) which you can modify depending on the hardware available for your application. To use this driver: Through the file usbd_conf.h, you can configure: • The audio sampling rate (define USBD_AUDIO_FREQ) Call the function USBD_AUDIO_Init() at startup to configure all necessary firmware and hardware components (application-specific hardware configuration functions are also called by this function). The hardware components are managed by a lower layer interface (i.e. usbd_audio_if.c) and can be modified by user depending on the application needs. The entire transfer is managed by the following functions (no need for user to call any function for out transfers): • usbd_audio_DataIn() and usbd_audio_DataOut() which update the audio buffers with the received or transmitted data. For Out transfers, when data are received, they are directly copied into the audiobuffer and the write buffer (wr_ptr) is incremented. The Audio Control requests are managed by the functions USBD_AUDIO_Setup() and USBD_AUDIO_EP0_RxReady(). These functions route the Audio Control requests to the lower layer (i.e. usbd_audio_if.c). In the current version, only SET_CUR and GET_CUR requests are managed and are used for mute control only. Причём функция usbd_audio_DataIn пустая и программа в неё даже не заходит. Где искать этот самый audiobuffer?
Сообщение отредактировал maxis - Jun 10 2015, 07:02
|
|
|
|
|
 |
Ответов
|
Jun 10 2015, 09:42
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Цитата(KnightIgor @ Jun 10 2015, 10:14)  Это не та ли путаница с USB, что есть In, и что Out? Обычно, название дается с точки зрения PC, поэтому следует обратить внимание на usbd_audio_DataOut. Да, действительно, приём данных происходит в usbd_audio_DataOut. Вижу что данные принимаются, кладётся в какой то буфер. Но при этом абсолютно не понимаю как из этого буфера правильно вычитывать.
|
|
|
|
|
Jun 10 2015, 12:36
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(maxis @ Jun 10 2015, 10:42)  Да, действительно, приём данных происходит в usbd_audio_DataOut. Вижу что данные принимаются, кладётся в какой то буфер. Но при этом абсолютно не понимаю как из этого буфера правильно вычитывать. Прежде всего, надо знать, что именно приходит. Я предполагаю, что идут PCM выборки, по 16 бит на канал. Технически надо дописать функцию так, чтобы при приходе данных взводился какой-то флаг (например, принятая длина буфера), который бы анализировался в некоем процессе, который, зная местоположение буфера, выбирал бы из него лежащие там данные и пользовал по своему усмотрению. Например, переписывал в рабочий (двойная буферизация), откуда посылал бы в I2S периферию или DAC. Это уже вопросы техники программирования, RTOS и т.п.
|
|
|
|
|
Jun 11 2015, 12:04
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Цитата(KnightIgor @ Jun 10 2015, 15:36)  Прежде всего, надо знать, что именно приходит. Я предполагаю, что идут PCM выборки, по 16 бит на канал. Технически надо дописать функцию так, чтобы при приходе данных взводился какой-то флаг (например, принятая длина буфера), который бы анализировался в некоем процессе, который, зная местоположение буфера, выбирал бы из него лежащие там данные и пользовал по своему усмотрению. Например, переписывал в рабочий (двойная буферизация), откуда посылал бы в I2S периферию или DAC. Это уже вопросы техники программирования, RTOS и т.п. С структурой буфера все более менее понятно. Не ясно как к ней обратится. Указатель на буфер(pClassData) находится в структуре: Код typedef struct _USBD_HandleTypeDef { uint8_t id; uint32_t dev_config; uint32_t dev_default_config; uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; USBD_EndpointTypeDef ep_in[15]; USBD_EndpointTypeDef ep_out[15]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; uint8_t dev_old_state; uint8_t dev_address; uint8_t dev_connection_status; uint8_t dev_test_mode; uint32_t dev_remote_wakeup;
USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; USBD_ClassTypeDef *pClass; void *pClassData; void *pUserData; void *pData; } USBD_HandleTypeDef; проблема в том что значение USBD_HandleTypeDef->pUserData в функции приёма данных принимает правильное значение, а если я вычитываю эту переменную в мэйне то значение не верное. Видимо из за динамической памяти. Ну да с этим разберусь. Проблема в другом. Пытаюсь сделать асинхонный аудио девайс клас. Для этого добавил эндпоинт для обратной связи. Подшаманил с дискриптором, всё завелось. В USBTrace всё время мелькает сообщение SYNC_RESET_PIPE_AND_CLEAR_STALL для эндпоинта обратной связи. В чём дело понять не могу.
Сообщение отредактировал maxis - Jun 11 2015, 12:24
|
|
|
|
Сообщений в этой теме
maxis STM32 Audio device class Jun 10 2015, 07:00 maxis По аналогии с примером виртуального ком порта сдел... Jun 12 2015, 17:19 ig_z QUOTE (maxis @ Jun 12 2015, 20:19) USBD_A... Jun 12 2015, 18:11  maxis Цитата(ig_z @ Jun 12 2015, 21:11) фидбек ... Jun 12 2015, 23:08 romanetz Посмотрите проекты sdr_widget и audio_widget. Все ... Jun 16 2015, 03:46 ig_z Цитата(romanetz @ Jun 16 2015, 06:46) Фиш... Jun 16 2015, 08:35 romanetz TIM2 имеет специальный режим измерения периода SOF... Jun 17 2015, 01:28 IgorKossak Зарождающуюся перепалку скрыл.
Модератор. Jun 17 2015, 18:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|