Форум Радиолюбителей

SAI протокол (Serial Audio Interface) stm32f429

36076 просмотров, 38 ответов — стр. 2 из 3

ra0ahcra0ahc
Сообщений: 4868
21 сентября 2020 г. в 05:47#16
Вот так работает!
Оказывается, пофиг что ссылка на массив (uint8_t *) , длина все-равно должна быть как (uint32_t) , хотя по логике должно быть FRAME_SIZE*4

HAL_SAI_Receive_DMA(&hsai_BlockB1, (uint8_t *) saiRxBank, FRAME_SIZE)

HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) saiTxBank, FRAME_SIZE)

ra0ahcra0ahc
Сообщений: 4868
21 сентября 2020 г. в 06:10#17
Передача с канала А в канал В 2кб
И прием тут же этих 2 кб в память, вообще практически не повлияло на скорость. Все взял ДМА на себя. То есть процессор практически не участвует в этом процессе.
Но это еще без FIR и АРУ и тд.
ra0ahcra0ahc
Сообщений: 4868
4 октября 2020 г. в 06:38#18
Все надо переделывать.
Надо чтобы не было разрывов в приеме и передачи. Так же как в ЦАП с Помощью Геннадия мы сделали.
ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:27#19
Пришлось все переделать.

Теперь так:
1.формирую сигнал в двух буферах последовательно с соблюдением фазы. Пока один буфер передается с помощь ДМА я заполняю втрой, потом меняюсь местами.
2.Передаю через SAI интерфейс блоки по 32бита (1 слот, со свободным протоколом).
3. Принимаю опять с помощью ДМА в два буфера по очереди.
4. После приема очередного буфера, обрабатываю его (3кГц FIR фильтр) и отправляю в свободный буфер ЦАП (тоже работает по системе 2 буферов).
5. ДМА отправляет по очереди буфер в ЦАП на выходе которого получается вот такой синал.

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:28#20
Из-за особенностей деления и умножения 8МГц кварца в процессоре получается ошибка. Должна быть палка на 1000Гц. Это связано с формированием тактового сигнала для SAI

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:35#21
Проблема была в синхронизации выхода на ЦАП и входа с SAI они упорно не сихронизировались. Максимум через 1 минуту происходила разсинхроницация и потеря одного блока. Звучит это в наушниках мерзко.
На фотке как раз момент разсинхронизации.

После долгих танцев с бубном я смог повесить внешнею синхронизацию на выход ЦАП. Теперь всё синхронизируется от выхода CLK SAI интерфейса.

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:40#22
Теперь сами настройки в CubeMX
настройки SAI
Да, и еще, там маркировка выходов попутана, либо у меня в голове бардак.

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:42#23
Теперь настройка DAC
кинут проводок физически между контактами. PG9 PE4 это как раз CLK от SAI

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:48#24
Теперь нафига всё так сложно.

Да просто процессор практически свободен от пересылок. Максимум он сейчас формирует бесконечную синусоиду, фильтрует фир фильтром и копирует буфер в буфер ЦАП. Т.е. все работает на прерываниях и как бы не был процессор занят он всегда будет сперва заниматься прерываниями (звуком) и только потом основным потоком программы. Основной поток может зависнуть, а звук всеравно будет ))

В это время основной процесс процессора считает ФФТ и выводит на экран панораму и водопад. И он их выводит на максимально возможной скорости (зависит только от прихода данных).
ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 03:51#25
Важный момент!
Сперва стартуем ЦАП потом SAi

//start DAC
if (HAL_DAC_Start_DMA_DBM(&hdac, DAC_CHANNEL_2, (uint32_t *) &pOutDac[0][0], (uint32_t *) &pOutDac[1][0],
FRAME_SIZE) != HAL_OK) {
Error_Handler();
}

HAL_Delay(1000);

//sai start
if (HAL_SAI_Transmit_DMA_DBM(&hsai_BlockA1, (uint8_t *) &saiTxBank[0][0], (uint8_t *) &saiTxBank[1][0],
FRAME_SIZE) != HAL_OK) {
Error_Handler();
}

if (HAL_SAI_Receive_DMA_DBM(&hsai_BlockB1, (uint8_t *) &saiRxBank[0][0], (uint8_t *) &saiRxBank[1][0],
FRAME_SIZE) != HAL_OK) {
Error_Handler();
}

ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 04:20#26
Итоговое фото


Игорь 2
Сообщений: 21288
5 октября 2020 г. в 07:44#27
Я не слежу особо за темой, а правильно я понимаю, что плата STM сейчас у Вас управляет какой-то штукой, на которой Вы, собственно, и делаете устройство обработки?
ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 08:10#28
Неа, это просто плата, я в ней смоделировал фактически всю цифровую, часть которая обычно идет с ПЛИС. Единственное, что я не могу смоделировать это полную работу двух приемников и панорамы, просто не хватает 256кБ памяти для реализации. Нужно 1мБ +++
Длина данных 2 приемника(I&Q) и панорамы (один сэмпл * 1024) 4*8*1024=32768 байт !!! и таких блоком нужно 8 шт в памяти. Поэтому могу только один приемник (I&Q) смоделировать это 4*2*1024 =8192 байт их вроде могу разместить в памяти. Просто в программ там целая куча блоков по 8 кб

Вот пример сколько массивов создается при старте. И это еще не все. Еще нужны блоки для АРУ и расчета FIR фильтра налету с учетом эквалайзера.
FRAME_SIZE=1024
float32_t - это 4 байта.

__IO float32_t p[FRAME_SIZE * 2];
__IO float32_t arr[FRAME_SIZE * 2];
__IO float32_t pFirOut[FRAME_SIZE];
__IO float32_t pOut[FRAME_SIZE];
__IO uint16_t pOutOld[FRAME_SIZE];
__IO uint32_t pOutDac[2][FRAME_SIZE];
__IO float32_t arrDac[FRAME_SIZE];
__IO float32_t firOutDac[FRAME_SIZE];

__IO float32_t win[FRAME_SIZE];
__IO float32_t pMag[FRAME_SIZE];

float32_t saiRxBank[2][FRAME_SIZE];
float32_t saiTxBank[2][FRAME_SIZE];

float32_t firStateF32[FRAME_SIZE + SAMPLEFILTER_TAP_NUM - 1];
float32_t firStateF32dac[FRAME_SIZE + SAMPLEFILTER_TAP_NUM - 1];
float32_t firStateF32sai[FRAME_SIZE + SAMPLEFILTER_TAP_NUM - 1];
VA7KLVA7KL
Сообщений: 158
5 октября 2020 г. в 08:59#29
не хватает 256кБ памяти для реализации. Нужно 1мБ +++

А 2 Мб STM32H747 хватит? Я правда SAI не развел, только АЦП и ЦАПы, и ДДС.
Вы Демо-board используете?
ra0ahcra0ahc
Сообщений: 4868
5 октября 2020 г. в 09:05#30
Хватит однозначно, но без sai не передать панораму с плис. Там у меня есть возможность передать сразу 8 слотов , на 7 ке там вроде больше да и самих каналов там 4 шт у меня 2 всего.
Тема оказалась более чем интересная.