В этом тексте я хотел бы рассказать про однокристальный радиоприемник 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

https://habr.com/ru/articles/687898/

SDR приемник GPS на микроконтроллере
@iliasam

https://habr.com/ru/articles/789382/

RDS, как это работает? Опускаемся на самый нижний уровень модели OSI
@DmitrySpb79

https://habr.com/ru/articles/303104/

SparkFun FM Tuner Evaluation Board - Si4703

https://www.sparkfun.com/sparkfun-fm-tuner-evaluation-board-si4703.html


Вопросы

-Что такое de-emphasis ? Фильтр, который ослабляет высокие частоты для восстановления ровной частотной характеристики.
-Как можно аппаратным SPI на микроконтроллерах STM32 отправить ровно 9 бит или ровно 26 бит?

Комментарии (1)


  1. AVKinc
    26.11.2025 11:42

    Это типичная статья нейросети, много воды, масса ошибок, ноль полезной информации.