DSP процессор на ADAU1701. Часть 5 — программирование процессора в реальном времени с помощью Cypress CY7C68013A


Самый удобный способ программирования Adau 1701 из всех испробованных — с помощью Киприота Cypress CY7C68013A. Практически так-же управляет 1701 фирменная плата USBi от AnalogDevices. Различие в одной лишней операции и стоимости устройств — Чиповская плата стоит 15 баксов, AD раз в 6 дороже.


Эту плату можно превратить в различные контроллеры с помощью программы и драйверов от Cypress. В том числе и в USBi для Сигма Студии.


Первым делом подключаем плату к компьютеру и ставим драйвер от Cypress. Вместо EZ-USB появляется такое.


Открываем Cypress USB Console и видим тоже самое.


Нажимаем Load script и в папках СигмаСтудии находим скрипт ADI usbi.


Загружаем — Play script и наша плата становится AnalogDevises USBi.


Загружаем СигмаСтудию, перетаскиваем USBi (с другими работать не будет), Adau1701 и епромку. Зелёный цвет говорит о соединении с процессором.


Создаём проект. Снизу справа статус. Для загрузки необходимо нажать кнопку над стрелкой 2.


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


Подключения модулей. Всё разъёмы на них подписаны.


Единственный неудобный момент — нужно один провод подпаять к 6-й ноге микросхемы памяти. Проще это сделать в этой точке.


Желтый джампер необходимо открыть и на ногу ближнюю к микросхеме подключить провод SDA. Кстати, светодиод в центре платы загорается после загрузки скрипта из Ципрус консоли.


Если устройство ещё не USBi светодиод не горит. Сброс (в моём случае синий провод) подключать как на фото — этот разъём, к сожалению, не маркирован.

DSP процессор на ADAU1701. Часть 4 — Запись файла с проектом в память с помощью Arduino.


Вторым из испробованных вариантов записи файла с проектом в память процессора — через Ардуино. В моём случае это китайская Uno.


В Ардуинку необходимо загрузить скетч и выполнить соответствующие соединения плат.


Очень важный момент. Процессор работает с уровнем сигналов 3,3в. Ардуинка выдаёт 5. Для согласования использовал вот такой преобразователь.


Подключение к процессору. Во время записи файла внешнее питание платы необходимо отключить.


Файл записывается бесплатной программой Tera Term. Hex файл из СигмаСтудии преобразовывать не нужно. Необходимо выбрать сом порт.


Если всё нормально, то появится такое окно.


Скетч настроен на скорость 19200.


Соответственно необходимо её выбрать.


Перезагружаем терминал и видим такую картинку.


Выбираем файл и записываем. Всё. Устройство готово к работе.

DSP процессор на ADAU1701. Часть 3 — Запись файла с проектом в память посредством программатора.


В используемом варианте устройства (а есть ещё версия RDC2-0027v2, она проще — нет источника питания и микросхема памяти впаяна в плату) память в корпусе dip8 может быть установлена в кроватку или в корпусе soic8 смонтирована на плату. Есть и третий вариант — монтаж в плату-переходник.


Я купил микросхему в корпусе dip8 чтобы попробовать записать файл с помощью простейшего программатора с Али. Требования к eeprom'ке такие — минимальный объём 32 килобита, организация страницы 32 байта.


Микросхема для впаивания в плату в корпусе soic8.


Переходник, с помощью которого память в корпусе soic8 можно сделать съёмной. Только вместо контактов пап на него необходимо впаять мамы.


Эксперимент проводился с простейшим программатором за 175р.


Первым делом hex файл из Сигма Студии необходимо преобразовать в бинарник специализированной программой. Она бесплатная и доступна для скачивания на сайте Чип и Дипа.


Затем записать получившийся файл с расширением bin в микросхему с помощью программы CH341A-Usb programmer. Она тоже бесплатная. Найдена в интернете.

В следующей части расскажу как записывать файл в память с помощью Arduino.

DSP процессор на ADAU1701. Часть 2 — Создание проекта в СигмаСтудио.


Чтобы заставить работать процессор как нам нужно необходимо создать проект аудиосистемы и записать его в память на плате. Для этих целей используется бесплатная программа SigmaStudio доступная для скачивания на официальном сайте Analog Devices. Для начала работы в ней создаём новый проект. Слева появится дерево доступных продуктов.


Перетаскиваем используемую микросхему на основной экран. При этом появляется вкладка schematic.


Аналогично поступаем с usbi audio и e2prom.


Соединяем модули.


