Обзор Aудио Кодека NAU8814YG

Пролог

NAU8814YG это 24 битный аудио кодек от тайваньской компании Nuvoton Technology в 24-пиновом QFN корпусе с управлением по I2C (либо SPI). В случае управления по I2C чип отзывается на адрес 0×1A.

Вот так выглядит NAU8814YG в натуре

Вот так выглядит NAU8814YG в натуре

Компания Nuvoton Technology известна тем, что другой её аудиокодек NAU88C22 был заложен в культовый SDR приёмник Малахит DSP3.

У меня уже были обзоры других аудиокодеков: WM8731 иMAX9860. Обзор Aппаратного Aудио кодека MAX9860 (2x ADC+DAC) https://habr.com/ru/articles/758140/ Чип AudioСodec (а) WM8731 (или (ADC/DAC)*2 из iPod (а)) https://habr.com/ru/articles/703588/


Теория

Для понимания спек по аудиокодекам надо быть знакомым с этими понятиями:

аудио кодек — это цифро аналоговое устройство, где есть пара ADC + DAC. На входе обычно есть сумматор на операционных усилителях для подмешивания аналогово сигнала с разных проводов, есть еще аналоговый инвертор, усилитель (boost). Число провод на основе I2S (или TDM) и интерфейс I2C для того чтобы всем этим добром управлять.

Notch filter — это тип режекторного фильтра (band stop). Это такой фильтр который уменьшает амплитуды в пределах специфического диапазона частот и пропускает все остальные частоты. У notch фильтров этот диапазон частот очень узкий.

b49921b8a6b1df0cc26ee36cad6c8bd9.png

Attack time — это продолжительность времени, которое нужно аудиосигналу чтобы достигнуть максимальной амплитуды после срабатывания. Время между моментом, когда сигнал на входе устройства превышает порог активации устройства, и моментом, когда устройство реагирует определенным образом на вход.

Аппаратная часть

В первом приближении микросхему NAU8814YG можно рассмотреть вот так. Просто коробочка у которой есть входы и выходы.

4c3e470638d6ee95d804d348130fb5d6.png

Расспиновка чипа такая.

297b2664a3a1c6b3757fc5e41d51e975.png

На минус втором уровне абстракции так

32a7bbdc546c69dc9a9d316066a8e27d.png

На минус третьем уровне абстракции то, что под капотом NAU8814 выглядит так

d4245eaa3a0e156e187a3065f287291d.png


Это референс схемотехника

7fc5b20c0b532cf7e7178d48fcd26aa8.png

Так как чип управляется по I2C вспомним основные моменты по I2C

98dbd66e67681e1adf107b09b4ef14b2.png

Аналогично про I2S.

dd993691bd72d595bf6d7d5988e27133.png

Как отлаживать NAU8814?

Любая разработка начинается только тогда, когда появляются полноценные средства для отладки. В чипе NAU8814 заложено три механизма для отладки:

1--Вы можете читать регистры I2C. Так можно контролировать корректность записи.

2--У аудиокодека NAU8814 есть цифровой выходной пин 12 SPKCSb/GPIO (SPI Chip Select or General Purposes I/O). Им можно отлаживать внутренние подсистемы аудиокодека: PLL, Audio Jack.

3--Для отладки режимов работы есть специальный аналоговый пин MOUT (пин 16). На него вы можете вывести любой сигнал.

Источник данных

Конфиг

MIC

BYPMOUT=1

DAC

DACMOUT=1

AUX

AUXMOUT=1

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

Первым делом просканируем шину I2C и посмотрим кто там живёт…

83becb666fd84a7e0d6636f340caf681.png

Тут ASICу NAU8814YG посвящаются два I2C адреса: 0×34 и 0×35.

hex

bin

Пояснение

0×34

0011_0100

адрес для записи

0×35

0011_0101

адрес для чтение

Вот и получается, что настоящий адрес устройства это 0011_010 = 0001_1010 = 0×1A.

Чтение регистра с подвохом. Надо адресу вставлять вправо один младший нулевой dummy бит.

2c48fa2c5ef3a16c5ba2b279d539671c.png

Запись

Запись совсем простая. Отправить 3 байта по I2C.

bea9db907eab14a876ba4ae3fccd52b2.png

Удалось вычитать значения внутренних 9-битных регистров ASIC NAU8814

630b376d8f6c8d0160f5b578d32ba2b1.png

продолжение

efd5a23defc2ad67cd2e4569e17a510a.png

