реклама на сайте
подробности

 
 
> Помогите разобраться с кодеком WM8904, Не могу вывести сигнал на i2s
Spider
сообщение Nov 9 2012, 08:54
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Всем привет!

Пробую поладить с 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Alex11
сообщение Nov 9 2012, 23:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Проверьте для начала, откуда вырабатывается SYSCLK и какой частоты. Если соотношения частот неверные, может не работать.
Go to the top of the page
 
+Quote Post
Spider
сообщение Nov 10 2012, 06:37
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Вот тут самое интересное для меня 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.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Nov 10 2012, 10:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Вы хоть для начала напишите, как он у Вас физически подключен. Что на какие ножки подано. Там довольно много вариантов бывает.
По поводу анализатора- похоже, что Вы задали не ту полярность клока на анализаторе. На картинке он рисует начало данных по спаду клока (там, где синяя линия), а по спаду идет изменение данных. Что он там наловит - одному Богу известно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016