|
STM32F407 и его I2S, STM32F407 + WM8731 |
|
|
|
Dec 19 2016, 05:13
|

Местный
  
Группа: Свой
Сообщений: 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 или нет?
|
|
|
|
|
 |
Ответов
|
Dec 19 2016, 10:14
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 19 2016, 11:34
|

Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
Сообщений в этой теме
Quasar STM32F407 и его I2S Dec 19 2016, 05:13 Genadi Zawidowski У меня так CPU-SLAVE<->CODEC-SLAVE всё работ... Dec 19 2016, 11:36 Quasar Цитата(Genadi Zawidowski @ Dec 19 2016, 14... Dec 19 2016, 12:26 Genadi Zawidowski Мастер у меня со стороны - FPGA формирует BCLK 256... Dec 19 2016, 15:19 Quasar Цитата(Genadi Zawidowski @ Dec 19 2016, 18... Dec 19 2016, 15:47 Genadi Zawidowski Я не пробовал генерить кодеком... а с чего бы ему ... Dec 19 2016, 16:18 Quasar Цитата(Genadi Zawidowski @ Dec 19 2016, 19... Dec 19 2016, 16:28 Genadi Zawidowski Вы проверяли, что оно на самом деле выдает при BOS... Dec 19 2016, 16:35 Quasar Цитата(Genadi Zawidowski @ Dec 19 2016, 19... Dec 19 2016, 16:48 KnightIgor Цитата(Quasar @ Dec 19 2016, 07:13) Есть ... Dec 20 2016, 09:25 Quasar Цитата(KnightIgor @ Dec 20 2016, 12:25) Т... Dec 21 2016, 07:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|