Про Ардуино и не только

Содержание

RDA5807M Arduino

В интернет магазинах распространен модуль RRD-102v2, на котором распаяны RDA5807M, кварцевый резонатор и пара компонентов обвязки. В данной статье я опишу как подключить этот модуль к Ардуино и что нужно знать для создания радиоприемника на его основе.

Характеристики RDA5807M

  • Напряжение питания 2.7 — 3.3В
  • Потребляемый ток (при напряжении питания 3В):
  • в рабочем режиме — не более 20мА
  • в режиме сна — не более 15мкА

Распиновка и подключение к Ардуино

RRD-102v2 (RDA5807M) pinout
Распиновка RRD-102v2

RRD-102v2 (RDA5807M) подключение к Arduino
Подключение RRD-102v2 (RDA5807M) к Ардуино

Выводы SDA и SCL модуля подключаются к одноименным выводам Ардуино. Для платы Uno это пины A4 и A5 соответственно. Их уровни превышают напряжение питания RDA5807M, но это не критично, микросхема отлично работает без преобразователя уровней. Питание берем с вывода 3v3.

Интерфейс управления

Здесь я хочу обратить внимание на имеющуюся в технической документации неточность (даташит на эту микросхему вообще очень мутный): в ней говорится, что I2C адрес микросхемы 0x10h, что внутренние адреса ее регистров не видны и что чтение и запись выполняются последовательно, начиная с фиксированного стартового адреса (0x0Ah для чтения, 0x02h для записи). После каждой операции чтения/записи происходит инкремент внутреннего счетчика и очередная операция будет выполняться уже для следующего регистра. Так до тех пор, пока внутренний счетчик не дойдет до верхней границы 0x3Ah, после этого он вернется к своему начальному значению.

На самом деле RDA5807M отзывается на три I2C адреса, в чем легко убедиться, воспользовавшись I2C сканером:

I2C адреса микросхемы RDA5807M
I2C адреса RDA5807M

Адрес 0x10h используется для последовательного обращения к регистрам, как было описано выше.
Адрес 0x11h позволяет обращаться к произвольным регистрам.
Адрес 0x60h позволяет работать с RDA5807M в режиме совместимости с TEA5767.

Упоминание адреса 0x11h можно найти в документе RDA5807P_ProgManual_1.0. Хоть он и предназначен для другой микросхемы, но практически всё применимо и для RDA5807M. Ниже приведен фрагмент из данного документа, описывающий формат I2C обмена при использовании адреса 0x11h:

Формат обмена RDA5807M I2C 0x11h
Формат обмена с RDA5807M по I2C адресу 0x11h

Как можно видеть, при записи в режиме произвольного доступа первым передается адрес интересующего регистра (REGISTER ADDRESS), затем старший и младший байты данных. Для чтения содержимого регистра из RDA5807M микроконтроллер сначала передает его адрес, затем считывает старший и младший байты. Чуть позже я приведу пример чтения/записи регистров, а пока разберемся с их назначением.

Регистры RDA5807M

Управление работой RDA5807M заключается в обращении к его регистрам: изменяя одни регистры, мы производим необходимые нам настройки; из других можно читать различную информацию (флаги, данные RDS и т.д.). Регистры 16-разрядные, их адреса и назначение приведены в даташите. Описание весьма скудное, поэтому я решил сам "пощупать" каждый регистр, чтобы понять какой бит за что отвечает. Для этого была написана следующая программа:

Программа для PC RDA5807M
Управление работой RDA5807M с компьютера

Данная программа читает значения регистров RDA5807M, отображает в удобном виде и позволяет изменять их, щелкая мышью по элементам управления. Ардуино при этом выступает в роли посредника между программой на компьютере и RDA5807M, для этого в нее должен быть загружен соответствующий скетч (вы найдёте его в программе по кнопке "Скетч для Ардуино"). Очень рекомендую попробовать данную программу, чтобы разобраться с назначением регистров. Скачать ее можно здесь. И, чтобы совсем не осталось вопросов по управлению RDA5807M, привожу описание регистров на понятном языке.