Как видно регистр SILICON_REVISION на самом деле нулевой. Это несоответствие со спецификацией. Там обещали значение 0xEE.

Настройка PLL

Как и всё в цифровой электронике, для того чтобы заработали ADC и DAC на их надо подать тактирование. В той плате, где у меня установлен NAU8814 тактирование приходит не от кварцевого генератора, а от микроконтроллера. Провод MCLK припаян к пину с PWM функцией от аппаратного таймера. Поэтому мне пришлось предварительно написать драйвер аппаратного таймера и генератора PWM. Вот так, в частности, можно сконфигурировать контур PLL, чтобы на АЦП и ЦАП поступило тактирование.

be20efd81b19bb544aea0555358906d2.png

Для контроля настроек PLL надо как раз воспользоваться отладочным пином CSd/GPIO. Я вывел «на улицу» частоту PLL и увидел частоту 3.25 MHz. Это значит что перед делителем частота PLL равна 13 MHz.

Частота сигнала на CSb/GPIO = 3.25 MHz

Частота сигнала на CSb/GPIO = 3.25 MHz

Это как раз совпадает с расчётными run-time значениями в прошивке.

6a19f27b6232e7b11416e6da74bfa376.png

Успех!

Воспроизведение звука

Для того чтобы переключить ASIC в режим воспроизведения звука надо прописать конфиги вот как чтобы данные пошли по красному тракту.

38183d5b9a5ff571bf842723eda81ce4.png

Я создал в коде массив uint16_t семплов (96 элементов), рассчитал в элементы массива значения синуса

0c7fe95eb875a8ea98708621640e9a5c.png

и воспроизвел на I2S этот массив. В результате осциллографом я увидел сигнал на пине MOUT.

f1dc08e43d0fece58f186f7d994b094f.JPG

Отлично! Значит, что всё понято правильно.

Значения I2C регистров при которых есть звук на SPK и MOUT

