DUC-DDC Трансивер UA3REO: доработка кодека WM8731

Избавляемся от проблем с низкой частотой дискретизации.

В случае, если STM32 тактирует аудио-кодек, то появляется ошибка в формировании частоты дискретизации, и порой она бывает довольна существенна.

Снижение частоты сильно искажает голос при передаче и добавляет лишних помех при приёме.

Для исправления этой ситуации, необходимо, чтобы аудио-кодек тактовался от собственного кварцевого генератора.
К сожалению, на моей плате, купленной в aliexpress, он отсутствовал, но были площадки под установку.

В итоге был установлен кварц на 12мгц. Желательно использовать 12.288мгц или 18.432мгц, но у меня был только такой, отличаются только настройки передаваемые по I2C.

Также, были замкнуты выводы DAC_LRC_WS и ADC_LRC_WS, т.к. а STM32 это одна ножка (в случае Full-Duplex режима).

На I2C линии SDA и SCK установлены подтягивающие резисторы на 10кОм (на плате уже установлены, но другого номинала).

В дополнение, в коде доработан переход из режима приёма к передаче — ЦАП и АЦП отключаются если не используются, это даёт меньше помех и меньшее энергопотребление.

Файлы проекта доступны в репозитории.

9 мыслей о “DUC-DDC Трансивер UA3REO: доработка кодека WM8731”

    1. у меня отсутствие реакции решилось 3мя методами:
      1. заменой подтягивающих резисторов, уже установленных на плате на шинах SDA и SCK на 10кОм (к линии 3.3в), у меня были установлены меньшим номиналом и кодек не мог притянуть линию вниз.
      2. обязательной остановкой обмена I2S/DMA перед программированием через i2c.
      3. подбором оптимальных задержек/таймингов в wire.h

      1. Попробую отутюжить новую плату, но скорее всего кодек помер из-за плохой дорожки к одной из ног заземления. Резисторы ставил.
        К слову, в данном проекте принципиально использовать библиотеку wire, есть же свободные i2c на vet6 (у меня zet6)?

          1. Кодек подает признаки жизни ) Почему-то реагирует на адрес 0x1b вместо 0x34. Но все равно нормально трансивер не заработал пока с моим железом zet6 и ili9328: жуткое хрипение в наушниках и не прорисовываются некоторые элементы экрана.

        1. Отлично! поздравляю! сейчас тоже борюсь с хрипами и щелчками — есть подозрение что из-за рассинхрона частоты кодека с частотой выборок из FPGA происходят резкие перепады сигнала, что вызывает щелчки, пробую синхронизировать. Как-то плохо тактование I2S сделали в STM32, то вперед убегает, то наоборот.

          1. Никак не могу заставить кодек работать с этим проектом. Сейчас вот удалось подружить wm8731 и ардуино, звук выводится, а вот трансивер ну никак его видеть не хочет (хотя, пару раз какие-то хрипы были слышны). Судя по отладке, процесс зависает в процедуре i2c_get_ack в библиотеке wire на ожидании отклика от линии sda, буду пытаться настроить штатную i2c шину. Уже и еще одну микросхему заказал, думал — все погорели )

        2. Попробуйте подключить осциллограф, посмотреть что там на шине происходит, частоты там не особо высокие, любой китайский подойдёт. Главное чтобы 2-х канальный был, SDA и SCK одновременно смотреть.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *