Как стать автором
Обновить

Чип AudioСodec(а) WM8731 (или (ADC/DAC)*2 из iPod(а))

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров6.5K

Существует очень милый 28-пиновый чип WM8731 компании Wolfson. Это стерео аудиокодек или однокристальная звуковая карта. В сущности 2 пары ADC/DAC на 24бит каждый с настраиваемой по I2C/I2S частотой дискретизации 8kHz...96kHz ролью на I2S шине и пр. Он знаменит тем, что его в свое время заложили в культовую отладочную плату с FPGA Altera-DE1 и чип WM8731 стал знаменит во всех технических вузах мира. Также аудиокодеки компании Wolfson стояли в Apple iPod(ах). Посмотрим на что способен чипок WM8731.

Внимание!

C аудиокодеками надо работать с особой осторожностью так как при неправильной конфигурации I2C регистров внутри прошивки, микросхема DAC может сильным звуком контузить программиста! Никогда не надевайте наушники, если вы не уверенны в том, что сейчас будет нормальный звук.

В этом тексте я напишу о своем опыте работы с чипом WM8731, частично восполню нехватку документации на китайскую плату с ним и скажу решения основных сбоев с WM8731.

Итак, что надо из оборудования?

Оборудование

Количество

Назначение

ALINX WM8731

1

Для воспроизведения и записи звука

Зажимы Wago

6+

Для подключения логического анализатора к шине I2S

Микроскоп

1

Чтобы проследить путь дорожек на PCB так как документации на отладочную плату нет

Пластиковые стойки

10+

для установки плат на макете

Органическое стекло площадью A3

1

Работать приходится не в невесомости. Чтобы провода не оторвались от провисания надо жестко закрепить платы на общей подложке

LapTop

1

Для программирования плат

Перемычки вилка-вилка

n

Для соединения плат между собой

Микроконтроллер

1

Для конфигурирования кодеке по I2C

Логический анализатор

1

Для наблюдения за работой аудиокодека

Наушники

1

Для воспроизведения звука

сверлильные принадлежности: кернер, сверла 2,5; 3; 6;мм ручная дрель, аккумулятор

+++

Для изготовления подложки из оргстекла для закрепления нескольких плат на общей основе. Это нужно чтобы исключить натяжение и обрыв слабеньких проводов-перемычек.

Микрофон

1

Для тестирования звуко-излучателя в режиме Side Tone

Вот блок схема SoC WM8731

или такая более подробная:


А так чип выглядит в реальной жизни:

Расcпиновка чипа WM8731
Расcпиновка чипа WM8731

Для чипа существует весьма удобная отладочная плата. Называется ALINX AN831 c WM8731 на борту. Вот так она выглядит:

ALINX
ALINX

Габариты отладочной платы ALINX AN831:

Вот блок-схема платы ALINX AN831:

Распиновку пришлось восстанавливать по внешним признакам. Тут помог микроскоп, чтобы проследить путь дорожек на PCB от чипа U11 к основному разъёму J3.

Сразу хочу отметить, что при макетировании особенно прочно надо закрепить провод управления частоты дискретизации LRC. Так как если он по каким-то причинам отвалится, то вы в наушниках услышите крайне невыносимый скрежет.

Также доступна еще одна отладочная плата с чипом WM8731

Вот такой я собрал прототип для тестирования кодека. Пришлось вырезать на CO2 лазере этажерку из плексигласа для навесного монтирования модуля с wm8731. В качестве отладочной платы взял AT-START-F437 V1.0

прототип диктофона
прототип диктофона

Программная часть

Вот так выглядит чип на шине I2C

У wm8731 очень компактный набор регистров. Это всего 11 9ти битных регистров чипа WM8731. Совсем немного конфигов.

Вы спросите где взять драйвер для чипа WM8731? А вот где. Есть 3 варианта.

1--Достать из сорцов ОС Zephyr RTOS

2--извлечь из состава ядра Linux https://elixir.bootlin.com/linux/latest/source/sound/soc/codecs/wm8731.c

3--Выбрать драйвер на github.com

Вот такой я собрал макет для отладки аудио прошивок.

