Избавляемся от проблем с низкой частотой дискретизации.
В случае, если STM32 тактирует аудио-кодек, то появляется ошибка в формировании частоты дискретизации, и порой она бывает довольна существенна.
Снижение частоты сильно искажает голос при передаче и добавляет лишних помех при приёме.
Для исправления этой ситуации, необходимо, чтобы аудио-кодек тактовался от собственного кварцевого генератора.
К сожалению, на моей плате, купленной в aliexpress, он отсутствовал, но были площадки под установку.
В итоге был установлен кварц на 12мгц. Желательно использовать 12.288мгц или 18.432мгц, но у меня был только такой, отличаются только настройки передаваемые по I2C.
Также, были замкнуты выводы DAC_LRC_WS и ADC_LRC_WS, т.к. а STM32 это одна ножка (в случае Full-Duplex режима).
На I2C линии SDA и SCK установлены подтягивающие резисторы на 10кОм (на плате уже установлены, но другого номинала).
В дополнение, в коде доработан переход из режима приёма к передаче — ЦАП и АЦП отключаются если не используются, это даёт меньше помех и меньшее энергопотребление.
Файлы проекта доступны в репозитории.
Если кодек не реагирует на инициализацию по i2c, ему пришел каюк?
у меня отсутствие реакции решилось 3мя методами:
1. заменой подтягивающих резисторов, уже установленных на плате на шинах SDA и SCK на 10кОм (к линии 3.3в), у меня были установлены меньшим номиналом и кодек не мог притянуть линию вниз.
2. обязательной остановкой обмена I2S/DMA перед программированием через i2c.
3. подбором оптимальных задержек/таймингов в wire.h
Попробую отутюжить новую плату, но скорее всего кодек помер из-за плохой дорожки к одной из ног заземления. Резисторы ставил.
К слову, в данном проекте принципиально использовать библиотеку wire, есть же свободные i2c на vet6 (у меня zet6)?
Не принципиально, просто наткнулся на неё первой и «прижилась».
Кодек подает признаки жизни ) Почему-то реагирует на адрес 0x1b вместо 0x34. Но все равно нормально трансивер не заработал пока с моим железом zet6 и ili9328: жуткое хрипение в наушниках и не прорисовываются некоторые элементы экрана.
Отлично! поздравляю! сейчас тоже борюсь с хрипами и щелчками — есть подозрение что из-за рассинхрона частоты кодека с частотой выборок из FPGA происходят резкие перепады сигнала, что вызывает щелчки, пробую синхронизировать. Как-то плохо тактование I2S сделали в STM32, то вперед убегает, то наоборот.
Никак не могу заставить кодек работать с этим проектом. Сейчас вот удалось подружить wm8731 и ардуино, звук выводится, а вот трансивер ну никак его видеть не хочет (хотя, пару раз какие-то хрипы были слышны). Судя по отладке, процесс зависает в процедуре i2c_get_ack в библиотеке wire на ожидании отклика от линии sda, буду пытаться настроить штатную i2c шину. Уже и еще одну микросхему заказал, думал — все погорели )
Попробуйте подключить осциллограф, посмотреть что там на шине происходит, частоты там не особо высокие, любой китайский подойдёт. Главное чтобы 2-х канальный был, SDA и SCK одновременно смотреть.
И главное попробуйте — отключить все провода от кодека, кроме i2c и питания.