Перейти к содержанию
    

STM32F407 и его I2S

Есть 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 или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите части 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 */

tlv320aic23.zip

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если процессор мастер, кодек должен быть слэйвом. И наоборот. Или оба слэйвы.

 

Это понятно, естественно я так и делаю, но я говорю не о сигналах синхронизации на шине, которые генерит мастер, а о клоке ядра кодека и 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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

А кто их формирует и какая частота BCLK у вас?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мастер у меня со стороны - 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.

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Надо посмотреть... Как оно вообще может быть не по клоку на бит?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не пробовал генерить кодеком... а с чего бы ему не выдать 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

https://e2e.ti.com/support/data_converters/...rs/f/64/t/99877

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть STM32F407, есть WM8731 со своим кварцем (то есть мастерклок приходит не от процессора).

Так может затактировать WM8731 от процессора, "забив" на наличие кварца у DAC'а?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так может затактировать 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...