|
STM32F407 + CS43L22, не работает как надо! |
|
|
|
Jan 9 2017, 08:55
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Есть многим знакомая платка STM32F4DISCOVERY. На ней есть I2S DAC CS43L22 Так вот выяснилось, что I2S модуль контроллера STM32F407 не может корректно работать с этим кодеком !!! Причина оказалась в том, что сигнал MCK у микроконтроллера начинает тикать только в момент передачи аудио выборок, то есть одновременно вместе с сигналами SCK, SD и WS !!! Отдельно запустить MCK в режиме free running нельзя !!! Но, в даташите на кодек CS43L22 явно указано, что частота MCK должна включаться заранее, а именно в момент инициализации, а отключаться только через опр. время после завершения передачи аудио данных!!! Оно конечно работает, звук играет и все такое, но я столкнулся со след проблемами которые не могу решить:
1) При воспроизведении самого первого аудио файла пропадает почти пол секунды из его начала !!! (я это связываю с тем, что так как частота MCK включается одновременно с поступлением данных, то кодек CS43L22 не сразу настраивается на эту частоту)
2) При окончании проигрывания слышен белый шум, на довольно сильной громкости, причем в одном канале громкость его существенно больше. (замечу что при проигрывании файла громкость одинаковая в обоих каналах). Этот шум не устраняется даже подачей команд MUTE, или уменьшением громкости, помогает только сброс ресетом и последующая переинициализация, что меня не устраивает !!!
Возникает вопрос, о чем думали разработчики когда ставили этот кодек на отладочную плату?
|
|
|
|
|
Jan 9 2017, 15:33
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Цитата(uriy @ Jan 9 2017, 18:10)  Я начал делать проект на этой плате мне нужен и микрофон и наушники. Но мне в первую очередь надо запустить USB HOST. Раньше я работал с кодеками AD73322 и SSM2603. Там уходило много времени после инициализации на заряд конденсатора с опорным напряжением.
1) В AD73322 и SSM2603 я намеренно отключаю подачу MCLK для экономии энергии и эффекта как у вас при включении не наблюдаю. Я еще не изучил CS43L22 но вижу на блок схеме charg pump. Возможно у вас нет звука именно пока заряжается кондер после инициализации. Свои кодеки я инициализирую сразу после подачи питания и больше этого не делаю.
2) На шине I2S при этом уже нет никаких данных? По первому пункту у меня пауза 250 мкс после иициализации, да еще я и отладчиком в этом месте останавливался, так что он бы успел зарядиться. Там в инициализации есть регистр тактироввания, там есть бит AUTO, он позволяет не указывать частоту MCK которая будет на него подана, а автоматически ее определять. Так вот у меня этот бит установлен, а так как частота появляется одновременно с данными, а не заранее, то видимо это время как раз тратится на это автоопределение частоты MCK А по второму пункту данных точно никаких нет, DMA выключен, блок I2S выключен. Там кстати есть еще аналоговый микшер, так вот я его тоже выключаю при инициализации. p/s микрофон у меня тоже задействован, но с ним проблем не возникло )
|
|
|
|
|
Jan 9 2017, 17:05
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
Цитата Once MCLK is valid, the quiescent voltage, VQ, and the internal voltage reference, FILT+, will begin powering up to normal operation. The charge pump slowly powers up and charges the capacitors. Power is then applied to the headphone amplifiers and switched-capacitor filters, and the analog/digital outputs enter a muted state. Once LRCK is valid, MCLK occurrences are counted over one LRCK period to determine the MCLK/LRCK frequency ratio and normal operation begins. Как я это понимаю. После подачи MCLK медленно заражаются кондеры в charge pump (время нигде не нашел). После этого аудивыходы переходят в muted. И только теперь анализируется частота MCLK и вероятно бит AUTO. Очень странное для меня поведение MCLK. В SSM2603 уходит около 100 мсек(!) на заряд кондера емкостью 10 мкФ. Цитата А по второму пункту данных точно никаких нет, DMA выключен, блок I2S выключен. А осцилом посмотреть? Как насчет таких вариантов: 1. Всегда гнать данные через I2S чтобы не пропадал сигнал MCLK. 2. Вместо MCLK задействовать выход таймера. На этом пине есть TIM8 и TIM3
|
|
|
|
|
Jan 9 2017, 19:03
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Цитата(uriy @ Jan 9 2017, 20:05)  А осцилом посмотреть? Я осциллом тоже смотрел. Попробую подать с таймера, посмотрю что изменится. Но у меня нет там таких емкостей, 1мкф максимум, да и полсекунды многовато на это. сегодня попробую, завтра напишу что получилось)
|
|
|
|
|
Jan 10 2017, 08:10
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Завел я частоту MCK с таймера, и как и ожидалось, сразу исчезла проблема пропадания начала проигрывания, и и при окончании проигрывания шумы тоже исчезли !!!!
НО, так как частоты MCK, SCK, LRCK должны биться, а у меня МСК идет от отдельного таймера, а SCK и LRCK от модуля I2S, то звук получился как из ж..ы!
Я предполагал что так будет, но зато проверил что действительно MCK надо подавать заранее а отключать с задержкой после окончания проигрывания!
Теперь вот думаю что надо переводить кодек в режим мастера, а микроконтроллер будет слэйвом, тогда кодек сам будет нарезать сигналы SCK и LRCK, правда выбор делителей MCK там какой-то мутный, возможно и не получится.
|
|
|
|
|
Jan 10 2017, 11:15
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
Цитата НО, так как частоты MCK, SCK, LRCK должны биться Откуда это следует? SCK и LRCK да будут синхронны. MCLK в упомянутом мною кодеке SSM2603 вовсе может поступать от кварцевого резонатора подключенного прямо к кодеку. Не думаю что нужна синхронная MCLK. Частота сэмплирования определяется сигналом LRCK. Цитата Я предполагал что так будет Не вижу в этом логики. 1. Какую частоту MCLK вы сделали? 2. На MCLK меандр с 50% заполнением? Цитата Теперь вот думаю что надо переводить кодек в режим мастера Я именно так и делаю. В хост контроллере включаю прерывания по приему данных через I2S и в этом же прерывании отправляю данные в кодек. Цитата правда выбор делителей MCK там какой-то мутный, Вроде в Table 1. Serial Port Clocking все понятно.
|
|
|
|
|
Jan 11 2017, 06:08
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Цитата(uriy @ Jan 10 2017, 17:42)  Разве такая низкая частота для MCLK допустима? Минимальное что я вижу в таблицах для настройки регистров это 6.1440 МГц. Также в даташите написано 7. Optimal PWM performance is achieved when MCLK > 12 MHz Сделайте 12МГц Выходит допустима, раз работает ) Во всяком случае модуль i2s микроконтроллера умеет выводить только частоту Fs*256, а Fs у меня 8 КГц Вот мастером сделаю кодек, тогда попробую 12Мгц
|
|
|
|
|
Jan 11 2017, 18:45
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Цитата(uriy @ Jan 11 2017, 14:58)  Как работает? Вы же сами сказали что звук как из ж. Эта частота должна использоваться в сигма-дельта модуляторе. Возможно из-за этого искажения звука. Просто поменяйте делитель таймера чтобы получить другую частоту на выходе и проверьте. Не, звук качественный когда все частоты генерит модуль i2s, а когда MCK я сам генерю таймером (это чтоб его заранее включать, чтобы начало файла не проглатывалось) то тогда звук уже искаженный, но файл теперь сначала воспроизводит
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|