Регистр Биты Имя Назначение Значение
по умолчанию
00h 15:0 CHIP_ID Chip ID — Идентификатор микросхемы. Есть у меня основания полагать, что значение ChipID состоит именно из двух байт, а не одного, как это указано в даташите. 0x5804
02h 15 DHIZ Audio Output High-Z Disable. Управляет состоянием аудио выводов: 0 — выводы находятся в высокоимпедансном состоянии; 1 — переводит выводы в рабочий режим. 0
14 DMUTE Mute Disable — отключение режима mute, который по умолчанию включен (значение 0). Для отключения mute в этот бит следует записать 1. 0
13 MONO Принудительное моно, включается записью в данный бит значения 1 0
12 BASS Bass Boost — усиление басов. Для включения данной опции необходимо записать 1 0
11 RCLK_NON_
CALIBRATE_
MODE
Если я правильно понял, этот бит отключает температурную компенсацию тактового генератора, в результате чего RDA5807M не сможет работать в заявленном температурном диапазоне (-20..70C) и сможет поддерживать колебания температуры только на +/- 20C от точки настройки. 0
10 RCLK_DIRECT_
INPUT_MODE
Бит RCLK Direct Input Mode следует установить в 1, если используется внешний тактовый сигнал 0
9 SEEKUP Seek Up — направление поиска радиостанций: 0 — к нижней границе диапазона; 1 — вверх. 0
8 SEEK Запись 1 в этот бит запускает процесс поиска радиостанции. Поиск ведется в направлении, заданном битом SEEKUP, до нахождения радиостанции или до прохождения всего диапазона частот, после чего данный бит сбрасывается и устанавливается бит STC. 0
7 SKMODE Seek Mode. Определяет поведение при достижении границы диапазона во время поиска радиостанций: 0 — продолжить поиск с другой границы; 1 — прекратить поиск 0
6:4 CLK_MODE Позволяет выбрать частоту внешнего тактового сигнала. Возможны следующие значения:
000 = 32.768кГц
001 = 12МГц
101 = 24МГц
010 = 13МГц
110 = 26МГц
011 = 19.2МГц
111 = 38.4МГц
При указании неверного значения ничего страшного не произойдет, просто FM приемник не сможет настраиваться на частоту и выполнять поиск радиостанций.
000
3 RDS_EN RDS/RBDS Enable. Запись 1 в этот бит включает прием RDS/RBDS сообщений. 0
2 NEW_METHOD New Demodulation Method Enable — установка этого бита задействует новый метод демодуляции, способный улучшить чувствительность приемника 0
1 SOFT_RESET Программный сброс RDA5807M. Установка бита в 1 приведет к сбросу всех внутренних регистров к значениям по умолчанию. Сброс выполняется автоматически при включении питания микросхемы, нет необходимости сбрасывать устройство дополнительно. 0
0 ENABLE Power Up Enable — разрешение работы. Установка в 1 переводит приемник в рабочий режим; 0 — спящий режим — отключает питание внутренних узлов, состояние регистров при этом сохраняется, после возвращения в рабочий режим необходимо выполнить TUNE для настройки на радиостанцию. 0
03h 15:6 CHAN Channel Select — выбор канала. Частота радиостанции устанавливается не явно, а путем изменения значения CHAN, которое при умножении на SPACE и прибавления нижней границы диапазона дает итоговую частоту. Для записи CHAN необходимо также установить бит TUNE, в противном случае CHAN не изменится. 0x00
5 DIRECT_MODE Режим прямого управления, который используется только при тестировании — это описание из даташита, не уверен, что данный бит имеет отношение к RDA5807M. 0
4 TUNE Запись в этот бит значения 1 запускает процесс настройки. По окончании настройки устанавливается бит STC, бит TUNE при этом сбрасывается. 0
3:2 BAND Выбор полосы. Возможно одно из четырех значений:
00 — 87..108МГц
01 — 76..91МГц
10 — 76..108МГц
11 — 65..76МГц или 50..65МГц (определяется битом 65M_50M MODE регистра 07h)
00
1-0 SPACE Задает шаг изменения частоты. Возможны следующие значения:
00 — 100кГц
01 — 200кГц
10 — 50кГц
11 — 25кГц
В большинстве стран частоты радиостанций разнесены на 200кГц или 100кГц. Поэтому, скорее всего, вам не придется менять значение по умолчанию. Установив шаг 50кГц или 25кГц, вы лишь замедлите процесс поиска радиостанций.
00
04h 15:12 RSVD Биты зарезервированы 0000
11 DE De-emphases. Определяет значение постоянной времени для частотных предыскажений:
0 — 75мкс
1 — 50мкс
Предыскажения подразумевают усиление высоких частот сигнала при передаче (pre-emphasis) с целью уменьшения воздействия на них помех и последующее восстановление исходного сигнала в приемнике (ослабление высоких частот — de-emphases). В большинстве стран (в т.ч. в Европе и РФ) используется значение 50. В Северной и Южной Америке, в Южной Корее — 75.
0
10 RSVD Зарезервирован 1
9 SOFTMUTE_EN Soft Mute Enable — приглушение звука, может быть использовано для минимизации шумов в условиях слабого приема. Функция включается установкой бита в 1. 0
8 AFCD Automatic Frequency Control Disable — отключение автоматической подстройки частоты.
0 — AFC работает
1 — AFC выключено.
0
05h 15 INT_MODE Режим генерации прерывания при завершении поиска/настройки. Данный бит определен в даташите, но не имеет отношения к RDA5807M. Актуален для микросхем с дополнительными выводами GPIO, например, RDA5807P. 1
14:12 RSVD Биты зарезервированы 000
11:8 SEEKTH Seek Threshold. Данные биты задают порог отношения сигнал/шум при выполнении поиска радиостанций. 1000
7:6 LNA_PORT_SEL Low Noise Amplifier Port Selection — эти биты пропущены в даташите RDA5807M. При этом они весьма важны, поскольку определяют источник сигнала для приемника (смотрите блок LNA на функциональной схеме приемника в даташите):
00 — нет входа
01 — LNAN (земля)
10 — LNAP (вход FMIN)
11 — оба источника
10
5:4 RSVD Биты зарезервированы 00
3:0 VOLUME Регулировка громкости 1011
06h 15 RSVD Зарезервирован 0
14:13 OPEN_MODE Данные биты указаны в даташите, но они неактуальны для RDA5807M. В других микросхемах серии установка этих битов в 11 разрешает изменение остальных битов регистра, отвечающих за настройку I2S (Audio Data Interface). 00
07h 15 RSVD Зарезервирован 0
14:10 TH_SOFTBLEND Soft Blend Thershold — настройка уровня шумоподавления. 10000
9 65M_50M MODE Данный бит определяет используемый диапазон частот, когда биты BAND содержат значение 11:
0 — 50..76МГц
1 — 65..76МГц
1
8 RSVD Зарезервирован 0
7:2 SEEK_TH_OLD Seek Threshold Old — по аналогии с SEEKTH данные биты определяют порог при поиске радиостанций, но актуальны только при SEEK_MODE (биты 14:12 регистра 0x20h) = 001 — "старый" метод поиска. 000000
1 SOFTBLEND_EN Soft Blend Enable. Данный бит разрешает шумоподавление, уровень которого задан битами TH_SOFTBLEND. Помогает здорово очистить сигнал от помех. 1
0 FREQ_MODE Режим задания частоты. Когда данный бит сброшен в 0, результирующая частота определяется как BAND + CHAN * STEP. При FREQ_MODE = 1 частота определяется как BAND + содержимое регистра 08h. 0
08h 15:0 FREQ_DIRECT Определяет частоту при FREQ_MODE = 1. Результирующая частота является суммой значения данного регистра (в килогерцах) и нижней границы диапазона. Например, при BAND = 00 (87..108МГц) и FREQ_DIRECT = 20300 итоговая частота будет 107,3МГц.
Описание регистра FREQ_DIRECTотсутствует в даташите, вероятно, потому, что такой способ изменения частоты не является штатным.
0x0h
0Ah 15 RDSR RDS Ready — флаг готовности данных RDS/RBDS (1 — данные готовы) 0
14 STC Seek/Tune Complete — флаг завершения поиска/настройки на заданную частоту (1 — операция завершена). 0
13 SF Seek Fail — флаг, сигнализирующий о неуспешном выполнении поиска, когда не удалось найти сигнал с RSSI большим порога SEEKTH 0
12 RDSS RDS Synchronization — индикатор синхронизации RDS.
0 — RDS декодер не синхронизирован;
1 — RDS декодер синхронизирован.
В даташите указано, что данный флаг обновляется только в verbose (подробном) режиме работы RDS (в противопоставление стандартному, менее информативному режиму), однако не уточняется, какой бит отвечает за выбор режима. Судя по тому, что данный флаг обновляется, как и биты BLERA .. BLERD, RDA5807M по умолчанию работает в подробном режиме RDS.
0
11 BLK_E Данный флаг сообщает о получении E блока. 0
10 ST Stereo Indicator.
0 — моно;
1 — стерео.
1
9:0 READCHAN Read Channel. Эти биты содержат значение CHAN, доступны только для чтения. В режиме последовательного доступа к регистрам RDA5807M стартовый адрес для чтения — 0Ah, таким образом нет возможности прочитать значение CHAN регистра 03h. Этим и обусловлено наличие битов READCHAN. 0x0h
0Bh 15:9 RSSI Received Signal Strength Indicator — показатель уровня принимаемого сигнала. 0
8 FM_TRUE Данный флаг сигнализирует о наличии передачи на текущей частоте. То есть приемник настроен на радиостанцию. 0
7 FM_READY Насколько я могу судить, данный флаг идентичен флагу STC 0
6:5 RSVD Биты зарезервированы 00
4 ABCD_E Действующий в США стандарт RBDS помимо блоков A, B, C и D, предусмотренных стандартом RDS, предполагает использование еще одного блока — E. Бит ABCD_E помогает идентифицировать содержимое регистров 0Ch..0Fh как ABCD или E:
0 — A, B, C, D
1 — E
0
3:2 BLERA Block Errors Level Of A — уровень ошибок в блоке A (RDS) или E (RBDS, когда ABCD_E флаг установлен в 1):
00 — нет ошибок;
01 — 1..2 ошибки требуют коррекции;
10 — 3..5 ошибок требуют коррекции;
11 — более 6 ошибок — блок некорректный и не должен использоваться.
1:0 BLERB Block Errors Level Of B — уровень ошибок в блоке B (RDS) или E (RBDS, когда ABCD_E флаг установлен в 1). Значения битов аналогичны BLERA.
0Ch 15:0 RDSA Блок A (в режиме RDS) или E (в режиме RBDS при ABCD_E = 1). 0x5803h
0Dh 15:0 RDSB Блок B (в режиме RDS) или E (в режиме RBDS при ABCD_E = 1). 0x5804h
0Eh 15:0 RDSC Блок C (в режиме RDS) или E (в режиме RBDS при ABCD_E = 1). 0x5808h
0Fh 15:0 RDSD Блок D (в режиме RDS) или E (в режиме RBDS при ABCD_E = 1). 0x5804h
10h 15:14 BLERC Block Errors Level Of C — уровень ошибок в блоке C (RDS) или E (RBDS, когда ABCD_E флаг установлен в 1). Значения битов аналогичны BLERA.
13:12 BLERD Block Errors Level Of D — уровень ошибок в блоке D (RDS) или E (RBDS, когда ABCD_E флаг установлен в 1). Значения битов аналогичны BLERA.