Переходим к вкладке schematic. В дереве слева появляются модули обработки сигнала.


Начинаем с входов-выходов. Перетаскиваем входной и выходные модули.


Вот что получилось.


Потом пару кроссоверов и модуль задержки. У программы есть возможность не перетаскивать одинаковые модули, а расширить один. Для этого правой клавишей нажимаем на модуль, выбираем add algorithm/IC1/ и кликаем на вывалившеюся вкладку.


Получился 4-х канальный модуль задержки. Если разместить 4-ре отдельных то работать будет точно так же.


Добавил регуляторы уровня сигнала для каждого канала. На самом деле можно обойтись двумя в ВЧ каналах.


Выполняем соединения модулей. Выбираем частоты среза фильтров и их порядок. Выставляем задержки для каналов. Согласуем излучатели по уровню. Проект готов.


Возвращаемся в hardware configuration. Нажимаем link compile connection.


Теперь можно записать наш проект в файл. На adau1701 нажимаем правую кнопку и write latest compilation to e2prom. Всё.



В папке программы появился файл e2prom.hex

О способах записи файла в память процессора расскажу в следующей части.

DSP процессор на ADAU1701. Часть 1 — Знакомство.


Разработчик — группа лиц под громким названием Электронные войска, производитель и продавец — фирма по продаже электронных компонентов Чип и Дип. Основа — звуковой процессор фирмы Analog Device ADAU 1701 с обвязкой из специализации производителя и источник питания на MC34063, позволяющий питать устройство в широком диапазоне напряжений(от 5 до 35 в.). Розничная цена (вместе с памятью) 1200р.


Обратная сторона платы. Кто то из разработчиков явно питал страсть к одному британскому музыкальному коллективу.



Программируется процессор в фирменной бесплатной программе Sigma Studio, доступной на официальном сайте AD.

В следующих частях расскажу о создании конфигурации и загрузке её в память.

Обзор DSP чипов Analog Devices серии ADAU 1702 / 1445

В данной статье собрана вся имеющаяся информация по чипам цифровой обработки звука от Analog Devices серии ADAU.

Процессоры SigmaDSP — полностью программируемые, однокристальные цифровые сигнальные процессоры для обработки звука, которые легко конфигурируются при помощи графического инструмента разработки SigmaStudio, и являются идеальным решением для автомобильных и портативных аудио продуктов.

Ядро микросхемы выпускаются с преобразователями частоты дискретизации, аналого-цифровыми преобразователями, цифро-аналоговыми преобразователями, выходными усилителями.

Наиболее распространенные чипы в России сейчас ADAU1702 и ADAU1445.

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

Первый из них это FreeDSP, сайт с информацией по проекту: freedsp.cc

отладочные платы

ссылки на проекты

гтовые продукты MadBit DSP, CarDSP

Драйвер и программа для китайского GPS USB приёмника

Найти и скачать драйвер с тестовой программой для китайского GPS USB приёмника оказалось не просто. Что бы не тратить время выложил их тут, скачать можно по ссылкам:

Драйвер для Stoton gps receiver GN208G
Тестировочная программа GNSS USB приемника GN208G

Бесплатно и без регистрации;)







ON ENGLISH:

UBLOX GNSS Chips Receiver USB driver download GNSS GPS / GLONASS Receiver USB driver download
The driver for the CHIPS GNSS GPS U-blox receiver driver, applicable products: U-blox 8 GLONASS Receiver GPS/GNSS U-blox 7 GPS/GNSS Receiver U-blox 6 GPS Receiver U-blox 5 GPS and GALILEO Receiver It applies to UBLOX GNSS CHIP design GNSS GPS GLONASS receivers the system is running Windows XP WIN7 WIN8 USB driver software Suitable for UBLOX GPS CHIP 6010, UBLOX GNSS CHIP7020, Ublox gnss chips8030 (gps / glonass / bds)

Загрузка в eMMC ос Android или VOLUMIO в одноплатный компьютер Khadas VIM 1/2

Загрузка операционной системы в одноплатный компьютер Khadas VIM 1/2 Через USB-C кабель на операционной системе Windows



Подготовка:

Скачиваем программу USB Upgrade Tool и распаковываем ее.
Устанавливаем её на компьютер.

Запускаем программу USB_Burning_Tool_v2.x.x.exe, выбираем на диске нужный для заливки в VIM файл ‘File–>Import Image’



Подключаем VIMs к компьютеру с помощью USB-C дата кабеля (VIM включится автоматически).

