В качестве хорошего теста попробуйте сделать прослушивание в наушниках того, что может потом на модулятор идти. От грубых ошибок здорово помогает. Заодно поймете что с необходимостью выравнивать sample rate с компьютером.
В качестве хорошего теста попробуйте сделать прослушивание в наушниках того, что может потом на модулятор идти. От грубых ошибок здорово помогает. Заодно поймете что с необходимостью выравнивать sample rate с компьютером.
Я когда отладкой занимался по этой части поступал проще - гонял вначале просто синус, потом зациклил всход с выходом, в смысле сигнал шел так:
комп - USB - девайс - USB - комп
Включил музыку (на компе) и послушал (в смысле то, что пришло обратно)
ИМХО, ее нужно выравнивать, если хочется что-то приличное сделать. Заодно вопросы с буферизацией очень просто решаются.Заодно поймете что с необходимостью выравнивать sample rate с компьютером.
Ага... когда замечаешь, что по пятому-шестому разу идет повторение полуторачасового концерта DM, который звучит как тестовый поток...
Евгений спасибо за платы! Всё получено в лучшем виде, упаковано на совесть! Комплектующие на подходе, будем собирать и запускать!
Спасибо от R3DI
Пробовал сделать USB_IN, ни как не соображу как сделать синхронизацию. Полностью углубляться в usb_audio нет времени, потому оставлю до лучших времен, ну или может где попадется готовое решение....
Запись с компа через usb_audio . ( вначале радио, затем тон 700Hz )
USB_in1.mp3
Судя по "песочку", который слышен на той части записи где тон, поток данных рвется или еще что-то не так.
Раз в миллисекунду вас спрашивают: есть что передать? отдавай все что накопил! Это можно делать не каждый раз, но то что уходит к хосту, должно без пропусков формироваться.
Покажите дамп USB дескрипторов. У меня размер данных для endpoint выбран с некоторым запасом, так что отвечаю ZLP где-то каждый десятый раз. При передаче звука передаю по 224 байта - вот и запас, если выбрать 192 может оказаться недостаточно полосы пропускания в компьютер для передачи звукового потока без разрывов. Через эту же endpoint передается и 2*24*96000.
зы: готовое решение - и дамп дескриптора для самостоятельного разбирательства выложен выше, и проект для copy & paste мой доступен.
Последний раз редактировалось Genadi Zawidowski; 21.07.2017 в 16:12.
Геннадий, вот он "песочек" на картинке...
У трх скорость выше , где то 48180.
Есть буфер COMPLEX_long DAC_buff[FFT_FILTER_SIZE] тот что в кодек идет, пока одна половина на DSP формируется, другая на кодек через DMA, и так чередуются...
Дальше вот такой костыль ....
Обновляю указатель который потом будет работать в USB (откуда из DAC_buff брать данные)
void DMA1_Stream7_IRQHand ler( void ){
if (DMA_GetFlagStatus(D MA1_Stream7, DMA_FLAG_TCIF7) != RESET) {
pUSB_INp = 0;
..............
}
if (DMA_GetFlagStatus(D MA1_Stream7, DMA_FLAG_HTIF7) != RESET) {
pUSB_INp = 1024;
..............
}
}
USB каждую 1мс забирает 48 слов - кодек сделает 48,18, а потому pUSB_INp обновляю еще и в так кодека, прерывание на ножку WS (48к)..
void EXTI15_10_IRQHandler (void)
pUSB_INp++;
И вот что в USB....
...............
if( (temp_usb < pUSB_INp)&&(pUSB_INp < 2000) )
temp_usb = pUSB_INp; // pUSB_INp уже убежал
for( int i=0; i<AUDIO_IN_PACKET/2; ++i ){
RecBuf0[i] = (DAC_buff[ temp_usb ].re);
temp_usb++;
if(temp_usb > 2047){
temp_usb = 0;
}
}
DCD_EP_Tx (pdev,AUDIO_IN_EP, (uint8_t*)(RecBuf0), AUDIO_IN_PACKET);
.............
Вот так и получается что pUSB_INp убегает на +1 примерно за 5/6 мс ( 1,8 за 10 / на 18 за 100 ).
PS. Надеюсь что понятно изъяснился , да и форум пробелы подчистил.
Спасибо от ua3ycv
Так а что мешает объявить скорость той что реально существует, как и буфер? Смотрю в код, это граблестрой какой-то... Я понимаю, что проект от Георгия унаследовал часть кода, но зачем стиль копировать?
Вот так я отдаю данные в компютер (USBD_LL_DataInStage ):
Код:case USBD_EP_AUDIO_IN & 0x7F: if (uacinaddr != 0) { global_disableIRQ(); release_dmabufferx(uacinaddr); global_enableIRQ(); } global_disableIRQ(); uacinaddr = getfilled_dmabufferx(& uacinsize); global_enableIRQ(); if (uacinaddr != 0) { USBD_LL_Transmit(pdev, USBD_EP_AUDIO_IN, (const uint8_t *) uacinaddr, uacinsize); } else { USBD_LL_Transmit(pdev, USBD_EP_AUDIO_IN, NULL, 0); } break;
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)