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

Есть многим знакомая платка STM32F4DISCOVERY.

На ней есть I2S DAC CS43L22

Так вот выяснилось, что I2S модуль контроллера STM32F407 не может корректно работать с этим кодеком !!!

Причина оказалась в том, что сигнал MCK у микроконтроллера начинает тикать только в момент передачи аудио выборок, то есть одновременно вместе с сигналами SCK, SD и WS !!!

Отдельно запустить MCK в режиме free running нельзя !!!

Но, в даташите на кодек CS43L22 явно указано, что частота MCK должна включаться заранее, а именно в момент инициализации, а отключаться только через опр. время после завершения передачи аудио данных!!!

Оно конечно работает, звук играет и все такое, но я столкнулся со след проблемами которые не могу решить:

 

1) При воспроизведении самого первого аудио файла пропадает почти пол секунды из его начала !!!

(я это связываю с тем, что так как частота MCK включается одновременно с поступлением данных, то кодек CS43L22 не сразу настраивается на эту частоту)

 

2) При окончании проигрывания слышен белый шум, на довольно сильной громкости, причем в одном канале громкость его существенно больше. (замечу что при проигрывании файла громкость одинаковая в обоих каналах).

Этот шум не устраняется даже подачей команд MUTE, или уменьшением громкости, помогает только сброс ресетом и последующая переинициализация, что меня не устраивает !!!

 

Возникает вопрос, о чем думали разработчики когда ставили этот кодек на отладочную плату?

 

 

 

 

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


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

Я начал делать проект на этой плате мне нужен и микрофон и наушники. Но мне в первую очередь надо запустить USB HOST.

Раньше я работал с кодеками AD73322 и SSM2603.

Там уходило много времени после инициализации на заряд конденсатора с опорным напряжением.

 

1) В AD73322 и SSM2603 я намеренно отключаю подачу MCLK для экономии энергии и эффекта как у вас при включении не наблюдаю. Я еще не изучил CS43L22 но вижу на блок схеме charg pump. Возможно у вас нет звука именно пока заряжается кондер после инициализации. Свои кодеки я инициализирую сразу после подачи питания и больше этого не делаю.

 

2) На шине I2S при этом уже нет никаких данных?

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


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

Я начал делать проект на этой плате мне нужен и микрофон и наушники. Но мне в первую очередь надо запустить USB HOST.

Раньше я работал с кодеками AD73322 и SSM2603.

Там уходило много времени после инициализации на заряд конденсатора с опорным напряжением.

 

1) В AD73322 и SSM2603 я намеренно отключаю подачу MCLK для экономии энергии и эффекта как у вас при включении не наблюдаю. Я еще не изучил CS43L22 но вижу на блок схеме charg pump. Возможно у вас нет звука именно пока заряжается кондер после инициализации. Свои кодеки я инициализирую сразу после подачи питания и больше этого не делаю.

 

2) На шине I2S при этом уже нет никаких данных?

 

 

По первому пункту у меня пауза 250 мкс после иициализации, да еще я и отладчиком в этом месте останавливался, так что он бы успел зарядиться.

Там в инициализации есть регистр тактироввания, там есть бит AUTO, он позволяет не указывать частоту MCK которая будет на него подана, а автоматически ее определять. Так вот у меня этот бит установлен, а так как частота появляется одновременно с данными, а не заранее, то видимо это время как раз тратится на это автоопределение частоты MCK

 

А по второму пункту данных точно никаких нет, DMA выключен, блок I2S выключен.

Там кстати есть еще аналоговый микшер, так вот я его тоже выключаю при инициализации.

 

p/s микрофон у меня тоже задействован, но с ним проблем не возникло )

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


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

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

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


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

А осцилом посмотреть?

 

Я осциллом тоже смотрел.

Попробую подать с таймера, посмотрю что изменится.

Но у меня нет там таких емкостей, 1мкф максимум, да и полсекунды многовато на это.

сегодня попробую, завтра напишу что получилось)

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


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

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

и при окончании проигрывания шумы тоже исчезли !!!!

 

НО, так как частоты MCK, SCK, LRCK должны биться, а у меня МСК идет от отдельного таймера, а SCK и LRCK от модуля I2S,

то звук получился как из ж..ы!

 

Я предполагал что так будет, но зато проверил что действительно MCK надо подавать заранее а

отключать с задержкой после окончания проигрывания!

 

Теперь вот думаю что надо переводить кодек в режим мастера, а микроконтроллер будет слэйвом,

