Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с кодеком WM8904
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Spider
Всем привет!

Пробую поладить с WM8904, но вот чего-то не выходит. Конфигурится она по i2c и с этим всё в порядке. У меня к ней подключен электретный микрофон по дифференциальной схеме на левый канал, а на правый я просто завёл линейку с компа - для тестов.
Внутри можно тупо пробросить сигналы от входов на аналоговые выходы практически без преобразований. Это получается на ура. Т.Е. я ТОЧНО правильно подключил входные сигналы и могу ими манипулировать. Так же точно работают аналоговые выходы.
Теперь пробую оцифровать её же средствами этот сигнал. В качестве мастера выступает STM32F103 с её I2S2 на 72MHz. WM8904 в качестве подчинённого
Частота выборки должна составить 8kHz, Stereo, 16bit на канал в формате i2s.
Реально с 8MHz кварцем получилось 8032 Hz. На логическом анализаторе видно, что Проц на отлично справляется с поставленной ему задачей, он генерит клоки и переключает каналы, но вот данных ему не присылают. Точнее всегда 0x0000. Попробовал "оторвать" дорожку A_DATA между процом и WM8904 и стало видно, что со стороны проца ножка PullUP, а вот кодек её прижимает к нолю. Опять же видно, что на канал 16 клоков.
Может кто поможет разобраться что я не так делаю? Может откровенно туплю?
Вот так я инициализирую WM8904:
Код
    audioWrite(0x04,0x0019); //POBCTRL=1, ISEL=10, STARTUP_BIAS_ENA=0, BIAS_ENA=1
    audioWrite(0x05,0x0043); //VMID_BUF_ENA=1, VMID_RES=01, VMID_ENA=1
    audioWrite(0x07,0x0001); //MICDET_THR=000, MICSHORT_THR=00, MICDET_ENA=0, MICBIAS_SEL=001
    audioWrite(0x06,0x0001); //MICBIAS_ENA=1
    audioWrite(0x0C,0x0003); //INL_ENA=1, INR_ENA=1
    audioWrite(0x12,0x0003); //DACL_ENA=0, DACR_ENA=0, ADCL_ENA=1, ADCR_ENA=1
    audioWrite(0x14,0x845E); //TOCLK_RATE_DIV16=0, TOCLK_RATE_X4=0, SR_MODE=0, MCLK_DIV=0 (Required for MMCs: SGY, KRT see erratum CE000546)
    audioWrite(0x15,0x0C00); //CLK_SYS_RAT=0011, SAMPLE_RATE=000
    audioWrite(0x19,0x0003); //AIF_WL=00, AIF_FMT=10
    audioWrite(0x26,0x0050); //ADC_HPF_C=10,  ADC_HPF=1
    audioWrite(0x2C,0x001F); //LINMUTE=0, LIN_VOL=11111
    audioWrite(0x2D,0x001F); //RINMUTE=0, RIN_VOL=11111
    audioWrite(0x2E,0x0052); //INL_CM_ENA=1, L_IP_SEL_N=01, L_IP_SEL_P=00, L_MODE=10
    audioWrite(0x2F,0x0010); //INL_CM_ENA=1, R_IP_SEL_N=01, R_IP_SEL_P=00, R_MODE=00
    audioWrite(0x7E,0x0020); //MCLK_PU=0, MCLK_PD=0, DACDAT_PU=1, DACDAT_PD=0, LRCLK_PU=1, LRCLK_PD=0, BCLK_PU=0, BCLK_PD=0
    audioWrite(0x16,0x0004); //CLK_SYS_ENA=1


Хелп sm.gif
Alex11
Проверьте для начала, откуда вырабатывается SYSCLK и какой частоты. Если соотношения частот неверные, может не работать.
Spider
Вот тут самое интересное для меня sm.gif
На 103 странице блок схема клоков. Меня там интересует вопрос выключателя CLK_DSP_ENA, как я понял он по умолчанию выключен. Нужен ли он, для оцифровки сигнала? Вроде как он тактует ADC. Нужен?
Далее, на следующей странице написано:
Цитата(WM8904)
If ADCL_ENA = 1 or ADCR_ENA = 1 then SYSCLK >= 256 x fs
Как я это понимаю, что при активации ADC нужно, чтобы SYSCLK был как минимум частота выборки * 256. т.е. если у меня 8kHz, то SYSCLK должен быть 2 048 000 Hz, вроде как STM32 так и делает:
Цитата(RM0008)
An additional pin could be used when a master clock output is needed for some external
audio devices:
● MCK: Master Clock (mapped separately) is used, when the I2S is configured in master
mode (and when the MCKOE bit in the SPI_I2SPR register is set), to output this
additional clock generated at a preconfigured frequency rate equal to 256 × FS, where
FS is the audio sampling frequency.

Далее в WM9804 описано, что CLK_SYS_ENA по умолчанию выключено, и я его включаю в конце настройки. Так же там же сказано, что MCLK_DIV = 0, т.е. без делителя. Так и оставляю.
Далее по мануалу CLK_SYS_RAT = 0011, что означает Selects the SYSCLK / fs ratio где 0011 = 256. Как бы это всё выглядит "корректным". SAMPLE_RATE я устанавливаю в 000, что означает 8kHz.
Ну и снова CLK_DSP_ENA = 0. Нужно его разрешать?

м?

Да. Надо было разрешить sm.gif
Но появился другой вопрос. Может быть не по теме...
Логический анализатор расшифровывает пакеты, но расшифровка не совпадает с моими предположениями. Вот к примеру:

почему 0x0041? Как?! Мне кажется что 0x0029.
Alex11
Вы хоть для начала напишите, как он у Вас физически подключен. Что на какие ножки подано. Там довольно много вариантов бывает.
По поводу анализатора- похоже, что Вы задали не ту полярность клока на анализаторе. На картинке он рисует начало данных по спаду клока (там, где синяя линия), а по спаду идет изменение данных. Что он там наловит - одному Богу известно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.