Программирование RDA5807M

Давайте начнем с простенького скетча. Если вы попробуете управлять RDA5807M из моей программы, то обнаружите, что для того чтобы заставить его работать достаточно установить несколько битов: ENABLE, DHIZ, DMUTE, SEEK. Установка последнего запустит поиск радиостанции. Эти же действия можно выполнить программно при помощи следующего скетча:

Подключите RDA5807M к Ардуино по приведенной ранее схеме и залейте в нее скетч. Приемник выполнит поиск и настроится на первую найденную радиостанцию. Бит Tune при этом сбрасывается. Нажатие кнопки Reset на Ардуино и повторное выполнение функции setup будут снова устанавливать этот бит, инициируя поиск следующей станции. Работает? Двигаемся дальше.

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

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

Чтобы настроить RDA5807M на интересующую частоту необходимо установить значения BAND и SPACE и затем изменять только значение CHAN. Итоговая частота определяется по формуле:
F = BAND + CHAN * SPACE.

В скетче используются определенные по умолчанию BAND и SPACE (87..108МГц и 100кГц соответственно). По ним можно определить значение, которое должно быть записано в биты CHAN для получения интересующей частоты. Не забывайте при записи CHAN устанавливать также бит TUNE.

Для изменения громкости значение регистра 05h считывается из RDA5807M в переменную. Затем осуществляется сброс битов VOLUME. И уже после этого можно устанавливать новое значение громкости и записывать результат в регистр.

Для получения RSSI выполняются обратные действия: в считанном из регистра 0Bh значении сбрасываются все биты, кроме содержащих RSSI. Затем результат сдвигается вправо, чтобы младший бит RSSI оказался в младшем разряде переменной. Так мы получим нужное нам значение.

Теперь, когда описаны основные приемы управления RDA5807M, можно приступить к программированию. Нужно лишь определиться с функционалом и интерфейсом.

Добавим LCD дисплей и энкодер

Да, я люблю использовать в своих проектах LCD2004 с I2C интерфейсом и энкодер вращения. Это уже привычные для меня элементы создания пользовательского интерфейса. Используя их, я могу сосредоточиться на текущей задаче, а не заморачиваться с изобретением велосипеда. Поэтому сейчас я добавил их в схему:


Источник: tsibrov.blogspot.com