тогда кодек сам будет нарезать сигналы SCK и LRCK, правда выбор делителей MCK там какой-то мутный,

возможно и не получится.

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


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

НО, так как частоты MCK, SCK, LRCK должны биться
Откуда это следует? SCK и LRCK да будут синхронны. MCLK в упомянутом мною кодеке SSM2603 вовсе может поступать от кварцевого резонатора подключенного прямо к кодеку. Не думаю что нужна синхронная MCLK.

Частота сэмплирования определяется сигналом LRCK.

 

Я предполагал что так будет
Не вижу в этом логики.

1. Какую частоту MCLK вы сделали?

2. На MCLK меандр с 50% заполнением?

 

Теперь вот думаю что надо переводить кодек в режим мастера

Я именно так и делаю. В хост контроллере включаю прерывания по приему данных через I2S и в этом же прерывании отправляю данные в кодек.

 

правда выбор делителей MCK там какой-то мутный,

Вроде в Table 1. Serial Port Clocking все понятно.

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


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

MCK у меня 2048 Кгц (это когда I2S генерит)

 

Шим 50%, c таймера удалось сделать только 2048780 (84000000/41)

Тем не менее звук испорчен (очень хриплый что ли стал)

Поэтому и решил что частоты должны биться.

 

MCK не важно, это когда кодек мастер и сам генерит CK и RLCK, а у меня то слейв.

 

А в таблице напрягает что нет RATIO=32 для СK и RLCK, а только 64.

 

А у меня сейчас частота CK=256Кгц, а RLCK=8 Кгц так как данные у меня по 16 бит передаются для каждого канала

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


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

Разве такая низкая частота для MCLK допустима?

Минимальное что я вижу в таблицах для настройки регистров это 6.1440 МГц.

Также в даташите написано 7. Optimal PWM performance is achieved when MCLK > 12 MHz

Сделайте 12МГц

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


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

Разве такая низкая частота для MCLK допустима?

Минимальное что я вижу в таблицах для настройки регистров это 6.1440 МГц.

Также в даташите написано 7. Optimal PWM performance is achieved when MCLK > 12 MHz

Сделайте 12МГц

 

 

Выходит допустима, раз работает )

Во всяком случае модуль i2s микроконтроллера умеет выводить только частоту Fs*256, а Fs у меня 8 КГц

 

Вот мастером сделаю кодек, тогда попробую 12Мгц

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


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

Как работает? Вы же сами сказали что звук как из ж.

Эта частота должна использоваться в сигма-дельта модуляторе. Возможно из-за этого искажения звука.

Просто поменяйте делитель таймера чтобы получить другую частоту на выходе и проверьте.

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


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

Как работает? Вы же сами сказали что звук как из ж.

Эта частота должна использоваться в сигма-дельта модуляторе. Возможно из-за этого искажения звука.

Просто поменяйте делитель таймера чтобы получить другую частоту на выходе и проверьте.

 

 

Не, звук качественный когда все частоты генерит модуль i2s, а когда MCK я сам генерю таймером (это чтоб его заранее включать, чтобы начало файла не проглатывалось)

то тогда звук уже искаженный, но файл теперь сначала воспроизводит

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


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

Перевел вчера кодек в режим MASTER, а микроконтроллер в SLAVE.

 

Задал частоту MCK микроконтроллера 12.28 МГц через выход MCO2 (поигрался с настройкой PLL)

 

В итоге с кодека получил частоту LRCK равную 8KHz и частоту SCK равную 512KHz

 

Таким образом получил RATIO (SCK/LRCK)=64, но для этого надо передавать на кодек данные по 32 бита а не по 16,

поэтому переключил i2s модуль микроконтроллера в режим << LSB justified 16-bit extended to 32-bit packet frame with CPOL = 0 >>

а кодек переключил в режим Right-Justified Format и биты AWL поставил в единицы (Audio word length=16 bit)

 

В итоге звук стал нормальный, но опять сьелся начальный кусочек файла ). Но наверное это уже с DMA проблема, так как теперь постоянно присутствует клок SCK.

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


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

Все победил я этот кодек, звук нормальный, файлик проигрывает полностью.

Конечно в том виде как это было сделано в примере audio playback and record от MCD Application Team это было неработоспособно

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


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

Около полугода назад пробовал думаю этот пример. Запись на флешку с микрофона а потом воспроизведение.

У меня все отлично работало.

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


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

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

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

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

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

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

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

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

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

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