реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F407 и его I2S, STM32F407 + WM8731
Quasar
сообщение Dec 19 2016, 05:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Есть STM32F407, есть WM8731 со своим кварцем (то есть мастерклок приходит не от процессора). Хочу наладить обмен по I2S в режиме 8000 Гц 16 бит, но получается какая-то ерунда.

Если сделать процессор мастером, то звук ходит в обе стороны, но периодически появляются артефакты, так как у каждого своя синхра.
Если сделать кодек мастером, то работать вообще перестает, точнее прерывания от DMA начинают приходить в 12 раз чаще. Данный кодек, генерит BCLK равный 64x(base frequency, в данном случае 64x48000), то есть 3.072 МГц при любой частоте выдачи семплов. То есть, при переключении частоты семплирования, у него меняется только частота на L/RCK линии, и STM такое не переваривает, так как ждет 8000 * 16 * 2 = 256000 Гц;

Получается L/RCK у меня переключается как надо, с частотой 8000 Гц, а BCLK - 3.072 МГц (замерил осциллом).

Собственно у меня вопрос, для slave I2S'а в STM'е, приходящий битклок должен быть строго Fs x nof_bits x nof_channels или нет?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 19 2016, 10:14
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Смотрите части CODEC_TYPE_TLV320AIC23B_USE_8KS в данных исходниках

Цитата
Если сделать процессор мастером, то звук ходит в обе стороны, но периодически появляются артефакты, так как у каждого своя синхра.

Если процессор мастер, кодек должен быть слэйвом. И наоборот. Или оба слэйвы.
Когда ST32 slave, есть условия, когда надо запускать контроллер I2S (по определенному состоянию WS), чтобы не получить сдвиг битов с ошибкой.

Все исходники лежат тут https://188.134.5.254/browser/trunk

Цитата
Собственно у меня вопрос, для slave I2S'а в STM'е, приходящий битклок должен быть строго Fs x nof_bits x nof_channels или нет?

Разумеется.

Код
    // Из-за ограничений SPI/I2S контроллера на STM32 возможно
    // использовать только режим с MCLK=256*Fs
    // Внутренний делитель от MCLK до битовой синхронизации - /8
    // На MCLK ожидаем 12.288 МГц

#if CODEC_TYPE_TLV320AIC23B_USE_8KS

    // BCLK = 0.256 MHz (stereo, 16 bit/ch)
    tlv320aic23_setreg(TLV320AIC23_SRATE,            // Sample Rate Control
        3 * (1U << TLV320AIC23_SR_SHIFT) |    // BOSR = 0, SR[3:0] bits = 3: 12.288 / 256 / 6 = 8 kHz DAC and ADC sampling rate
        0 * (1U << TLV320AIC23_BOSR_SHIFT) |
        0    
        );    

#else /* CODEC_TYPE_TLV320AIC23B_USE_8KS */

    // BCLK = 1.536 MHz (stereo, 16 bit/ch)
    tlv320aic23_setreg(TLV320AIC23_SRATE,            // Sample Rate Control
        0 * (1U << TLV320AIC23_SR_SHIFT) |    // BOSR = 0, SR[3:0] bits = 0: 12.288 / 256 = 48 kHz DAC and ADC sampling rate
        0 * (1U << TLV320AIC23_BOSR_SHIFT) |
        0    
        );    

#endif /* CODEC_TYPE_TLV320AIC23B_USE_8KS */


Сообщение отредактировал Genadi Zawidowski - Dec 19 2016, 10:28
Прикрепленные файлы
Прикрепленный файл  tlv320aic23.zip ( 18.92 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 19 2016, 11:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Genadi Zawidowski @ Dec 19 2016, 13:14) *
Если процессор мастер, кодек должен быть слэйвом. И наоборот. Или оба слэйвы.


Это понятно, естественно я так и делаю, но я говорю не о сигналах синхронизации на шине, которые генерит мастер, а о клоке ядра кодека и I2S модуля процессора в режиме CPU-MASTER <-> CODEC-SLAVE. В том случае, когда процессор мастер, он забирает данные по такту от своей I2SPll. И даже если настроить Fs=8ksps на процессоре и на кодеке, все равно между ними будет незначительный разбег из-за того, что у каждого свой кварц. Ну то есть, АЦП будет семплировать со скоростью 7999 Гц, а процессор забирать по шине, на которой он мастер, ровно 8000 Гц.

Поэтому я и решил запустить это все в режиме CPU-SLAVE<->CODEC-MASTER. В таком режиме, I2SPLL не используется, и процессору пофиг на то, с какой скоростью в него поступают данные, он их просто в буфер скаладывает. Но, видимо в режиме slave у STM32 все очень плохо, мало того, что errata есть, так еще и он видимо не может работать в режиме когда bclk > FS x nof_bits x nof_channels.

Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 19 2016, 11:36
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



У меня так CPU-SLAVE<->CODEC-SLAVE всё работает, без pll...

Опишите подробнее что куда подается... У меня на кодек на вывод 25 всегда подается 12.288 МГц.

Сформированный из этой частоты набор сигналов WS, BCLK идет на выводы соотвестсвующих I2S процессора. 12.288 на процессор не идет - она там не требуется в случае SLAVE.