18:58-->nau8814_map
±----±-----±-----±-------±--------------------±--------------------+
| No |addrD |addrH | val | val [bin] | name |
±----±-----±-----±-------±--------------------±--------------------+
| 0×0 | 0×00 | 0×0000 | 0000_0000_0000_0000 | SOFTWARE_RESET |
| 1×1 | 0×01 | 0×013d | 0000_0001_0011_1101 | POWER_MANAGEMENT_1 |
| 2×2 | 0×02 | 0×0015 | 0000_0000_0001_0101 | POWER_MANAGEMENT_2 |
| 3×3 | 0×03 | 0×00ed | 0000_0000_1110_1101 | POWER_MANAGEMENT_3 |
| 4×4 | 0×04 | 0×0010 | 0000_0000_0001_0000 | AUDIO_INTERFACE |
| 5×5 | 0×05 | 0×0000 | 0000_0000_0000_0000 | COMPANDING |
| 6×6 | 0×06 | 0×0100 | 0000_0001_0000_0000 | CLOCK_CONTROL_1 |
| 7×7 | 0×07 | 0×0000 | 0000_0000_0000_0000 | CLOCK_CONTROL_2 |
| 8×8 | 0×08 | 0×0034 | 0000_0000_0011_0100 | GPIO_CTRL |
| 9×10 | 0×0a | 0×0000 | 0000_0000_0000_0000 | DAC_CTRL |
| 10×11 | 0×0b | 0×00ff | 0000_0000_1111_1111 | DAC_VOLUME |
| 11×14 | 0×0e | 0×0180 | 0000_0001_1000_0000 | ADC_CTRL |
| 12×15 | 0×0f | 0×00ff | 0000_0000_1111_1111 | ADC_VOLUME |
| 13×18 | 0×12 | 0×012c | 0000_0001_0010_1100 | EQ1_LOW_CUTOFF |
| 14×19 | 0×13 | 0×002c | 0000_0000_0010_1100 | EQ2_PEAK_1 |
| 15×20 | 0×14 | 0×002c | 0000_0000_0010_1100 | EQ3_PEAK_2 |
| 16×21 | 0×15 | 0×002c | 0000_0000_0010_1100 | EQ4_PEAK3 |
| 17×22 | 0×16 | 0×002c | 0000_0000_0010_1100 | EQ5_HIGH_CUTOFF |
| 18×24 | 0×18 | 0×0000 | 0000_0000_0000_0000 | DAC_LIMITER_1 |
| 19×25 | 0×19 | 0×0070 | 0000_0000_0111_0000 | DAC_LIMITER_2 |
| 20×27 | 0×1b | 0×0000 | 0000_0000_0000_0000 | NOTCH_FILTER_0_HIGH |
| 21×28 | 0×1c | 0×0000 | 0000_0000_0000_0000 | NOTCH_FILTER_0_LOW |
| 22×29 | 0×1d | 0×0000 | 0000_0000_0000_0000 | NOTCH_FILTER_1_HIGH |
| 23×30 | 0×1e | 0×0000 | 0000_0000_0000_0000 | NOTCH_FILTER_1_LOW |
| 24×32 | 0×20 | 0×0018 | 0000_0000_0001_1000 | ALC_CTRL_1 |
| 25×33 | 0×21 | 0×000b | 0000_0000_0000_1011 | ALC_CTRL_2 |
| 26×34 | 0×22 | 0×0032 | 0000_0000_0011_0010 | ALC_CTRL_3 |
| 27×35 | 0×23 | 0×0008 | 0000_0000_0000_1000 | NOISE_GATE |
| 28×36 | 0×24 | 0×0008 | 0000_0000_0000_1000 | PLL_N_CTRL |
| 29×37 | 0×25 | 0×000c | 0000_0000_0000_1100 | PLL_K_1 |
| 30×38 | 0×26 | 0×0093 | 0000_0000_1001_0011 | PLL_K_2 |
| 31×39 | 0×27 | 0×00e9×0000_0000_1110_1001 | PLL_K_3 |
| 32×40 | 0×28 | 0×0000 | 0000_0000_0000_0000 | ATTENUATION_CTRL |
| 33×44 | 0×2c | 0×000b | 0000_0000_0000_1011 | INPUT_CTRL |
| 34×45 | 0×2d | 0×0010 | 0000_0000_0001_0000 | PGA_GAIN |
| 35×47 | 0×2f | 0×0150 | 0000_0001_0101_0000 | ADC_BOOST |
| 36×49 | 0×31 | 0×000a | 0000_0000_0000_1010 | OUTPUT_CTRL |
| 37×50 | 0×32 | 0×0001 | 0000_0000_0000_0001 | SPEAKER_MIXER_CTRL |
| 38×54 | 0×36 | 0×003f | 0000_0000_0011_1111 | SPKOUT_VOLUME |
| 39×56 | 0×38 | 0×0001 | 0000_0000_0000_0001 | MIXER_CONTROL |
| 40×58 | 0×3a | 0×0000 | 0000_0000_0000_0000 | POWER_MANAGEMENT_4 |
| 41×59 | 0×3b | 0×0000 | 0000_0000_0000_0000 | TIME_SLOT |
| 42×60 | 0×3c | 0×0004 | 0000_0000_0000_0100 | ADCOUT_DRIVE |
| 43×62 | 0×3e | 0×00ee | 0000_0000_1110_1110 | SILICON_REVISION |
| 44×63 | 0×3f | 0×001a | 0000_0000_0001_1010×2_WIRE_ID |
| 45×64 | 0×40 | 0×00ca | 0000_0000_1100_1010 | ADDITIONAL_ID |
| 46×65 | 0×41 | 0×0124 | 0000_0001_0010_0100 | RESERVED |
| 47×69 | 0×45 | 0×0001 | 0000_0000_0000_0001 | HIGH_VOLTAGE_CTRL |
| 48×70 | 0×46 | 0×0010 | 0000_0000_0001_0000 | ALC_ENHANCEMENTS_1 |
| 49×71 | 0×47 | 0×0000 | 0000_0000_0000_0000 | ALC_ENHANCEMENTS_2 |
| 50×73 | 0×49 | 0×0007 | 0000_0000_0000_0111 | ADDITIONAL_IF_CTRL |
| 51×75 | 0×4b | 0×0000 | 0000_0000_0000_0000 | POWER_TIE_OFF_CTRL |
| 52×76 | 0×4c | 0×0006 | 0000_0000_0000_0110 | AGC_P2P_DETECTOR |
| 53×77 | 0×4d | 0×0000 | 0000_0000_0000_0000 | AGC_PEAK_DETECTOR |
| 54×78 | 0×4e | 0×0011 | 0000_0000_0001_0001 | CONTROL_AND_STATUS |
| 55×79 | 0×4f | 0×0018 | 0000_0000_0001_1000 | OUTPUT_TIE_OFF_CTRL |
±----±-----±-----±-------±--------------------±--------------------+

Запись звука

Для активации микрофона надо прописать в I2C регистры вот эти значения битов. Тогда активируется тракт от микрофона к I2S.

aa5f24b2db33d99cab1788f1a5ce51ec.png

Далее всё аналогично тексту про WM8731 https://habr.com/ru/articles/703588/ и микрофон MP23DB01HPTR https://habr.com/ru/articles/765896/. Воспроизводим с телефона тон. Записываем по I2S звук кодеком в RAM память. Вычисляем DFT, находим частоту с максимальной амплитудой и сравниваем её с настройками воспроизведения на смартфоне.

Достоинства NAU8814YG
1++Это санкционно-стойкий аудио кодек.

2++Есть регистр с ID. Благодаря этому можно сделать модульный тест на для процедуры чтения.

3++I2C ячейки можно читать. Это выгодно отличает NAU8814 от WM8731!

4++Есть отладочные пины GPIO/ MOUT.

Недостатки NAU8814YG
1--Для аудио кодека NAU8814YG отсутствуют отладочные платы. Для освоения этого ASICа вам придется самому проектировать схемотехнику, самому трассировать топологию электронной платы, заниматься её производством. Никаких DevBoard для NAU9914 нет.

2--Как известно у чипа 7-битный адрес. Это значит, что можно адресовать 128 регистров. Одновременно с этим, в datasheet (те) на NAU8814 определено только 55 регистров. Возникает резонные вопрос: aдресуют ли что-нибудь оставшиеся 73 адреса?

Оказывается, что да. Есть регистр с адресом 0×48=72, который содержит значение 0×0006=0b0_0000_0110.

9e43ccc107eaf8f6c32f55bfc32f89af.png

Всё это провоцирует мысли, что внутри NAU8814 живёт ещё какой-то скрытый функционал про который разработчики из Nuvoton Technology пожелали не писать в datasheet (e). vendor locking. Вот такая вот пасхалка заложена…

Идеи проектов на аудиокодеке NAU8814YG

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

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

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

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

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

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

6--В режиме MIC bysass кодек превращается в слуховой аппарат. Слух будет как у филина!

7--осциллограф на основе входного пина AUX.

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

9--Датчик шума.

10--Спектро-анализатор.

11--Имитация рычания мотора внутри глушителя автомобиля.

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

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

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

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

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

Итог

Удалось обуздать аудиокодек NAU8814YG. Удалось научится воспроизводить звук.

В этом аудиокодеке так много мультиплексоров, что его можно сравнить с железнодорожными вокзалом со своими ж\д стрелками. Управлять аудиокодеком — это тоже что работать диспетчером на крупном вокзале.

Если вы знаете другие хорошие аудиокодеки, то пишете в комментариях.

Словарь

Для понимания документации и спецификаций на этот аудиокодек вам надо уметь правильно интерпретировать вот эти акронимы

Акроним

Расшифровка

PLL

Phase-locked loop

ALC

Automatic Level Control

PCM

Pulse-code modulation

I2S

Inter-IC Sound Bus

I2C

Inter-Integrated Circuit

PGA

programmable-gain amplifiers

DC

Direct current

ADC

Analog-to-digital converter

DAC

digital to analog converter

QFN

Quad Flat No-leads package


Контрольные вопросы:
1
--Что такое Notch filter?

2--Что такое equalizer?

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

4-- Что такое Attack time?

URLs

Обзор Усилителя Звука из Apple AirTag https://habr.com/ru/articles/767386/

Обзор Aппаратного Aудио кодека MAX9860 (2x ADC+DAC) https://habr.com/ru/articles/758140/

Чип AudioСodec (а) WM8731 (или (ADC/DAC)*2 из iPod (а)) https://habr.com/ru/articles/703588/

NAU8814YG https://www.nuvoton.com/products/smart-home-audio/audio-converters/audio-codec-series/nau8814yg/

Зачем программисту микроконтроллеров комплексные числа (или обзор MEMS микрофона MP23DB01HPTR) https://habr.com/ru/articles/765896/

NAU881x-stm32-C https://github.com/muhammadrefa/NAU881x-stm32-C

Аналитика по NAU8814 https://docs.google.com/spreadsheets/d/1XXffSqG6324FbjQRW5MAGq5seiLfEc9OIFj81_xSCBA/edit#gid=0

микрофон — датчик объёма https://habr.com/ru/articles/792096/

Сайт компании разработчика кодека https://www.nuvoton.com/

© Habrahabr.ru