
В этом тексте я хотел бы рассказать про однокристальный радиоприемник SI4703 от компании Silicon Laboratories.
SI4703 - это миниатюрный настраиваемый FM радио приемник c DSP обработкой, управляемый по I2C, с возможностью принимать бинарные данные от радиостанций по протоколу RDS . Чип производит демодуляцию частотно модулированного сигнала пропускает его через цифровой гетеродин и выдает на наушники аналоговый сигнал. Тут есть два смесителя: первый аналоговый, второй цифровой. Аналоговый смеситель снимает FM сигнал с несущей. Цифровой смеситель подстраивает цифровой гетеродин на конкретную радиостанцию. Это классический гетеродинный приемник.
Теоретический минимум
I2C - это синхронный последовательный полудуплексный, двух проводной способ передачи бинарных данных с топологией общая шина. Данные передаются старшим битом вперед (MSB) в формате big endian.
big-endian - это когда много байтовые типы данных хранятся в памяти и передаются от старшего байта к младшему байту. Прямо как мы все привыкли читать в книжках.
смеситель - электрическая цепь, которая перемножает два сигнала. Это позволяет снять сигнал с несущей частоты
гетеродин - маломощный генератор электрических синусоидальных колебаний, применяемый для преобразования частот сигнала в супергетеродинных радиоприёмниках.
Что потребуется из datasheet-ов?
Название файла |
Страниц |
Si4702/03-C19 BROADCAST FM RADIO TUNER FOR PORTABLE APPLICATIONS |
46 |
AN230: Si4700/01/02/03 Programmer’s Guide |
42 |
Аппаратная часть
У меня есть отладочный модуль с SI4703 от SparkFun.

Подключил я его к учебной электронной плате NUCLEO-F401RE . К слову, антенной выступают сами наушники!

Внутри SI4703 можно обнаружить квадратурный смеситель, ADC, DSP цифровые фильтры, DAC, I2C, SPI трансиверы, внутренний кварц. Автоматическое управление усилением на антенне.

Прежде всего надо собрать прототип. Я соединил модуль FM Tuner Evaluation Board и NUCLEO-F401RE согласно такой таблице
GPIO |
Connector |
Wire Name |
DIR for MCU |
PB8 |
CN10.3 |
I2C1_SCL |
out |
PB9 |
CN10.3 |
I2C1_SDA |
io |
PA1 |
CN7.30 |
RST |
out |
PA4 |
CN7.32 |
SEN |
out |
PA8 |
CN10.23 |
GPIO1 |
out |
PA11 |
CN10.14 |
GPIO2 |
out |

Программная часть
С точки зрения программиста SI4703 выглядит так.

Чип полностью управляется состоянием своих 16-ти внутренних 16-битных регистров. В сумме всего 256 бит чистых конфигов. Прежде, чем читать и писать регистры надо осуществить выбор интерфейса обмена данными между приемником и микроконтроллером. Выбор интерфейса происходит в момент положительного перепада на проводе RESET. Микроконтроллер должен задать GPIO определенные напряжения.
SEN |
GPIO1 |
GPIO3 |
Интерфейс |
1 |
1 |
1 |
I2C |
0 |
0 |
1 |
SPI |
Проще всего выбрать режим I2C. Причину укажу чуть позже. При сканировании I2C шины SI4703 явно отзывается на адреса 0x20 и 0x21. Базовый адрес получается 0b0001_0000.
Адрес, hex |
Тип адреса |
Адрес, bin |
0x20 |
Запись |
0b0010_0000 |
0x21 |
чтение |
0b0010_0001 |
0x10 |
базовый адрес |
0b0001_0000 |
У данного ASIC есть 16 регистров. Вот они перед Вами.