Сообщение отредактировал Genadi Zawidowski - Dec 19 2016, 11:42
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 19 2016, 12:26
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Genadi Zawidowski @ Dec 19 2016, 14:36) *
У меня так CPU-SLAVE<->CODEC-SLAVE всё работает, без pll...


А кто же мастер-то у вас?

Цитата(Genadi Zawidowski @ Dec 19 2016, 14:36) *
Сформированный из этой частоты набор сигналов WS, BCLK идет на выводы соотвестсвующих I2S процессора. 12.288 на процессор не идет - она там не требуется в случае SLAVE.


А кто их формирует и какая частота BCLK у вас?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 19 2016, 15:19
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Мастер у меня со стороны - FPGA формирует BCLK 256 кГц и WS 8 кГц. Но процессор об этом не знает. Вы комметарии посмотрели бы..

Сообщение отредактировал Genadi Zawidowski - Dec 19 2016, 15:19
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 19 2016, 15:47
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Genadi Zawidowski @ Dec 19 2016, 18:19) *
Мастер у меня со стороны - FPGA формирует BCLK 256 кГц и WS 8 кГц. Но процессор об этом не знает. Вы комметарии посмотрели бы..



Вы про это?

Код
    // BCLK = 0.256 MHz (stereo, 16 bit/ch)
    tlv320aic23_setreg(TLV320AIC23_SRATE,            // Sample Rate Control
        3 * (1U << TLV320AIC23_SR_SHIFT) |    // BOSR = 0, SR[3:0] bits = 3: 12.288 / 256 / 6 = 8 kHz DAC and ADC sampling rate
        0 * (1U << TLV320AIC23_BOSR_SHIFT) |
        0    
        );


В даташите на tlv320aic23 написано:

Цитата
In normal mode, BCLK = MCLK/4 for all sample rates except for 88.2 kHz and 96 kHz. For 88.2 kHz and 96 kHz sample rate,
BCLK = MCLK.


Тоже самое и для WM8731. А STM32 в режиме слейва плохеет от такого. У вас ПЛИС генерит BCLK = 0.256 MHz и формирует она это из клока, который используется и в кодеке. А сам кодек в режиме мастера генерит хрень, равную MCLK/4.

Или вы про какие-то другие комменты?


Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 19 2016, 16:18
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я не пробовал генерить кодеком... а с чего бы ему не выдать 8 кГц и 256 кГц?... Вы такое же программирование использовали?
Надо посмотреть... Как оно вообще может быть не по клоку на бит?

Сообщение отредактировал Genadi Zawidowski - Dec 19 2016, 16:28
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 19 2016, 16:28
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Genadi Zawidowski @ Dec 19 2016, 19:18) *
Я не пробовал генерить кодеком... а с чего бы ему не выдать 8 кГц и 256 кГц?... Вы такое же программирование использовали?


Ну вот чего в pdf'е на WN пишут:

Цитата
In Master mode, DACLRC and ADCLRC will be output with a 50:50 mark-space ratio with BCLK
output at 64 x base frequency (i.e. 48 kHz)


А base frequency определяется MCLK и BOSR битом. А в TLV320 я уже цитировал:

Цитата
In normal mode, BCLK = MCLK/4 for all sample rates except for 88.2 kHz and 96 kHz. For 88.2 kHz and 96 kHz sample rate,
BCLK = MCLK.


Оно вообще не зависит от Fs.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 19 2016, 16:35
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Вы проверяли, что оно на самом деле выдает при BOSR=0, SR=3? для 2*16

Сообщение отредактировал Genadi Zawidowski - Dec 19 2016, 16:35
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 19 2016, 16:48
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(Genadi Zawidowski @ Dec 19 2016, 19:35) *
Вы проверяли, что оно на самом деле выдает при BOSR=0, SR=3? для 2*16


Да. Оно выдает 3.072 МГц. В этом и проблема.

Вот пишут о том же:

https://e2e.ti.com/support/data_converters/...rs/f/64/t/99877
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 20 2016, 09:25
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Quasar @ Dec 19 2016, 07:13) *
Есть STM32F407, есть WM8731 со своим кварцем (то есть мастерклок приходит не от процессора).

Так может затактировать WM8731 от процессора, "забив" на наличие кварца у DAC'а?
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 21 2016, 07:27
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(KnightIgor @ Dec 20 2016, 12:25) *
Так может затактировать WM8731 от процессора, "забив" на наличие кварца у DAC'а?



Для этого, надо заводить мастер клок на WM от процессора (то есть плату переделывать). I2SPLL в STM32 умеет генерить его и выводить на ножку, но он строго Fs x 256. Для WM в режиме 8 кГц, это скорее всего окажется маловато. Только если вести работу в режиме 48 кГц. Тогда получается мастерклок нормальный - 12.288. Но в 48 кГц и в STM32 слейве нормально работается.

Вообще, у WM8731 есть режим DSP-mode, он очень похож на TI_MODE в STM32. Ножки даже те же используются, но информационные ноги меняют направление для режима TI_MODE slave в STM32, то есть опять плату переразводить.

Я в принципе нашел решение, в жертву пришлось принести ОЗУ (в три раза больше нужно) и в два раза чаще при таком решении вызывается DMA обработчик. Но связка работает в режим 8 кГц, WM master - STM32 slave.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 11:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016