Режим произвольного доступа к внутренним регистрам.

реклама
Радиомодуль с RDA5807M продлевает «жизнь» старых радиоприёмников.
У многих радиолюбителей хранятся как раритеты старые
радиоприёмники, такие как «ВЭФ», «Океан» и т. п., которые дороги как память,
но либо уже не работают, либо не используются по причине проблем с
радиовещанием на ДВ и СВ, да и на УКВ сейчас вещает мало радиостанций.
Появившийся в последнее время в продаже дешёвый FM радио-модуль на
базе микросхемы RDA5807М имеет малые размеры неплохие параметры, что
позволяет встраивать его практически в любой радиоприёмник, продлив тем
самым его «жизнь».
Основные технические параметры RDA5807М.
— Поддержка выбора диапазона приёма в пределах 50…115 МГц.
— Четыре возможных шага перестройки частоты: 100КГц, 200КГц, 50КГц и
25КГц.
— Поддержка приёма текстовых данных в формате RDS/RBDS.
— Встроенный цифровой синтезатор частоты.
— Встроенный автономный автопоиск радиостанции.
— Возможность работы от часового кварца на частоте 32768 Гц.
— Автоматическая регулировка усиления.
— Цифровое адаптивное подавление шума.
— Возможность выбора режима воспроизведения моно или стерео.
— Возможность включения подъёма усиления низких частот (басов), что важно
в случае применения малогабаритных динамиков.
— Индикатор уровня сигналов.
— Индикатор стерео сигнала.
— Цифровой регулятор громкости и выключатель звука (MUTE).
— К встроенному УМЗЧ можно подключать головные телефоны (32 Ом).
— Корпус MSOP (10 выводов).
Электрические параметры RDA5807М.
— Напряжение питания 1,8…3,3 В.
— Ток потребления в рабочем режиме до 21 мА.
— Ток потребления в спящем режиме 5 мкА.
— Коэффициент нелинейных искажений 0,15…0,2 %.
— Максимальная тактовая частота интерфейса I2C 400 КГц.
Похоже на то, что микросхема RDA5807М является усечённым вариантом
цифрового радиоприёмника RDA5807P. Например в даташите на RDA5807М
упоминается параметр INT_MODE - разрешение прерываний, но для сигнала
прерывания не предусмотрено никакого выхода, в отличие от RDA5807P, где
этот сигнал появляется на выводе GPIO2. Найти руководство по
программированию для RDA5807М мне не удалось, поэтому приходится
пользоваться руководством для RDA5807P, которое не совсем подходит для
микросхемы RDA5807М, к тому же на китайском языке.
Запись и чтение данных микромодуля RDA5807M производится по
двухпроводному интерфейсу I2C и вызывает много вопросов у радиолюбителей,
судя по количеству постов на различных форумах, посвящённых этой теме.
Поэтому, думаю, будет не лишним поделиться своим опытом применения
радиомодуля и обобщить информацию о нём, добытую из различных форумов и
других источников.
Интерфейс I2C совместим с протоколом шины I2C Спецификации 2.1. Он
оперирует двумя выводами модуля: SCL и SDА. При записи, байты данных
передаются микроконтроллером (далее – МК), а при чтении, байты данных
считываются из RDA5807M. Интерфейс I2C модуля RDA5807M позволяет
организовать три различных способа обмена данными. Для этого нужно
передать соответствующий командный байт. Командный байт содержит 7-ми
битный адрес чипа и младший бит (b0 = R/W), определяющий команду записи
(W=0) или чтения (R=1).
1) Режим группового последовательного доступа к внутренним регистрам:
команда записи - (0х20), команда чтения - (0х21).
2) Режим произвольного доступа к внутренним регистрам:
команда записи - (0х22), команда чтения - (0х23).
3) Режим поддержки совместимости с чипом TEA5767:
команда записи - (0хС0), команда чтения - (0хС1).
Режим группового последовательного доступа к внутренним регистрам.
Внутренние регистры имеют фиксированный начальный адрес (0x02h) для
записи данных и (0x0Ah) для чтения, и внутренний инкрементальный счётчик
адреса. Когда значение регистра адреса достигает конца регистрового файла
(0x3Ah), счётчик адреса будет сброшен в (0x00h). Регистры модуля 16-ти
разрядные, поэтому МК передаёт или принимает данные побайтно, сначала
старшие 8 бит регистра, затем младшие. После передачи восьми бит каждого
байта передаётся девятый бит подтверждения ACK (SDA=0) или NACK
(SDA=1). Бит ACK (или NACK) всегда посылает получатель.
Передача данных для записи через интерфейс I2C начинается с
формирования условия «START», затем следуют командный байт и байты
данных, и заканчивается формированием условия «STOP». При этом MК
сначала передаёт в регистр 0x02h старшие 8 бит, затем передаёт в регистр 0x02h
младшие 8 бит, после чего передаёт в регистр 0x03h старшие 8 бит, и так до
последней записи. После каждого принятого байта модуль RDA5807M всегда
выдает ACK, а MК выдает условие «STOP», когда программирование регистров
закончено.
При чтении данных из регистров модуля, после командного байта от MК,
модуль RDA5807M посылает из регистра 0x0Ah сначала старшие 8 бит, затем из
регистра 0x0Ah передаются младшие 8 бит, после чего из регистра 0x0Вh
сначала старшие 8 бит, и так до тех пор, пока не получит NACK от MК. MК
выдаёт ACK для каждого байта данных кроме последнего байта данных, чем
сообщает модулю о том, что приём данных окончен. После того, как MК выдаст
NACK для последнего байта данных, модуль RDA5807M освобождает шину
данных микроконтроллеру, и MК выдаёт условие «STOP».
Модуль RDA5807M сам себя сбрасывает, при подаче питания. А также
поддерживается программный сброс путём переключения бита 1 в регистре 02H
с 0 в 1.
Режим произвольного доступа к внутренним регистрам.
В режиме произвольного доступа к внутренним регистрам модуля
RDA5807M после командного байта, определяющего запись или чтение, МК
передаёт адрес внутреннего регистра, к которому будет обращение для записи
или чтения.
Приведённая ниже таблица показывает порядок следования данных при
записи в режиме произвольного доступа к внутренним регистрам. Цветом
выделены данные, которые передаёт микроконтроллер.
START
I2C CHIP
ADDRESS
W
ACK
REGISTER
ADDRESS
ACK
REGISTER
BIT <15:8>
ACK
REGISTER
BIT <7:0>
ACK/
NACK
STOP
STOP
NACK
REGISTER
BIT <7:0>
ACK
REGISTER
BIT <15:8>
R
ACK
I2C CHIP
ADDRESS
START
ACK/NACK
REGISTER
ADDRESS
W
ACK
I2C CHIP
ADDRESS
START
Следующая таблица показывает порядок следования данных при чтении в
режиме произвольного доступа к внутренним регистрам. Цветом выделены
данные, которые передаёт микроконтроллер.
Работа модуля в режиме совместимости с чипом TEA5767 мною не
проверялась, но из сообщений на различных форумах можно узнать, что при
замене модуля с чипом TEA5767 на модуль с RDA5807M радиоприёмник
нормально работает без изменения программы управляющего МК.
Прочитав ряд статей на тему FM-радиоприемника на модуле RDA5807М, в
том числе «FM радио модуль RDA5807M» и «Будильник радио», я решил
повторить схему, приведённую в статье по первой ссылке (автор Gauss).
Собранный радиоприёмник заработал сразу и сразу же обнаружились некоторые
недостатки. Впрочем, это никоим образом не умаляет значение этой хорошо
проиллюстрированной статьи, которую перепечатали уже многие другие сайты.
Как известно, тому, кто идёт впереди всегда труднее, да и нет предела
совершенству. Идя по следам этого автора другие радиолюбители, каждый на
свой вкус, добавляют к этому радиоприёмнику кто часы, кто термометр, кто
чтение сообщений по RDS. Вот и я в их числе.
Итак, что же меня подкупило в этой реализации радиоприёмника? Это простота
схемы, наличие исходников с подробными комментариями, возможность
выводить на дисплей названия местных радиостанций, дешевизна
комплектующих.
Теперь о том, что не устроило после сборки радиоприёмника.
1. Приём сопровождается помехой, которая прослушивается на фоне
радиопередачи в виде рокота. Особенно этот рокот заметен при
прослушивании маломощных радиостанций. Если нажать и удерживать
кнопку сброса микроконтроллера, то этот шум исчезает.
2. При включении радиоприёмник не начинает работать пока не нажмёшь на
какую-нибудь кнопку. Чтобы настроиться на последнюю перед
выключением станцию, частота которой сохраняется в EEPROM,
необходимо нажать на кнопку сброса микроконтроллера.
3. Отсутствует автоматическая настройка на станцию. Использовать для
настройки кнопки “+F” и “- F” с шагом настройки ±100 КГц очень
неудобно, т. к. для того, чтобы пройти весь диапазон нужно будет нажать
на кнопку 210 раз.
Возможно автор и рад бы добавить в программу автоматическую настройку
или другие какие-либо функции, но память программ микроконтроллера уже
и так забита почти под «завязку», т. к. программа написана на языке С.
Поэтому было решено написать программу на ассемблере. Чтобы не
переделывать готовую схему в макете, я оставил прежнюю распайку выводов
микроконтроллера ATMega8, поэтому схема приёмника, приведённая на
рис.1, практически не отличается от схемы в упомянутой выше статье.
Основные функции программы:
— Диапазон частоты настройки 87,0…108 МГц.
— Шаг настройки частоты приёма 100 КГц.
— Перебор станций, сохранённых в памяти программ вверх и вниз по списку
в таблице при помощи кнопок “+St” и “- St”.
— Полуавтоматическая настройка на станцию вверх и вниз по диапазону при
помощи кнопок “+F” и “- F”.
— Запись текущей частоты настройки в EEPROM.
— Отдельный индикатор стереосигнала на светодиоде.
— Вывод на индикатор частоты и названия станции.
— Частота станции выводится цифрами удвоенной величины.
— При включении - начинает работу на сохранённой частоте.
— Используется аппаратный интерфейс I2C микроконтроллера ATMega8.
Рис.1.
Вывод подсветки индикатора соединён с выводом питания, т. к. у меня
был индикатор на плате синего цвета. Для индикаторов на плате красного цвета
этот вывод нужно соединить с общим проводом. Выходные сигналы с тьюнера я
подавал на вход УМЗЧ радиоприёмника. Качество приёма неплохое. При приёме
слабых сигналов имеет значение положение антенны. При автопоиске иногда
пропускает слабые станции и останавливается на частотах с высоким уровнем
шумов, чтобы это уменьшить можно поэкспериментировать с подбором порога
отношения сигнал/шум при поиске (Seek SNR threshold value).
В памяти МК записаны частоты и названия радиостанций, вещающих в нашем
городе. Их легко можно изменить на действующие в вашей местности, не
вдаваясь в детали работы программы и затем перекомпилировать программу.
Текст сообщений на дисплей можно выводить как латиницей, так и кириллицей.
Соответствующие шрифты содержатся в файле Font_6x8.asm, который входит в
архив с исходниками.
При программировании МК необходимо запрограммировать следующие
фьюзы: CKSEL0, CKSEL1, CKSEL3 и SUT0.
Скачать архив с прошивкой, исходниками и файлами Proteus`а.
В некоторых случаях более подходящим для переделки старого
радиоприёмника или для оформления нового будет символьный дисплей. На
рис. 2 представлен вариант схемы цифрового FM радиоприёмника с
двухстрочным символьным дисплеем WH1602 на базе контроллера HD44780.
Рис. 2.
На этой схеме индикатор и микроконтроллер питаются от источника +5 В,
а радиомодуль от +3,3 В, поэтому для связи с радиомодулем пришлось
установить преобразователи уровня на транзисторах VT1 и VT2. Основные
функции программы МК такие же, как и в предыдущей схеме. В моём
индикаторе был зашит только латинский шрифт, поэтому и вывод сообщений на
дисплей был возможен только латиницей. Но при желании можно, конечно,
использовать и дисплей с кириллицей. В конце наименования таких дисплеев
присутствует индекс СТ или СР.
Скачать архив с прошивкой, исходниками и файлами Proteus`а.
Объём кода управляющей программы для радиоприёмника,
представленного на рис. 1, получился немногим более двух килобайт, поэтому у
меня возникла идея применить микроконтроллер ATtiny2313, имеющий
меньшие размеры памяти. Для этого программу пришлось ужать за счёт
сокращения шрифтов, в остальном все функции радиоприёмника сохранены.
Вывод сообщений на экран такой же как и в схеме на рис.1. Из набора шрифтов
удалены знаки препинания и др. вспомогательные знаки, а также оставлен набор
букв только одного алфавита. На удобство пользования это почти не отразилась,
просто теперь нельзя одновременно видеть не экране латинские и русские
буквы. Памяти МК хватило для записи названий и частот 14-ти местных
радиостанций. Схема такого варианта приёмника приведена на рис.3.
Рис. 3.
Питание приёмника, как и на схеме по рис. 1, подаётся от стабилизатора на
напряжение 3,3 В. По ссылкам ниже можно скачать архивы с прошивками для
вывода сообщений на латинице и на кириллице.
Скачать архив с прошивкой и исходниками (вывод латиницей).
Скачать архив с прошивкой и исходниками (вывод кириллицей).
Ну и для комплекта, на рис. 4 приведена схема FM-радиоприёмника на
микроконтроллере ATtiny2313 с ЖК индикатором WH1602 на базе контроллера
HD44780.
Рис. 4.
По ссылке ниже можно скачать архив с файлами для этого варианта
радиоприёмника. При программировании МК ATtiny2313 необходимо
запрограммировать такие же фьюзы, что и для ATMega8, а именно: CKSEL0,
CKSEL1, CKSEL3 и SUT0. Привожу скриншот из программы CodeVision на
рис.5.
Рис. 5.
Скачать архив с прошивкой, исходниками и файлами Proteus`а.
Открыв файл проекта в программе Proteus вы можете понаблюдать каким
образом выводится текстовая информация на дисплей. Все схемы тестировались
на макете и показали свою полную работоспособность.
Скачать