Теперь нужно перевести VIM в режим обновления — “Upgrade Mode”:
Для этого нужно зажать кнопку Power и не отпуская ее нажать Reset, после чего подержать Power зажатым еще несколько секунд и отпустить. Если все сделано правильно, то в программе отобразится статус Connect Success.

Так же в программе появится подключенный VIM.



Всё готово для загрузки. Нажимаем кнопку START и ждём завершения загрузки (7-19 минут).



Советы:

Для отмены заливки нажмите кнопку Stop, закройте программу. Имейте ввиду, что после 15 процентов, внутренняя eMMC память уже подверглась форматированию и предыдущая операционная система уже не загрузится.

Может потребоваться дополнительное питание, если порт компьютера не выдаёт достаточной мощности для VIM (до 1 ампера).

На текущий момент доступны операционные системы для VIM 1/2 для CarPc от DaveMf, скачать их можно по ссылке: https://cloud.mail.ru/public/FnJU/8wG8s8D1c

Так же есть сборка opensource плеера VOLUMIO, который можно скачать по ссылке:

Она подходит и для VIM-1 (s905X) и VIM-2 (S912) и прочих чипов серии s9xxx.
https://yadi.sk/d/xbesnjYG3PETk5

Во так просто можно установить операционную систему Android на Хадас вим для CarPc, или медиа плеер Volumio на одноплатный компьютер для создания источника качественного звука.

Скачать файлы прошивок Android или Volumio можно по указанным ссылкам выше.

The system normally runs, allows you to connect a standard WebGUI. Sound working to USB sound cards. But still not working HDMI the sound output. I’m not an expert on sound, so I would be very grateful to those who will help to find the reason why the sound is not working to HDMI. The image can be downloaded from here. While the system works only with SD cards. Be sure to have activated the universal multi-boot.

8-ми канальный ЦАП для авто на AK4458 с DSP ADAU1458

Экспериментальный проект по запуску собственного аудио процессора на основе связки DSP ADAU1452 с ЦАП AK4458. Что представляет из себя AK4458? Это 32-битный 8 канальный премиум ЦАП с заявленными характеристиками соотношения сигнал шум 115dB с поддержкой потока 768kHz DSD. Найден на просторах забугорного интернета проект много-канальго ЦАПа на базе Asahi Kasei 4458vn.

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

Еще есть Madbit от Сарапульских разработчиков, тоже интересное решение. И так, в основе по канального обработчика звукового сигнала микросхема от Alanog Devices с программой Sigma Studio, позволяющий решить все вопросы настройки и сведения звуковой сцены в автомобильной системе. Для теста куплена плата из поднебесной на всем известном Али с готовой платой ЦАПА.

Программно настроены нужные обработки. В скором времени будет протестирована такая вот интересная связка ADAU1452 + AK4458 и статья будет дополнена.

Пока многоканальный ЦАП представлен в виде рабочего прототипа, часть модулей разработана энтузиастами с форума diyaudio.com часть куплена на aliexpress. Вся связка работает и даёт возможность проектировать полностью своё автономное устройство.

Прототип печатных плат процессора (базовая плата):

Дочерняя плата ЦАПа

 

Далее фото тестовых образцов отдельных модулей будущего процессоа. Платы ЦАП на базе AK4458

Собственно сама микросхема AKM4458VN

Платы ЦАП в собранном виде:

Далее она связывается с оталдочной платой DSP Evaluation Board на ADAU1452:

Оба устройства собраны на макетной плате, источником сигнала является плата с Bluetooth APTx приемником:

И всё это работает!

Платы соединены интерфейсами i2c для передачи данных (инициализации) от ADAU1452 к AK4458 и по шине i2s для передачи цифрового потока аудио 8 каналов.

На следующем фото процесс отладки связи ЦАПА с DSP.

 

Следите за обновлениями. Проект развивается.

Теория I2C, EEPROM от Atmel

Пришла мне посылка из Китая в которой лежит микросхема EEPROM фирмы Atmel. Которую хочется подключить к Arduino. Но совершенно не хочется использовать готовую библиотека, а разобраться самому. По этому статья получиться немного объемной и скучной и разделем ее на три части:
  • Теория интерфейса I2C.
  • EEPROM, описания моей микросхемы(AT24C256) и подключение.
  • Написание библиотеки для работы с памятью.

Часть первая, I2C и библиотека «Wire».

Последовательный протокол обмена данными IIC (также называемый I2C — Inter-Integrated Circuits, межмикросхемное соединение). Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Так как право на использование его стоит денег фарма Atmel назвала его TWI, но смысл от этого не меняется.

КАК ЭТО РАБОТАЕТ?
Для передачи данных используются две двунаправленные лини передачи данных. SDA (Serial Data) шина последовательных данных и SCL (Serial Clock) шина тактирования. Обе шины подтянуты резисторами к плюсовой шине питания. Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов.


В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации и ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Конечно понятно что Ведущий это наш микроконтроллер , а ведомый наша память. Ведущее устройство начинает прижимать шину SCL к нулю с определенной чистотой, а шину SDA прижимать или отпускать на определенное число тактов передавая Единичку или Нолик. Передача данных начинается с сигнала START потом передается 8 бит данных и 9-тым битом Ведомое устройство подтверждает прием байт прижимая шину SDA к минусу. Заканчивается передача сигналом STOP.


БИБЛИОТЕКА «WIRE».
Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire которая есть уже в комплекте IDE. Она имеет следующие основные функции:

Wire.begin(Address) вызывается один раз для инициализации и подключения к шини как Ведущий или Ведомое устройство. Если Address не задан подключаемся как Мастер устройство.

Wire.beginTransmission(address) начинает передачу на ведомое I2C устройство с заданным адресом.

Wire.endTransmission() прекращает передачу данных ведомому. Функция возвращает значение типа byte:
  • 0 — успех.
  • 1- данные слишком длинны для заполнения буфера передачи.
  • 2 — принят NACK при передаче адреса.
  • 3 — принят NACK при передаче данных.
  • 4 — остальные ошибки.
Wire.write() запись данных от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству.Фактически записывает данные в буфер. Размер буфера 32 байта ( минус 2 байта адрес, фактически 30 байт), а передает буфер функция Wire.endTransmission().

Wire.write(value) — value: значение для передачи, один байт.
Wire.write(string) — string: строка для передачи, последовательность байтов.
Wire.write(data, length) — data: массив данных для передачи, байты. length: количество байтов для передачи.
Wire.read() Считывает байт, который был передан от ведомого устройства к ведущему или который был передан от ведущего устройства к ведомому. Возвращаемое значение byte : очередной принятый байт.

Это самые основные функции библиотеке, остальные мы рассмотрим по ходу пьесы ))

Часть вторая, EEPROM.

EEPROM (англ. Electrically Erasable Programmable Read-Only Memory) — электрически стираемое перепрограммируемое ПЗУ (ЭСППЗУ), один из видов энергонезависимой памяти (таких, как PROM и EPROM). Память такого типа может стираться и заполняться данными до миллиона раз.

Мне прислали уже готовый модуль EEPROM с микросхемой AT24C256 фирмы Atmel объемом 32 кбайт. Что бы разобраться с этим чудом нам придется проштудировать datasheet который очень скучный и на английском. Так что я вам выдам уже готовый результат моих мук.

ХАРАКТЕРИСТИКИ:
  • Низковольтные и стандартные питание. VCC = 1.7V to 5.5V.
  • 400kHz (1.7V) and 1MHz (2.5V, 2.7V, 5.0V) совместим с частотой синхронизации.
  • Выносливость: 1,000,000 Циклов Записи.
  • Внутренне организованный как 32 768 страниц x 8 бит.

ВЫВОДЫ:
  • WP — защита от записи. Если вывод подключен к GND то можно записывать данные в память.
  • A0…A2 — выводы задающие адрес устройства.
  • Vcc — питание плюс.
  • GND — питание минус.

Адрес памяти:
Задается тремя ногами A0..A2. Если нога прижата к Gnd то значение бита 0, если к Vcc то 1. Микросхема использует восьми битный адрес, последний бит отвечает за выбор операции. Если значение бита высокий то инициализируется операция чтения, если низкий(ноль) то операция записи.

То есть если все три вывода прижаты к GND и мы хотим записать в память, адрес устройства будет выглядеть как 10100000 (в библиотеке «Wire» используется 7-ми битный адрес, сдвигаем все в право на один бит 01010000 0x50).

Запись данных в память:

Для записи мы с начало обращаемся к памяти с битом Записи в адресе. Потом посылаем два 8-ми битных адреса(то есть у нас 0x8000 адресов) , затем байт данных и сигнал STOP. После этого EEPROM входит во внутренне синхронизированный цикл записи tWR(Write Cycle Time 5 ms) в энергонезависимую память. Все входные сигналы
отключено во время этого цикла записи, и EEPROM не ответит, пока запись не будет завершена.