При включении регистры принимают значения
No Addr BinAddr Val BinVal name
1 0x00 0000_0000 0x1242 0001_0010_0100_0010 DeviceID
2 0x01 0000_0001 0x1253 0001_0010_0101_0011 ChipID
3 0x02 0000_0010 0xca01 1100_1010_0000_0001 PowerCFG
4 0x03 0000_0011 0x005c 0000_0000_0101_1100 Channel
5 0x04 0000_0100 0xd804 1101_1000_0000_0100 SysConfig1
6 0x05 0000_0101 0x0010 0000_0000_0001_0000 SYSCONFIG2
7 0x06 0000_0110 0x0111 0000_0001_0001_0001 SYSCONFIG3
8 0x07 0000_0111 0xbc04 1011_1100_0000_0100 TEST1
9 0x08 0000_1000 0x0002 0000_0000_0000_0010 TEST2
10 0x09 0000_1001 0x0000 0000_0000_0000_0000 BOOTCONFIG
11 0x0a 0000_1010 0x0015 0000_0000_0001_0101 StatusRssi
12 0x0b 0000_1011 0x005c 0000_0000_0101_1100 ReadChan
13 0x0c 0000_1100 0x00ff 0000_0000_1111_1111 RDSA
14 0x0d 0000_1101 0x0000 0000_0000_0000_0000 RDSB
15 0x0e 0000_1110 0x0000 0000_0000_0000_0000 RDSC
16 0x0f 0000_1111 0x0000 0000_0000_0000_0000 RDSD
Чтение I2C регистров
Читать регистры можно только разом. То есть сразу все. Причем первым регистром выдается 0x0A, затем 0x0B и так далее до 0x0F. Затем происходит переполнение адреса и следующим выдается регистры 0x00 и 0x01. Сами значения регистров выдаются в формате big-endian, поэтому в микроконтроллере ARM Cortex-M перед разбором битового поля следует инвертировать порядок байт с принятом массиве из восьми U16.

Запись I2C регистров
SI4703 не поддерживает адресации отдельных регистров. Записать можно тоже только разом все регистры. При этом не все регистры можно писать. Поэтому запись начинается со второго регистра. Сами значения регистров надо выдавать в формате big-endian. Выглядит это так

Процедура пуска микросхемы SI4703
Чтобы включить микросхему надо прописать битовые поля ENABLE=1 и DISABLE=0 в регистре 0x02. Далее надо выбрать частоту той радиостанции, которую вы хотите слушать. Настраиваемая частота задается регистрами по этой формуле
Freq (MHz) = ChannelSpacing (kHz) * Channel +Bottom of Band (MHz)
ChannelSpacing задается в регистре System Configuration 2 битами [5;4]. Битовое поле может принимать значения
ChannelSpacing , kHz |
SPACE[1:0] |
Channel Spacing. |
50 |
10 |
-- |
100 |
01 |
(Europe, Japan). |
200 |
00 |
(USA, Australia) |
Начало интервала частот задается в регистре BAND[1:0]. Регистр System Configuration 2 биты [7;6]
Частоты |
code |
Band Select |
87.5–108MHz |
00 |
(USA, Europe) (Default). |
76–108 MHz |
01 |
(Japan wide band). |
76–90 MHz |
10 |
(Japan) |
Reserved |
11 |
-- |
Процедура поиска радиостанции.
SI4703 может также автоматически искать радиостанции. Причем в двух направлениях: следующая и предыдущая. Алгоритм поиска можно настраивать регулируя порог сигнал -шум ( SEEKTH[7:0] ). Для пуска режима поиска надо установить бит SKMODE=1. Как только чип нарвется на радиостанцию установится бит STC .
Микросхема может выдавать прерывание на GPIO2 как только завершится процедура поиска радиостанции. Для этого надо установить бит STCIEN=1 и GPIO2[1:0] = 01.
Недостатки SI4703
При всем уважении к компании Silicon Laboratories, чип всё же имеет ряд недостатков:
-3-wire режим не совместим с классическим SPI, так как требует записи 9 битного числа. STM32 микроконтроллеры аппаратно могут отправить только 8, 16, 24, 32 бит за раз (8*N, где N-натуральное число). Надо как-то программно на конечных автоматах писать SW реализацию этого спец режима 9бит запись, 16 бит чтения и 26 бит запись. Этого мне делать ну никак не хотелось.


-2-wire режим - это тоже не совсем классический I2C. Нет возможности прочитать конкретно только один регистр. Надо вычитывать разом весь регистровый файл (32 байт) и уже потом только программно выхватывать нужный регистр. Формат значений передается в big-endian. Причем чтение происходит начиная с регистра 0x0A (0Ah), а запись происходит начиная с 02h.Это сверх контр интуитивно!

