leoniv (leoniv) wrote,
leoniv
leoniv

Category:

Сражение с I2S



Потратил половину субботы в сражении с шиной I2S. Как-то встретился на рынке очень дешевый 16-разрядный ЦАП TDA1543. Правда, кроме цены у него больше нет ничего примечательного: на постоянке он далек по точности от 16 бит, и самое главное, имеет очень неудобный интерфейс I2S.


Интерфейс I2S содержит линии данных и тактового сигнала, как и обычный SPI. Но вся проблема в сигнале WS, который должен переключаться во время передачи данных между битом 1 и битом 0. Сделать это довольно сложно, если используется аппаратный SPI. Раньше я уже использовал этот ЦАП, но только как одноканальный. Тогда было намного легче, во время загрузки второго канала можно было "хулиганить", чтобы корректно загружался только используемый канал. Попытка использовать оба канала сразу выявила серьезные проблемы.



Передачу данных инициировал в прерывании по совпадению. Второй канал совпадения задействовал на формирование сигнала WS. Первая проблема - interrupt latency, что вызывает не постоянную задержку при входе в обработчик прерывания. Читая текущее значение таймера, эту задержку можно скомпенсировать, если написать код, время выполнения которого зависит от параметра. В AVR Studio все получилось, но в железе, как обычно, не заработало.



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



Затем уже проверенным методом подбора нашел нужные значения регистра сравнения канала B для формирования в нужные моменты сигнала WS. В результате все получилось, оба канала генерируют синус. Вот так он выглядит на выходе ЦАП без фильтра:



А так на выходе фильтра:



А вот макетка с ЦАП и ОУ:



В итоге на контроллере ATmega88 на тактовой 20 МГц удалось получить частоту дискретизации 210 кГц при независимой генерации двух синусоидальных сигналов. Шаг сетки примерно 0.003 Гц (26-разрядный аккумулятор фазы), используется линейная интерполяция, что при размере таблицы всего 514 байт обеспечивает ошибку представления амплитуды не более 1 разряда 16-разрядного ЦАП. Правда, процессор загружен задачей генерации на 85%, да и регистров осталось очень мало, интерфейс пользователя непросто будет написать...
Subscribe

  • Эффект горячего шоколада

    Кофе я не люблю. Вернее, не так: он мне безразличен. Особого вкуса в нем не нахожу. С трудом могу отличить вкус кофе от вкуса какао. В детстве у…

  • Чипсы

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

  • Пост

    Пост про холодные закуски.

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments