Обзор Aудио Кодека NAU8814YG
Пролог
NAU8814YG это 24 битный аудио кодек от тайваньской компании Nuvoton Technology в 24-пиновом QFN корпусе с управлением по I2C (либо SPI). В случае управления по I2C чип отзывается на адрес 0×1A.
Вот так выглядит 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 фильтров этот диапазон частот очень узкий.
Attack time — это продолжительность времени, которое нужно аудиосигналу чтобы достигнуть максимальной амплитуды после срабатывания. Время между моментом, когда сигнал на входе устройства превышает порог активации устройства, и моментом, когда устройство реагирует определенным образом на вход.
Аппаратная часть
В первом приближении микросхему NAU8814YG можно рассмотреть вот так. Просто коробочка у которой есть входы и выходы.
Расспиновка чипа такая.
На минус втором уровне абстракции так
На минус третьем уровне абстракции то, что под капотом NAU8814 выглядит так
Это референс схемотехника
Так как чип управляется по I2C вспомним основные моменты по I2C
Аналогично про I2S.
Как отлаживать 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 и посмотрим кто там живёт…
Тут ASICу NAU8814YG посвящаются два I2C адреса: 0×34 и 0×35.
hex | bin | Пояснение |
0×34 | 0011_0100 | адрес для записи |
0×35 | 0011_0101 | адрес для чтение |
Вот и получается, что настоящий адрес устройства это 0011_010 = 0001_1010 = 0×1A.
Чтение регистра с подвохом. Надо адресу вставлять вправо один младший нулевой dummy бит.
Запись
Запись совсем простая. Отправить 3 байта по I2C.
Удалось вычитать значения внутренних 9-битных регистров ASIC NAU8814
продолжение
Как видно регистр SILICON_REVISION на самом деле нулевой. Это несоответствие со спецификацией. Там обещали значение 0xEE.
Настройка PLL
Как и всё в цифровой электронике, для того чтобы заработали ADC и DAC на их надо подать тактирование. В той плате, где у меня установлен NAU8814 тактирование приходит не от кварцевого генератора, а от микроконтроллера. Провод MCLK припаян к пину с PWM функцией от аппаратного таймера. Поэтому мне пришлось предварительно написать драйвер аппаратного таймера и генератора PWM. Вот так, в частности, можно сконфигурировать контур PLL, чтобы на АЦП и ЦАП поступило тактирование.
Для контроля настроек PLL надо как раз воспользоваться отладочным пином CSd/GPIO. Я вывел «на улицу» частоту PLL и увидел частоту 3.25 MHz. Это значит что перед делителем частота PLL равна 13 MHz.
Частота сигнала на CSb/GPIO = 3.25 MHz
Это как раз совпадает с расчётными run-time значениями в прошивке.
Успех!
Воспроизведение звука
Для того чтобы переключить ASIC в режим воспроизведения звука надо прописать конфиги вот как чтобы данные пошли по красному тракту.
Я создал в коде массив uint16_t семплов (96 элементов), рассчитал в элементы массива значения синуса
и воспроизвел на I2S этот массив. В результате осциллографом я увидел сигнал на пине MOUT.
Отлично! Значит, что всё понято правильно.
Значения 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.
Далее всё аналогично тексту про 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.
Всё это провоцирует мысли, что внутри 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/