Копаемся дальше и находим в datasheet что память микросхемы организована как 512 страниц по 64 байта. То есть мы может записать сразу до 64 байт информации за одну команду. Для этого мы передаем все 64 байта информации и только после этого посылаем сигнал STOP.


Чтение данных:
С чтением данных все интересней. Память поддерживает три варианта чтения:

Читать текущий адрес;
Читать случайный адрес;
Последовательное чтение;
Память запоминает последний адрес записи пока не отключено питание, по этому мы можем прочитать последний байт без указания адреса.

Что бы прочитать случайный адрес нам нужно с начало отправить команду на запись и передать адрес который хотим прочитать(не забывайте что адрес состоит из двух 8-ми битных частей). За тем отправить команду на чтение и получить искомый байт, завершив все командой STOP.

Последовательное чтение может выполняться как с текущего адреса так и со случайного и будет продолжаться пока микроконтроллер не отправит сигнал СТОП. При переполнении адреса память ее сбросить и адресация начнется с начала.

Ну что же пришло время попробовать что нибудь записать:


#include <Wire.h> // Подключаем библиотеку
#define EEPROM_ADDRESS 0x53 // Задаем адрес памяти
word address = 0; // Адрес куда будем записывать
byte data_send = 170 ; // Даные
void setup() {
Wire.begin(); // Инициализируем I2C
Serial.begin(9600);
Serial.print(«Write byte to EEPROM memory...»);
Serial.println (data_send);
Wire.beginTransmission(EEPROM_ADDRESS); // Начинаем передачу
Wire.write(address >> 8);
Wire.write(address & 0xFF); // Отправляем два байта адреса
Wire.write(data_send); // Отправляем данные
byte status= Wire.endTransmission(); // Заканчиваем передачу и проверяем статус передачи.
if (status == 0)Serial.println («Ок»); //
delay(10);
Serial.println(«Read byte from EEPROM memory...»);
Wire.beginTransmission(EEPROM_ADDRESS); // Что бы прочитать данные отравляем сначала адрес где они лежат.
Wire.write(address >> 8);
Wire.write(address & 0xFF);
status= Wire.endTransmission();
if (status == 0)Serial.println («Ок»); // stop transmitting
Wire.requestFrom(EEPROM_ADDRESS, (byte)1); // отправляем команду на чтение одного байта данных
byte data = 0;
if (Wire.available()) // проверяем что есть данные для чтения.
{
data = Wire.read(); //читаем данные
}
Serial.println (data, DEC);
}

void loop() {

}

Wire.requestFrom(address, quantity) — Используется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read(). Размер буфера такой же 32 байта.

  • address: 7-битный адрес устройства, у которого запрашиваются байты;
  • quantity: количество запрашиваемых байтов;

Wire.available() — Возвращает количество байтов, доступных для получения с помощью read().

Ну и пример с записью в память строки «Hello Word»:
#include <Wire.h>
#define EEPROM_ADDRESS 0x53
word address = 0;
char data_send[] = «Hello Word» ;
void setup() {
Wire.begin(); //
Serial.begin(9600);
Serial.print(«Write byte to EEPROM memory...»);
Serial.println (data_send);
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(address >> 8);
Wire.write(address & 0xFF);
Wire.write(data_send);
byte status= Wire.endTransmission();
if (status == 0)Serial.println («Ок»);
delay(10);
Serial.println(«Read byte from EEPROM memory...»);
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(address >> 8);
Wire.write(address & 0xFF);
status= Wire.endTransmission();
if (status == 0)Serial.println («Ок»); // stop transmitting
Wire.requestFrom(EEPROM_ADDRESS, (byte)10);
byte data = 0;
for (int i=0 ; i<10 ;i++) {
if (Wire.available())
{
data = Wire.read();
}
Serial.write (data);
}
}

void loop()

{
}



Организация памяти:

Так как в datasheet об этом написано смутно. Я на практике пытался разобраться с этим. В datasheet написано что память микросхемы организована как 512 страниц по 64 байта. Что это значит ? Если мы захотим записать больше 64 байт сразу ,скажем по адресу 0x40( адрес начало второй страницы), при выходе адреса за границы страницы внутренний счетчик микросхемы сбросит адрес на начало страницы. А лишние байты будут записаны в начало страницы и сотрут данные которые были там записаны.



Для чтения таких ограничений нету, в даташипе написано только то что когда вы достигнете конца адресов вас автоматически перекинет на начало ( адрес 0х00).

На этом я думаю все. Вы конечно можете скачать уже готовую библиотеку для EEPROM , дума сможете и написать свою. Главное мы разобрались в основном принципе работы.