-SI4703 не может выдавать звук в цифровом виде в I2S или TDM. Хотя цифровое ядро внутри присутствует. Поэтому выдаваемый аудиопоток не сохранить на стороне МК.
Что полезного можно извлечь из RDS?
Ранее некоторые радиостанции вещали текущую композицию и её исполнителя, а потом, после того как они стали на этом делать деньги, по принципу «отправь SMS с кодом на такой-то номер и узнай кто поёт эту песню», они перестали транслировать наименование композиции и исполнителя. Сейчас, конечно, им бизнес попортило мобильное приложение Shazam, поэтому функция песня по SMS и не особо стала актуальна. По факту в Москве RDS не используют даже на четверть. Присылают только название радиостанций. Номер телефона радиостанции, или название песни в пакете Radio Text.
Достоинства микросхемы SI4703
+Присутствует автоматический поиск радиостанции (Seek tuning)
+ Чип хорош за счет того, что есть константные регистры: DEVICE_ID и CHIP_ID. Далеко не все производители микросхем так хорошо делают.
Название Регистра |
Адрес регистра |
Смешение регистра |
Значение по умолчанию |
DEVICE_ID |
0x00 |
6 |
0x1242 |
CHIP_ID |
0x01 |
7 |
0x1200 |
Вот выдержка из даташита.

Это позволяет накропать модульные тест на наличие соединения между микроконтроллером и приемником. Буквально прочитали, проверили. Если константа совпала значит связь есть. Иначе ищем проблемы с в подключении, проводах и настройках.
+Присутствует регистр TEST_2, который можно прописать. Это позволяет написать модульный тест на проверку корректности процедуры записи. Буквально прописать 0x1234 прочитать регистр 0x80. Проверить, что прочитанное в самом деле равно 0x1234. Если да, то тест пройден и можно заключить, что запись работает. Иначе искать ошибку в коде записи. При этом запись в этот регистр не сбивает никаких других настроек. TEST_2 - это чисто тестировочный регистр.

+Можно регулировать громкость по I2C.
Что хорошего можно сделать с SI4703?
+Можно сделать прибор для получения точного времени по протоколу RDS, при условии что в вашем городе радиостанции передают по RDS точное время.
+Можно сделать FM радио приемник с управлением от ИК TV пульта
+Можно встраивать чип в мобильные телефоны и рации.
Результаты
Удалось научиться пользоваться микросхемой SI4703. Удалось читать и писать ее регистры, включать микросхему, выбирать радиостанции и регулировать громкость.
Надеюсь этот текст поможет кому-нибудь быстро интегрировать SI4703 в свои проекты.
Сокращения
RDS |
Radio Data System |
AFC |
automatic frequency control |
SDIO |
serial data in/data out pin |
I2C |
Inter-Integrated Circuit |
ASIC |
Application Specific Integrated Circuit |
SCLK |
serial clock pin |
FM |
frequency modulation |
MPX |
stereo multiplexed signal |
ADC |
analog-to-digital converter |
DAC |
digital-to-analog converters |
DSP |
digital signal processing |
RF |
Radio frequency |
I2S |
Inter-Integrated Circuit Sound |
SEN |
serial enable pin |
VCO |
Voltage-Controlled Oscillator |
IF |
intermediate frequency |
AGC |
automatic gain control |
LNA |
low noise amplifier |
Источники
Si47XX: руководство по программированию |
https://microsin.net/programming/arm/si47xx-programming-guide.html |
Si4700/01/02/03 PROGRAMMING GUIDE |
https://xn--p8jqu4215bemxd.com/wp-content/uploads/2020/11/AN230.pdf |
Прием RDS данных @aabzel |
|
SDR приемник GPS на микроконтроллере |
|
RDS, как это работает? Опускаемся на самый нижний уровень модели OSI |
|
SparkFun FM Tuner Evaluation Board - Si4703 |
https://www.sparkfun.com/sparkfun-fm-tuner-evaluation-board-si4703.html |
Вопросы
-Что такое de-emphasis ? Фильтр, который ослабляет высокие частоты для восстановления ровной частотной характеристики.
-Как можно аппаратным SPI на микроконтроллерах STM32 отправить ровно 9 бит или ровно 26 бит?
AVKinc
Это типичная статья нейросети, много воды, масса ошибок, ноль полезной информации.