Первая проблема с которой я столкнулся это то, что чип WM8731 не заработал после инициализации. Я специально в инициализации поставил режим side tone. Это режим аналогового слухового аппарата. Однако ничего не произошло. Забегая вперед скажу, что в этом чипе прочитать регистры нельзя. Понять, что произошло чисто програмно не выйдет. Однако тут мне помог логический анализатор Saleae. На осциллограмме было видно, что MCU просто прописывал не тот I2C адрес. Я поставил адрес 0x1A и side tone включился. Чудно. До регистров достучались.

Если что-то не работает, то без осциллографа или логического анализатора тут ну никак не обойтись. Вот разбор образцовой I2C осциллограммы (записи регистра 0). Как видно чип WM8731 послушно отзывается на адрес 0x1A. Ок. двигаемся дальше.

(
(

Фаза 2. Как проверить, что работает цифровой тракт? Для проверки аудио тракта я обычно воспроизвожу синус. Его очень просто расcчитать прямо на MCU(шке). Достаточно циклически отправлять всего пары периодов. Инициирую генерацию синуса прямо в RunTime из-под Debug CLI Terminal поверх UART.

Логический анализатор Seleae(сало) показывает, что на проводах Right и Left Headphone период равен 1ms значит частота 1kHz. Успех! Его же можно послушать на наушниках. Всё работает:

Также можно проверить правильность воспроизведения синуса мобильным приложением Spectroid. Приложение строит график зависимости амплитуды сигнала от частот (Фурье преобразование в частотной области). Вот тут видно как наушники воспроизводят синус на частоте точно 2kHz.

Проверка записи звука.

Что ж, воспроизводить звук научились. Теперь надо попробовать записать звук. Как в случае с воспроизведением записывать будем тоже синус. Для этого я установил на свой смартфон мобильное приложение Simple tone generator.

Я сконфигурировал приложение на воспроизведение синуса с частотой 1000 Hz и поднес телефон к петличному микрофону, который подключен в розовый Audio Jack.

Теперь аудио кодек надо переключить в режим приёма. Активировать усилитель сигнала с микрофона. Перевести стрелки мультиплексора на микрофон. Включить внутренний цифровой фильтр высоких частот, убрать DC смещение. Для самопроверки аналоговой части включить SideTone. Вот по такому пути проходит звук .

Я я записал первые триста 16-битных I2S семплов на частоте 48kHz. Получился аудиофайл 6.25 ms

Как понять что это в самом деле корректные данные? Один из наивных способов это вручную взять и построить график сигнала во временной области. Вот благодаря этому Python скрипту можно построить график сырых ADC (4я колонка) отсчетов от времени (1я колонка).

import matplotlib.pyplot as plt
import csv
import sys

F_adc_hz = 48000.0

t_sample = 1.0/F_adc_hz
X = []
Y = []
corr = []

file_name=sys.argv[1] 
 

with open(file_name, 'r') as datafile:
    plotting = csv.reader(datafile, delimiter='|')
    for ROWS in plotting:
        X.append(float(ROWS[1])*t_sample)
        #X.append('{} {}'.format(ROWS[3], ROWS[4]))
        Y.append(float(ROWS[4]))

print ('X {} Nums'.format(len(X)))
print ('Y {} Nums'.format(len(Y)))
 

print ('Type X {} '.format(type(X)))
print ('Type Y {} '.format(type(Y)))


plt.plot(X, Y,label="ADC")
plt.legend(loc='best')

file_name = file_name.replace('.', '_')

plt.title('{}'.format(file_name))
plt.xticks(rotation=-90)
plt.xlabel('Time,[s]')
plt.ylabel('ADC, [sample]')
#plt.grid()

plt.savefig('{}.png'.format(file_name))
plt.show()

Как видно на графике, как раз прослеживается сигнал ч частотой 1kHz+/- 13Hz. Измеряем от гребня до гребня.

Или вот второй вариант, попроще. Просто вычислить дискретное преобразование Фурье, найти максимум и, тем самым, найти частоту сигнала.

/*
 * See https://ru.dsplib.org/content/dft/dft.html
 */
bool dft_calc(const SampleType_t* const signal, 
              uint32_t n_big, 
              double complex* const dft_out, 
              uint32_t out_len,
              double t_big) {
    bool res = false;
    uint32_t start_ms = time_get_ms32();
    double measure_interval_s = ((double)n_big) * t_big;
    LOG_INFO(DFT, "N:%u Sam,Order:%u,Ts:%f s,T:%f s", n_big, 
             out_len, t_big, measure_interval_s);
    if(signal) {
        if(dft_out) {
            res = true;
            uint32_t k = 0;
            double cur_freq_hz = 0.0;
            for(k = 0; k < n_big; k++) {
                cur_freq_hz = ((double)k) / measure_interval_s;
                dft_out[k] = 0.0 + 0.0 * I;
                uint32_t n = 0;
                for(n = 0; n < n_big; n++) {
                    dft_out[k] += ((double)signal[n]) * (cos(TWO_PI_VAL * ((double)k * n) / ((double)n_big)) -
                                                         sin(TWO_PI_VAL * ((double)k * n) / ((double)n_big)) * I);
                }
                // dft_out[k] *= 1.0 / ( ( (double)n_big )  * (measure_interval_s));

                dft_out[k] = 2.0 * dft_out[k] / ((double)n_big);
                LOG_DEBUG(DFT, "%u,Freq:%f Hz,(%6.3f)+j*(%6.3f)",
                          k, cur_freq_hz, creal(dft_out[k]),
                          cimag(dft_out[k]));
            }
        }else{
        	LOG_ERROR(DFT,"ResErr");
        }
    }else{
    	LOG_ERROR(DFT,"SignalErr");
    }
    uint32_t duration_ms = time_calc_duration_ms(start_ms);
    LOG_INFO(DFT, "CalcDuration:%u ms=%f s", 
             duration_ms, MSEC_2_SEC(duration_ms));
    return res;
}

Вот сам микроконтроллер смог определить частоту сигнала с погрешностью в 40 Hz. Чем выше будет частота сигнала тем ниже погрешность её определения.

Всё происходит полностью автоматически.

Как отлаживать кодек?

В один прекрасный день вы столкнетесь с тем, что аудио система не работает. Как выявить источник неисправности? Прежде всего можно проверить сам Audio Codec. Можно взять джампер и соединить пины ADDAC и DADAT. Таким образом получится полностью I2S цифровое эхо. Бит в бит. Можно попробовать сказать что-н в микрофон и одновременно слушать наушники. Если конфиг в кодеке исправен, то вы услышите то, что сказали в реальном времени. Если нет то ищите ошибку в конфиге I2C ячеек.

Типичные проблемы при работе с DAC чипом WM8731:

Проблема

Решение

1

звук приходящий с I2S хрипящий и бубнящий. Как будто кто-то говорит в трубу диаметром 70мм.

проверить контакты. I2S провода DATA WS CLK должны быть очень жесткими. Частоты бешеные. По 3 MHz. Любой дребезг искажает значения PCM семплов

2

Появился скрежет

Закрепить прочнее провод WS. Лучше припаять.

3

Не применяются конфиги. Init не отработал.

Проверить осциллографом адрес I2C чипа прямо в шине I2C. Не должно быть I2S тактирования во время записи регистров I2C.

4

В режиме I2S-LoopBack на левом канале трескотня как от счетчика Гейгера. Одновременно на правом канале нет трескотни. На другом экземпляре WM8731 такая же трескотня.

Сделать Disable High Pass Filter. Трескотня исчезнет.

Недостаток чипа WM8731

1--I2C не поддерживает чтение регистров. Это очень плохо. Нельзя делать диагностику и авто тесты. Об этом даже прямо в спеке прописано.

2-- I2C регистры надо инициализировать без тактирования на шине I2S. Иначе ASIC зависает. Приходится пере сбрасывать питание и заново конфигурить I2C регистры. Например, если устанавливать громкость звука раз в 2 секунды, то спустя пару минут зависнет его контроллер I2C. У аудиокодека WM8731 при работающем тактировании на I2S_WS не получается инициализация регистров по I2c. Вот такие вот пирожки с капустой...

3--Нет пина Reset.

Достоинства чипа WM8731

1--Простота чипа WM8731. У него внутри всего-навсего одиннадцать 9-битных регистров (99 битиков) конфигурации. Это ни о чем в сравнении с современными аудиокодеками такими как CS47L63 у которого 936 регистров по 32 bit каждый (29952 бит). Чип WM8731 в 302 раза проще CS47L63 (современных кодеков).

2--Малые габариты отладочной платы Alinx.

3--Дешевизна. Отладка всего за 1450 RUR.

Идеи проектов на WM8731 или любом другом аудио-кодеке

Простые аудио проекты:

1--Диктофон.

2--Плейер Wav файлов.

3--Электронный камертон для пианистов.

4--Стенд для тестирования наушников.

5--Караоке. Чип может усиливать аналоговый сигнал от микрофона.

6--Слуховой аппарат. Всё тот же sidetone режим.

7--Двухканальный осциллограф на основе LineIn входов

8--Генератор сигналов на основе LineOut выходов

9--На основе аудиокодека можно сделать медицинский прибор для измерения пульса - стетоскоп. Надо всего лишь записать звук, вычислить DFT и найти максимум.

Сложные аудио проекты:

1--Звуковая локализация. Входы LineIn можно использовать как 2 независимых микрофона. Это значит, что можно вычислять корреляцию 2х сигналов и выявлять угол направления прихода звуковой волны (AngleOfArrival). У меня получалось +-5 градусов. Это может пригодится для ориентации поворотных видеокамер или для выявления источника стрельбы.

2--Звуковые эффекты: Эхо, дисторшн. Так как можно считывать и воспроизводить звук в цифровом виде, то тут можно по-разному экспериментировать с синтезом разнообразных цифровых фильтров или изучать их используя реальных звук в real-time.

3--Звуковой сонар для определения расстояния до препятствия.

4--Передача и прем бинарных данных по звуку. Беспроводной аудио интерфейс. Можно написать DeskTop утилиту, которая будет воспроизводить файлы и через провод AudioJack переливать файлы в AudioFlash(ку). И никакой детектор USB трафика этого не заметит. Или сделать обновление прошивки по звуку. Надо лишь понять какая нужна модуляция.

Вывод

WM8731 чип очень доступный. Однако я бы не рекомендовал чип WM8731 для применения в новых серьезных проектах так как отсутствие поддержки чтения регистров не позволит делать надежные и безопасные устройства и присутствующие ему зависания будут мешать. Это кодек подойдет разве что только для прототипов и тестовой оснастки. Отладочная плата может быть очень полезна для тех случаев, если надо быстро воспроизвести или записать звук. Плюс WM8731 только в малых габаритах платы и простоте.

Также хочу отметить, что отладка аудиоустройств с помощью прокидывания синус функции через поток PCM семплов и осциллографа показала хорошую эффективность. При помощи синуса можно отловить такие баги как потеря непрерывности потока, выявить источники искажений и рассинхронизацию по времени.

Quiz

--Какой модульный автотест можно написать, чтобы проверить корректность работы I2S?

--Какой модульный автотест можно написать, чтобы проверить корректность работы I2С?

--Как можно отладить драйвер I2S когда он работает в режиме I2S loopback?

--Что такое De-emphasis?

Links

Сообщество EasyElectronics.ru

Audio codec -- Floating point hardware

https://aliexpress.ru/item/1005003684342776.html?spm=a2g2w.orderdetail.0.0.5cd54aa6vXGiI5&sku_id=12000026793736515

Обзор Aппаратного Aудио Кодека MAX9860 https://habr.com/ru/articles/729622/

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с чипом WM8731?
8.16% да4
91.84% нет45
Проголосовали 49 пользователей. Воздержались 5 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с другими чипами аудио кодеков?
43.48% да20
56.52% нет26
Проголосовали 46 пользователей. Воздержались 6 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с интерфейсом I2S?
70.45% да31
29.55% нет13
Проголосовали 44 пользователя. Воздержались 8 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с интерфейсом I2C?
95.56% да43
4.44% нет2
Проголосовали 45 пользователей. Воздержались 8 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У вас был iPod?
0% да0
100% нет3
Проголосовали 3 пользователя. Воздержавшихся нет.
Теги:
Хабы:
Всего голосов 12: ↑10 и ↓2+12
Комментарии11

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн