SI4735

SI473X Library for Arduino

View on GitHub

Biblioteca Arduino para o Si4735

Esta é uma biblioteca para o ambiente de desenvolvimento Arduino que implementa as funções para a linha de CI SI4735, BROADCAST AM / FM / SW RADIO RECEPTOR da Silicon Labs. Esta biblioteca tem o propósito de fornecer uma interface de programação mais amigável aos projetistas de rádios baseados na família SI47XX. A comunicação usada por esta biblioteca é I2C. Consulte as Características desta Biblioteca para mais detalhes.

Esta biblioteca foi construída com base nos documentos AN332 Si47XX PROGRAMMING GUIDE e AN332 REV 0.8 UNIVERSAL PROGRAMMING GUIDE AMENDMENT FOR SI4735-D60 SSB AND NBFM PATCHES. Assim, esta biblioteca poderá ser utilizada em todos os integrantes da família SI47XX, respeitando, é claro, as funcionalidades disponíveis para cada versão do CI. Siga o sumário abaixo para tirar melhor proveito deste documento.

Esta biblioteca pode ser livrimente copiada e distribuída. O modelo de licença utilizado é o do MIT, cujos termos podem ser lidos no documento license.txt. Copyright (c) 2019 Ricardo Lima Caratti

Contato: pu2clr@gmail.com

Sumário

  1. Licença MIT e Direito Autorais
  2. Agradecimentos
  3. Sua participação é importante
  4. Sobre o SI4735
  5. Terminologia
  6. Características desta Biblioteca
  7. Como instalar esta biblioteca
  8. Utilizando Arduino para controlar o Si4735
  9. Requisitos de hardware e configuração
  10. Documentação das funções da Biblioteca
  11. Referências
  12. Exemplos
  13. Vídeos

Atenção

Grupos de discussão e foruns

Há um grupo de discussão no facebook denominado Si47XX para radioescutas onde o propósito é trocar experiências com projetos baseados na família de CI SI47XX da Silicon Labs. Você será bem-vindo ao grupo Si47XX para radioescuta.

Há também um seleto grupo na plataforma group.io denominado SI47XX for hobbyists. Se você se sentir confortável com o idioma inglês, também será bem-vindo neste grupo.

Licença e Direito Autorais

Copyright (c) 2019 Ricardo Lima Caratti

Esta biblioteca pode ser utilizada seguindo a licença de Software Livre do MIT, cujo texto traduzido de forma livre pode ser conferido a seguir:

A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos, incluindo a documentação, associados à esta biblioteca. É permitido usar, modificar, distribuir, juntar com outro software, publicar, fazer sublicença e negociar, sob as seguintes condições:

Os Direitos Autorais e as permissões supracitadas devem ser incluídos em todas as cópias ou partes copiadas desta biblioteca.

IMPORTANTE:

ESTA BIBLIOTECA É FORNECIDA “TAL COMO ESTÁ”, SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA. EM NENHUM CASO O AUTOR OU TITULAR DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE.



Agradecimentos

Sua participação é importante

Se você tem interesse em fornecer suporte de desenvolvimento a esta biblioteca, junte-se a este projeto via Github. Se preferir, faça sugestões sobre funcionalidades que você gostaria que estivesse disponível nesta biblioteca.

Sobre o SI4735

O SI4735 é um rádio DSP (Digital Signal Processing) encapsulado em um CI fabricado pela Silicon Labs que possui ótimo desempenho em AM e SSB ( Single Side Band) nas faixas de LF, MF e HF, bem como em FM (estações comerciais locais). O SI4735 pode ser controlado por meio de um microcontrolador como o ATmega328, ATtiny85, ESP32 ou outro de sua preferência. Para fazer o SI4735 executar uma ação, o microcontrolador precisa enviar um conjunto de bytes (comando e argumentos) que o dispositivo interpreta e executa a ação desejada. Uma vez executado o comando, o Si4735 é capaz de fornecer uma sequência de bytes (respostas) que podem ser tratados pelo micro controlador. Há centenas de comandos disponíveis que o Si4735 pode executar. Via comandos, é possível mudar a frequência, o modo (AM ou SSB), ler informações em tempo real como o RSSI, SNR, status de estéreo ou mono, aplicar filtros de largura de banda, aplicar atenuações e muito mais.

A Silicon Labs descreve o Si4735 como um circuito integrado CMOS que encapsula um receptor capaz de demodular AM e FM. Contudo, é importante ressaltar que no caso específico da linha do CI Si4735-D60, é possível também demodular SSB e NBFM (Narrow Band FM) por meio de aplicações de patches (atualizações de firmware) sem que um único componente de hardware seja adicionado ao sistema.

O Si4735 possui entradas de RF onde será conectado um front-end e saídas analógica e digital de áudio. Via comandos, é possível controlar o CI para interagir com um front-end do receptor bem como ajustar o volume (amplitude) da saída de áudio. Descrever todas as possibilidades de configuração deste CI deixaria este artigo muito extenso. Para mais detalhes sobre as possibilidades deste dispositivo, recomenda-se a leitura do documento [AN332] referenciado no final deste artigo.

O objetivo deste documento é fazer uma breve introdução ao Si4735 e orientar o leitor interessado em construir um receptor baseado neste CI usando a plataforma de desenvolvimento Arduino. Não é objetivo deste documento discorrer sobre o Ambiente de Desenvolvimento Arduino em si. Tampouco, ensinar a programar neste ambiente. Diante disso, para melhor aproveitamento do conteúdo deste artigo, é importante que o leitor tenha algum conhecimento básico sobre o Arduino IDE, bem como em linguagem de programação C/C++.

Diagrama de Bloco do SI4735

A figura a seguir apresenta o diagrama de bloco do SI473X-D60. É importante observar o destaque em vermelho inserido pelo autor desta biblioteca observando as tensões de trabalho da interface do SI4735.

SI473X Block Diagram

Ainda em relação a figura anterior, é importante observar o destaque em vermelho inserido pelo autor deste documento chamando a atenção para as tensões de trabalho da interface de controle do SI4735. Embora a parte analógica do CI possa ser alimentada com uma tensão de 5V, a interface de controle (onde será conectado o Arduino ou similar) deve obedecer aos limites máximos e mínimos de 1.6 e 3.6V respectivamente. Como será visto mais adiante, os esquemas apresentam a alimentação tanto da interface de controle (VD) como os demais componentes analógicos do CI (VA) com uma tensão de 3.3V, já que esta tensão está perfeitamente aderente às duas faixas de tensão estabelecidas no diagrama de bloco. Desta forma, não será preciso utilizar duas fontes distintas para alimentar o sistema. É provável, no entanto, que utilizar fontes separadas, uma para o subsistema e analógico e outro para o subsistema digital do CI resulte em algum benefício em relação a redução de ruídos causados pelo subsistema digital. Contudo, o que pode ser afirmado no experimento deste artigo é que, utilizando somente uma fonte para alimentar tanto a parte analógica como a parte digital, os receptores exemplos funcionaram de forma satisfatória.



Principais características do Si4735

Os receptores apresentados neste documento, são exemplos de uso das funções da biblioteca. No entanto, boa parte destes exemplos, permitem a sintonia de estações em todas as faixas de HF nos modos AM e SSB além das estações locais em AM (MW) e FM. Com isso, é possível, por exemplo, sintonizar rodadas de radioamadores em 40 metros no modo LSB (Lower Side Band), QSO por voz e Código Morse (CW) em contestes nas faixas dos 20, 15 e 10 metros no modo USB(Upper Side Band). Em AM e USB é possível também escutar estações na faixa do cidadão. O receptor conta com filtros que permitem separar o sinal de estações adjacentes além de eliminar ruídos indesejáveis. Este recurso também facilita a escuta em CW. Com a ajuda de um computador, é possível também decodificar sinais na modalidade FT8, JT9, JT65, PSK e muito mais.


Terminologia

Term Description
API Application Programming Interface. Neste contexto, é um conjunto de rotinas e padrões estabelecidos por esta Biblioteca para simplificar a programação de programas para Arduino. Neste caso, a programação do SI4735
Arduino Libraries Neste contexto, “Libraries” (bibliotecas) são arquivos escritos em C or C++ (.c, .cpp) que podem ser utilizados em programas (sketches) Arduino. A biblioteca SI4735 para Arduino oferece facilidade de programação do SI4735 no ambiente Arduino
IDE Integrated Development Environment (Ambiente Integrado de Desenvolvimento)
Sketch Nome comumente usado para referenciar um programa para Arduino
interrupt Neste contexto, é um recurso de programação utilizado para tratar eventos disparados pelo micro controlador.
C++ É uma linguagem de programação orientada a objetos. Pode ser entendida como uma extensão da linguagem C que permite o desenvolvimento de programas e bibliotecas usando a abordagem Orientada a Objetos.
POC Proof of Concept (Prova de Conceito)
SEN Serial enable pin, active low; used as device select in 3-wire and SPI operation and address selection in 2-wire operation
SDIO Serial data in/data out pin
SCLK Serial clock pin
RST Also RSTb—Reset pin, active low
RCLK External reference clock
GPO General purpose output
CTS Clear to send
STC Seek/Tune Complete
NVM Non-volatile internal device memory
CMD Command byte
COMMANDn Command register (16-bit) in 3-Wire mode (n = 1 to 4)
ARGn Argument byte (n = 1 to 7)
STATUS Status byte
RESP Response byte (n = 1 to 15)
RESPONSEn Response register (16-bit) in 3-Wire mode (n = 1 to 8)
Soft Mute É um recurso utilizado para atenuar os ruídos na saída de áudio quando a estação captada for muito fraca
Firmware Upgrades O CI Si473x-D60 permite acomadar pequenos ajustes em seu firmware em sua memória RAM interna



Características desta Biblioteca

Esta biblioteca usa o protocolo de comunicação I2C e implementa a maioria das funções oferecidas pelo Si4735 (BROADCAST AM / FM / SW / LW RADIO RECEPTOR).

  1. Open Source
  2. Totalmente baseada no Si47XX PROGRAMMING GUIDE
  3. Programação Orientada a Objetos usando C++
  4. Disponível no Ambiente de Desenvolvimento do Arduino
  5. Simplifica projetos de rádios baseados no SI4735
  6. Utiliza o protocolo de comunicação I2C
  7. Suporte à SSB.
  8. Suporte à RDS.

Como instalar esta biblioteca

Em um contexto mais amplo, o Arduino pode ser entendido como um ambiente de desenvolvimento e prototipação de projetos eletrônicos. Se tornou muito popular devido ao baixo custo de aquisição e a facilidade de uso. Basicamente uma placa Arduino consiste em um microcontrolador com vários terminais de entrada e saída digitais e analógicas. Para facilitar o processo de gravação de programas, em geral, uma placa Arduino conta também com uma interface serial ou USB (Universal Serial Bus) que permite a comunicação com um computador onde deve residir o programa Arduino IDE (editor de código-fonte, compilador e ligador). Atualmente o Ambiente Integrado de Desenvolvimento para Arduino (Arduino IDE) foi muito além do seu objetivo inicial. Com este IDE, é possível programar para inúmeras plataformas de hardware, sendo as mais populares as plataformas baseadas no ATmega328P, Mega2560, ATtiny85, ARM, STM32 e ESP32.

É possível instalar a biblioteca Arduino para o SI4735 ou correlato no ambiente de desenvolvimento do Arduino (IDE) usando diferentes abordagens. Recomendo as descritas a seguir.

Instalação via Arduino IDE

Este é o método mais fácil.

Installing from Arduino IDE 01



Installing from Arduino IDE 02


Instalação baixando os arquivos deste repositório

Installing from this repository



Installing from this repository


Primeiro, você deve baixar esta biblioteca no formato zip. CLique aqui para download to download.

Descompacte o arquivo SI4735.zip dentro da pasta Arduino Library.



Utilizando Arduino para controlar o Si4735

Conforme dito anteriormente, há vários tipos de arquiteturas de microcontroladores que podem ser utilizadas no Arduino IDE. Este documento, utilizará com base a placa Arduino Pro Mini 3.3V (8MHz). Porém, há vários outros exemplos apresentados nesta documentação com outras placas e processadores. O Arduino Pro Mini 3.3V possui o microcontrolador ATmega328P, opera com uma tensão de 3.3V e com o clock de 8MHz. As principais razões para utilizar esta placa Arduino são: o baixo custo de aquisição, a simplicidade de montagem e a compatibilidade de tensão com o CI Si4735, evitando desta forma, componentes extras para efetuar a conversão de tensão entre os dois dispositivos (Arduino e Si4735).

O leitor mais experiente poderá optar por outro tipo de controlador suportado pelo ambiente de desenvolvimento Arduino bem como pela Biblioteca Arduino para o Si4735. Contudo, terá que ter alguns cuidados quanto à conversão de tensão bem como a disposição de pinos.

Requisitos de hardware e configuração

Esta biblioteca foi escrita para a plataforma Arduino é foi testada com sucesso no Arduino Pro Mini (3.3V).

Arduino 5V and Si4735

Se você usar uma versão 5V do Arduino, UNO por exemplo, utilize alguma estarégia de conversão para conectá-lo ao Si47XX. Considere também verificar os pinos do Arduino que você estiver utilizando para a conexão correta com o SI47XX (RST, SDA, SCL etc). A tabela a seguir apresenta a pinagem de algumas placas Arduino.

Board InterrupT (IRQ) Pins I2C / TWI pins
328-based
(Nano, Mini or Uno)
D2 and D3 A4 (SDA/SDIO), A5 (SCL/SCLK)
Mega 2, 3, 18, 19, 20 and 21 20 (SDA/SDIO), 21 (SCL/SCLK)
32u4-based
(Micro, Leonardo or Yum)
0, 1, 2, 3 and 7 2 (SDA/SDIO), 3 (SCL/SCLK)
Zero all digital pins except pin 4 D8 (SDA/SDIO) and D9 (SCL/SCLK)
Due all digital pins 20 (SDA/SDIO), 21 (SCL/SCLK)
101 all digital pins.
Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE
 

Esquema básico

Os esquemas apresentados neste documento foram baseados no circuito proposto pela Silicon Labs no documento “Si4730/31/34/35-D60 - BROADCAST AM/FM/SW/LW RADIO RECEIVER; Application Schematic; página 19”. Em conjunto ao circuito proposto pelo fabricante, encontra-se o módulo controlador (Arduino) incluindo pelo autor deste artigo. Também foram adicionados ao circuito proposto pela Silicon Labs, dois resistores “pull-up” ao barramento I²C e dois capacitores na saída de áudio.

O esquema a seguir corresponde ao rádio mínimo. Nele, não há display, botões ou encoder conectados ao circuito. O objetivo deste esquema mínimo é possibilitar o teste das conexões do Si4735 com o Arduino bem como o programa. Todo o controle do rádio poderá ser feito via o ambiente de programação Arduino IDE (Monitor Serial). Recomenda-se fortemente que os primeiros passos sejam com o circuito mínimo e o sketch Arduino mínimo para garantir o sucesso da montagem bem como as suas evoluções. Esta abordagem parte do princípio que quanto menos componentes, seja de hardware ou de software, o experimentador utilizar, menos componentes precisarão ser analisados em casa de falhas.

Basic Schematic

Ainda em relação à figura anterior, o pino SEN (pino 16 do Si4735) poderá ser ligado ao terra (GND) ou ao +3.3V. No entanto, é importante ressaltar que isso mudará o endereço do barramento I²C. Preferivelmente, coloque este pino conectado ao terra (a biblioteca Arduino que será usada neste experimento, utiliza esta configuração como padrão). Em relação às entradas de sinal de RF para FM e AM (LW, MW e SW), considere as recomendações do documento “Si47XX ANTENNA, SCHEMATIC, LAYOUT, AND DESIGN GUIDELINES”. Para elaboração de teste em SW nos modos AM e SSB, foi utilizado com resultados satisfatórios, simplesmente um capacitor de 470nF na entrada AMI (pino 12). Embora não utilizado no experimento deste artigo, um circuito de proteção nas entradas de RF (ESD DIODE) é uma recomendação do fabricante que não pode ser descartada em uma versão aprimorada do protótipo utilizado aqui.

MAIS UMA VEZ É IMPORTANTE RESSALTAR QUE O SI4735 OPERA COM TENSÕES INFERIORES A 5V. PORTANTO, NÃO O UTILIZE CONECTADO A UM ARDUINO DE 5V SEM UMA ESTRATÉGIA DE CONVERSÃO DE TENSÃO.



The image bellow shows the Slicon Labs SSOP Typical Application Schematic.

Silicon Labs Schematic



Lista de componentes

A tabela a seguir apresenta a lista de componentes utilizados para construir o protótipo do rádio baseado no SI4735. Observe os componentes adicionados ao circuito original proposto pela Silicon Labs.

Part Description
C1 22nF Monolithic Multilayer Chip Ceramic non polarized capacitor (Place it close to VA pin)
C2 1nF Monolithic Multilayer Chip Ceramic non polarized capacitor
C3 470nF Monolithic Multilayer Chip Ceramic non polarized capacitor
C4 100nF Monolithic Multilayer Chip Ceramic non polarized capacitor (Place it close to VD pin)
C5 and C6 22pF (Crystal load capacitors)
C7 and C8ˆ1 4.7uF Monolithic Multilayer Chip Ceramic non polarized capacitor
R3 2.2K
(R4 and R5)ˆ2 Entre 2K e 10K (pull-up resistors)
L1 Ferrite loop stick (about 500 μH)
X1 32.768 kHz crystal
SI4735 CI CMOS que implementa um rádio AM(LW, MW and SW)/FM

Recomendações da Silicon Labs para serem consideradas durante a montagem do rádio __Veja “Silicon Labs Broadcast AM/FM/SW/LW Radio Receiver Documentation”:

Placas testadas com a Biblioteca Arduino para o SI4735

Esta biblioteca foi desenvolvida para funcionar em várias plataformas de Hardware. A tabela a seguir ilustra as plataformas em que esta biblioteca foi testada com sucesso.

Silicon Labs Schematic

Board Need voltage converter I²C Pins Used Reset Pin Features
Arduino Pro Mini 3.3V 8MHz No A4 and A5 12 More…
Mega 2560 Pro Yes 20 and 21 12 More…
ESP WEMOS LOLIN32 No 21 and 22 [ˆ4] 25 [ˆ5] More…
ESP32 Dev Module No 21 and 22 [ˆ4] 25 [ˆ5] More…
Arduino UNO Yes A4 and A5 12 More…
Arduino Yún / ATmega-32u4 Yes 2 and 3 12 More…
ATtiny85 No 5 and 7 2 (D3) More…
Arduino DUE No 2 and 3 12 More…
BlueDuino 3.3V (ATmega-32u4) No 2 and 3 10 More…
Arduino Mini Pro Yes 2 and 3 10 More…
STM32F746G-DISCO No - - More…
STM32F103 Series No PB6 (SCL) and PB7(SDA) PA12 More…
  1. More about ESP boards on ESPRESSOF Development Boards.
  2. More about BlueDuino on Seed.
  3. On Arduino.cc you can see the technical specification about many board.

Fotos (Ferramentas e Acessórios)

Este item apresenta algumas ferramentas e acessórios podem ser úteis em sua montagem do rádio baseado no SI4735.

Arduino Pro Mini Arduino Pro Mini
Arduino Pro Mini 01 Arduino Pro Mini 02


FT232 USB Adapter FT232 USB Adapter
FT232 USB A SI4735 on adapter 05


Magnifier Solder
Magnifier Solder


Adapter for SI4735 Soldering Accessories
Adatper for Si4735 Soldering Accessories


It was a bit hard to solder the kind of CI on adapter. However, by using a electronic magnifier it was possible.


Soldagem do Si4735 no adaptador

Si4735 on Adapter Si4735 on Adapter
SI4735 on adapter 01 SI4735 on adapter 03



Protoboard

As montagens a seguir são baseadas no circuito proposto pela Silicon Labs (SSOP Typical Application Schematic). Recomendo a leitura do manual “Silicon Labs Documentation (Si4730/31/34/35-D60-BROADCAST AM/FM/SW/LW RADIO RECEIVER; page 19)”. Dois resistores pull-up de 4.7K foram adicionados ao barramento I2C. Note também que dois capacitores cerâmicos de 4.7uF foram adicionados à saída de audio do SI4735.

Veja C7 e C8 no esquema.


A figura a seguir apresenta uma versão reduzida do protótipo em uma mini protoboard. A diferença básica desta abordagem é que os componentes básicos necessários conectados ao Si4735, estão soldados na própria placa. Esta abordagem pode promover mais estabilidade ao sistema devido às conexões curtas com o Si4735.

Mini Protoboard 01


A figura a seguir ilustra a mini protoboard apresentada anteriormente conectada ao Arduino Pro Mini 3.3V e a uma saída de áudio.

Mini Protoboard 02


O protótipo a seguir pode ser usado se você não pretende soldar os componentes na própria placa adaptadora. Verifique na pasta exemplos outras configurações deste circuito com display (OLED e LCD).


Protoboard 01

É importante destacar que o circuito montando em protoboard, sobretudo em soluções envolvendo RF, pode não responder exatamente da forma esperada. Alguns ajustes podem ser necessários para deixar a montagem adequada às suas exigências. A circuito apresentado acima, inicialmente respondeu bem em LW/MW, SW e FM. No entanto, nos experimentos com SSB, uma pequena interferência foi detectada. O Sr. Francisco Scaramella, um colaborador deste projeto, inseriu alguns componentes no circuito e obteve excelentes resultados também em SSB em sua montagem com placa matricial e componentes soldados.

Documentação das funções da Biblioteca

Este item apresenta a lista de funções, métodos e estruturas de dados que podem ser úteis para a construção de seu programa (sketch) Arduino.

Há duas fontes de documentação da biblioteca PU2CLR Si4735 Arduino Library:

Índice de funções e métodos

Estrutura e Tipos de dados definidos

To make the SI4735 device easier to deal, some defined data types were built to handle byte and bits responses.

/*****************************************************************
 * SI473X data types 
 * These data types will be usefull to deal with SI473X 
 *****************************************************************/

/*
 * Power Up arguments data type 
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 64 and 65
 */
    typedef union {
    struct
    {
        // ARG1
        byte FUNC : 4;    // Function (0 = FM Receive; 1–14 = Reserved; 15 = Query Library ID)
        byte XOSCEN : 1;  // Crystal Oscillator Enable (0 = crystal oscillator disabled; 1 = Use crystal oscillator and and OPMODE=ANALOG AUDIO) .
        byte PATCH : 1;   // Patch Enable (0 = Boot normally; 1 = Copy non-volatile memory to RAM).
        byte GPO2OEN : 1; // GPO2 Output Enable (0 = GPO2 output disabled; 1 = GPO2 output enabled).
        byte CTSIEN : 1;  // CTS Interrupt Enable (0 = CTS interrupt disabled; 1 = CTS interrupt enabled).
        // ARG2
        byte OPMODE; // Application Setting. See page 65
    } arg;
    byte raw[2]; // same arg memory position, so same content.
} si473x_powerup;

/*
 * Represents how the  frequency is stored in the si4735.
 * It helps to convert frequency in unsigned int to two bytes (FREQL and FREQH)  
 */
typedef union {
    struct
    {
        byte FREQL; // Tune Frequency High Byte.
        byte FREQH; // Tune Frequency Low Byte.
    } raw;
    unsigned value;
} si47x_frequency;


/* 
 *  Represents searching for a valid frequency data type.
 */
typedef union {
    struct
    {
        byte RESERVED1 : 2;
        byte WRAP : 1;   // Determines whether the seek should Wrap = 1, or Halt = 0 when it hits the band limit.
        byte SEEKUP : 1; // Determines the direction of the search, either UP = 1, or DOWN = 0.
        byte RESERVED2 : 4;
    } arg;
    byte raw;
} si47x_seek;
/*  
 * Response status command 
 * See Si47XX PROGRAMMING GUIDE; pages 73 and 
 */
typedef union {
    struct
    {
        // Status
        byte STCINT : 1; // Seek/Tune Complete Interrupt; 1 = Tune complete has been triggered.
        byte DUMMY1 : 1;
        byte RDSINT : 1; // Radio Data System (RDS) Interrup; 0 = interrupt has not been triggered.
        byte RSQINT : 1; // Received Signal Quality Interrupt; 0 = interrupt has not been triggered.
        byte DUMMY2 : 2;
        byte ERR : 1; // Error. 0 = No error 1 = Error
        byte CTS : 1; // Clear to Send.
        // RESP1
        byte VALID : 1; // Valid Channel
        byte AFCRL : 1; // AFC Rail Indicator
        byte DUMMY3 : 5;
        byte BLTF : 1; // Reports if a seek hit the band limit
        // RESP2
        byte READFREQH; // Read Frequency High Byte.
        // RESP3
        byte READFREQL; // Read Frequency Low Byte.
        // RESP4
        byte RSSI; // Received Signal Strength Indicator (dBμV)
        // RESP5
        byte SNR; // This byte contains the SNR metric when tune is complete (dB).
        // RESP6
        byte MULT; // Contains the multipath metric when tune is complete
        // RESP7
        byte READANTCAP; // Contains the current antenna tuning capacitor value
    } resp;
    byte raw[7];
} si47x_response_status;
/*
 * Firmware Information
 */
typedef union {
    struct
    {
        // status ("RESP0")
        byte STCINT : 1;
        byte DUMMY1 : 1;
        byte RDSINT : 1;
        byte RSQINT : 1;
        byte DUMMY2 : 2;
        byte ERR : 1;
        byte CTS : 1;
        byte PN;       //  RESP1 - Final 2 digits of Part Number (HEX).
        byte FWMAJOR;  // RESP2 - Firmware Major Revision (ASCII).
        byte FWMINOR;  // RESP3 - Firmware Minor Revision (ASCII).
        byte PATCHH;   // RESP4 - Patch ID High Byte (HEX).
        byte PATCHL;   // RESP5 - Patch ID Low Byte (HEX).
        byte CMPMAJOR; // RESP6 - Component Major Revision (ASCII).
        byte CMPMINOR; // RESP7 - Component Minor Revision (ASCII).
        byte CHIPREV;  // RESP8 - Chip Revision (ASCII).
        // RESP9 to RESP15 not used
    } resp;
    byte raw[9];
} si47x_firmware_information;
/*
 * Status of FM_TUNE_FREQ or FM_SEEK_START commands or 
 * Status of AM_TUNE_FREQ or AM_SEEK_START commands.
 * 
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 73 and 139
 */
typedef union {
    struct
    {
        byte INTACK : 1; // If set, clears the seek/tune complete interrupt status indicator.
        byte CANCEL : 1; // If set, aborts a seek currently in progress.
        byte RESERVED2 : 6;
    } arg;
    byte raw;
} si47x_tune_status;
/*
 * Property Data type (help to deal with SET_PROPERTY command on si473X)
 */
typedef union {
    struct
    {
        byte byteLow;
        byte byteHigh;
    } raw;
    unsigned value;
} si47x_property;
/*
 ********************** RDS Data types *******************************
 */

/* 
 * Data type for status information about the received signal quality
 * FM_RSQ_STATUS and AM_RSQ_STATUS
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 75 and 
 */
typedef union {
    struct
    {
        // status ("RESP0")
        byte STCINT : 1;
        byte DUMMY1 : 1;
        byte RDSINT : 1;
        byte RSQINT : 1;
        byte DUMMY2 : 2;
        byte ERR : 1;
        byte CTS : 1;
        // RESP1
        byte RSSIILINT : 1; // RSSI Detect Low.
        byte RSSIHINT : 1;  // RSSI Detect High.
        byte SNRLINT : 1;   // SNR Detect Low.
        byte SNRHINT : 1;   // SNR Detect High.
        byte MULTLINT : 1;  // Multipath Detect Low
        byte MULTHINT : 1;  // Multipath Detect High
        byte DUMMY3 : 1;
        byte BLENDINT : 1; // Blend Detect Interrupt.
        // RESP2
        byte VALID : 1; // Valid Channel.
        byte AFCRL : 1; // AFC Rail Indicator.
        byte DUMMY4 : 1;
        byte SMUTE : 1; // Soft Mute Indicator. Indicates soft mute is engaged.
        byte DUMMY5 : 4;
        // RESP3
        byte STBLEND : 7; // Indicates amount of stereo blend in% (100 = full stereo, 0 = full mono).
        byte PILOT : 1;   // Indicates stereo pilot presence.
        // RESP4 to RESP7
        byte RSSI;    // RESP4 - Contains the current receive signal strength (0–127 dBμV).
        byte SNR;     // RESP5 - Contains the current SNR metric (0–127 dB).
        byte MULT;    // RESP6 - Contains the current multipath metric. (0 = no multipath; 100 = full multipath)
        byte FREQOFF; // RESP7 - Signed frequency offset (kHz).
    } resp;
    byte raw[8];
} si47x_rqs_status;
/*
 * FM_RDS_STATUS (0x24) command
 * Data type for command and response information 
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 77 and 78
 */

// Command data type
typedef union {
    struct
    {
        byte INTACK : 1;     // Interrupt Acknowledge; 0 = RDSINT status preserved; 1 = Clears RDSINT.
        byte MTFIFO : 1;     // Empty FIFO; 0 = If FIFO not empty; 1 = Clear RDS Receive FIFO.
        byte STATUSONLY : 1; // Determines if data should be removed from the RDS FIFO.
        byte dummy : 5;
    } arg;
    byte raw;
} si47x_rds_command;

```cpp
// Response data type for current channel and reads an entry from the RDS FIFO.
typedef union {
    struct
    {
        // status ("RESP0")
        byte STCINT : 1;
        byte DUMMY1 : 1;
        byte RDSINT : 1;
        byte RSQINT : 1;
        byte DUMMY2 : 2;
        byte ERR : 1;
        byte CTS : 1;
        // RESP1
        byte RDSRECV : 1;      // RDS Received; 1 = FIFO filled to minimum number of groups set by RDSFIFOCNT.
        byte RDSSYNCLOST : 1;  // RDS Sync Lost; 1 = Lost RDS synchronization.
        byte RDSSYNCFOUND : 1; // RDS Sync Found; 1 = Found RDS synchronization.
        byte DUMMY3 : 1;
        byte RDSNEWBLOCKA : 1; // RDS New Block A; 1 = Valid Block A data has been received.
        byte RDSNEWBLOCKB : 1; // RDS New Block B; 1 = Valid Block B data has been received.
        byte DUMMY4 : 2;
        // RESP2
        byte RDSSYNC : 1; // RDS Sync; 1 = RDS currently synchronized.
        byte DUMMY5 : 1;
        byte GRPLOST : 1; // Group Lost; 1 = One or more RDS groups discarded due to FIFO overrun.
        byte DUMMY6 : 5;
        // RESP3 to RESP11
        byte RDSFIFOUSED; // RESP3 - RDS FIFO Used; Number of groups remaining in the RDS FIFO (0 if empty).
        byte BLOCKAH;     // RESP4 - RDS Block A; HIGH byte
        byte BLOCKAL;     // RESP5 - RDS Block A; LOW byte
        byte BLOCKBH;     // RESP6 - RDS Block B; HIGH byte
        byte BLOCKBL;     // RESP7 - RDS Block B; LOW byte
        byte BLOCKCH;     // RESP8 - RDS Block C; HIGH byte
        byte BLOCKCL;     // RESP9 - RDS Block C; LOW byte
        byte BLOCKDH;     // RESP10 - RDS Block D; HIGH byte
        byte BLOCKDL;     // RESP11 - RDS Block D; LOW byte
        // RESP12 - Blocks A to D Corrected Errors.
        // 0 = No errors;
        // 1 = 1–2 bit errors detected and corrected;
        // 2 = 3–5 bit errors detected and corrected.
        // 3 = Uncorrectable.
        byte BLED : 2;
        byte BLEC : 2;
        byte BLEB : 2;
        byte BLEA : 2;
    } resp;
    byte raw[13];
} si47x_rds_status;
/*
 * FM_RDS_INT_SOURCE property data type
 * See Si47XX PROGRAMMING GUIDE; AN332; page 103
 */
typedef union {
    struct
    {
        byte RDSRECV : 1;      // If set, generate RDSINT when RDS FIFO has at least FM_RDS_INT_FIFO_COUNT entries.
        byte RDSSYNCLOST : 1;  // If set, generate RDSINT when RDS loses synchronization.
        byte RDSSYNCFOUND : 1; // f set, generate RDSINT when RDS gains synchronization.
        byte DUMMY1 : 1;       // Always write to 0.
        byte RDSNEWBLOCKA : 1; // If set, generate an interrupt when Block A data is found or subsequently changed
        byte RDSNEWBLOCKB : 1; // If set, generate an interrupt when Block B data is found or subsequently changed
        byte DUMMY2 : 10;      // Reserved - Always write to 0.
    } refined;
    byte raw[2];
} si47x_rds_int_source;
/*
 * Data type for FM_RDS_CONFIG Property
 * 
 * IMPORTANT: all block errors must be less than or equal the associated block error threshold for the group 
 * to be stored in the RDS FIFO. 
 * 0 = No errors; 1 = 1–2 bit errors detected and corrected; 2 = 3–5 bit errors detected and corrected; 3 = Uncorrectable.
 * Recommended Block Error Threshold options:
 *  2,2,2,2 = No group stored if any errors are uncorrected.
 *  3,3,3,3 = Group stored regardless of errors.
 *  0,0,0,0 = No group stored containing corrected or uncorrected errors.
 *  3,2,3,3 = Group stored with corrected errors on B, regardless of errors on A, C, or D.
 *  
 */
typedef union {
    struct
    {
        byte RDSEN : 1; // 1 = RDS Processing Enable.
        byte DUMMY1 : 7;
        byte BLETHD : 2; // Block Error Threshold BLOCKD
        byte BLETHC : 2; // Block Error Threshold BLOCKC.
        byte BLETHB : 2; // Block Error Threshold BLOCKB.
        byte BLETHA : 2; // Block Error Threshold BLOCKA.
    } arg;
    byte raw[2];
} si47x_rds_config;
/*
 * Block A data type
 */
typedef union {
    struct
    {
        unsigned pi;
    } refined;
    struct
    {
        byte lowValue;
        byte highValue; // Most Significant byte first
    } raw;
} si47x_rds_blocka;
/*
 * Block B data type
 * More about Group Type Contents see: https://github.com/pu2clr/SI4735/tree/master/examples/SI4735_RDS
 * See also Si47XX PROGRAMMING GUIDE; AN332; pages 78 and 79
 */
typedef union {
    struct
    {
        byte content : 5;            // Depends on Group Type and Version codes.
        byte programType : 5;        // PTY (Program Type) code
        byte trafficProgramCode : 1; // 0 = No Traffic Alerts; 1 = Station gives Traffic Alerts
        byte versionCode : 1;        // 0=A; 1=B
        byte groupType : 4;          // Group Type code.

    } refined;
    struct
    {
        byte lowValue;
        byte highValue; // Most Significant Byte first
    } raw;
} si47x_rds_blockb;
typedef union {
    struct
    {
        byte offset : 5;
        byte offset_sense : 1; //
        byte minute : 6;       //
        byte hour : 4;         //
        unsigned mjd;
    } refined;
    byte raw[4];
} si47x_rds_date_time;
/* AGC data types
 * FM / AM and SSB structure to AGC
 * See Si47XX PROGRAMMING GUIDE; AN332; For FM page 80; for AM page 142
 * See AN332 REV 0.8 Universal Programming Guide Amendment for SI4735-D60 SSB and NBFM patches; page 18. 
 */
typedef union {
    struct {
        // status ("RESP0")
        byte STCINT : 1;
        byte DUMMY1 : 1;
        byte RDSINT : 1;   // Not used for AM/SSB
        byte RSQINT : 1;
        byte DUMMY2 : 2;
        byte ERR : 1;
        byte CTS : 1;
        // RESP1
        byte AGCDIS : 1; // This bit indicates if the AGC is enabled or disabled. 0 = AGC enabled; 1 = AGC disabled.
        byte DUMMY:7;
        // RESP2
        byte AGCIDX; // For FM (5 bits - READ_LNA_GAIN_INDEX - 0 = Minimum attenuation (max gain)). For AM (8 bits). This byte reports the current AGC gain index.
    } refined;
    byte raw[3];
} si47x_agc_status;
/* 
 * If FM, Overrides AGC setting by disabling the AGC and forcing the LNA to have a certain gain that ranges between 0 
 * (minimum attenuation) and 26 (maximum attenuation).
 * If AM, overrides the AGC setting by disabling the AGC and forcing the gain index that ranges between 0
 * See Si47XX PROGRAMMING GUIDE; AN332; For FM page 81; for AM page 143
 */
typedef union {
    struct {
        // ARG1
        byte AGCDIS : 1; // if set to 1 indicates if the AGC is disabled. 0 = AGC enabled; 1 = AGC disabled.
        byte DUMMY : 7;
        // ARG2
        byte AGCIDX; // AGC Index; If AMAGCDIS = 1, this byte forces the AGC gain index; 0 = Minimum attenuation (max gain)
    } arg;
    byte raw[2];
} si47x_agc_overrride;




Métodos Públicos

Neste contexto, métodos podem ser entendidos como as funções implementadas para a classe SI4735. Métodos Públicos são as funções que podem ser utilizadas ou chamadas de dentro de um sketch Arduino.

Atualmente esta biblioteca possui mais de 70 funções que podem ser utilizadas para controlar ou alterar o comportamento do SI4735. É muito importante para o desenvolvedor conhecer previamente os métodos implementados nesta biblioteca para tirar o máximo proveito possível das funções do rádio que será construído. A pasta [examples]((https://github.com/pu2clr/SI4735/blob/master/examples/) possui vários exemplos que podem orientar o desenvolvedor na utilização desta biblioteca.


setup

/* 
 * Starts the Si473X device. 
 * 
 * @param byte resetPin Digital Arduino Pin used to RESET command 
 * @param byte interruptPin interrupt Arduino Pin (see your Arduino pinout). If less than 0, iterrupt disabled
 * @param byte defaultFunction
 */
void SI4735::setup(byte resetPin, byte interruptPin, byte defaultFunction)

If you are not using interrupt use the setup method as shown below.

/* 
 * Starts the Si473X device.  
 * Use this setup if you are not using interrupt resource
 * 
 * @param byte resetPin Digital Arduino Pin used to RESET command 
 * @param byte defaultFunction
 */
void SI4735::setup(byte resetPin, byte defaultFunction)

Example of using setup


#include <SI4735.h>

#define INTERRUPT_PIN 2
#define RESET_PIN 12

SI4735 si4735;

void setup()
{
    si4735.setup(RESET_PIN, INTERRUPT_PIN, FM_FUNCTION);
}

See full example

setPowerUp

/*
 * Set the Power Up parameters for si473X. 
 * Use this method to chenge the defaul behavior of the Si473X. Use it before PowerUp()
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 65 and 129
 * @param byte CTSIEN sets Interrupt anabled or disabled (1 = anabled and 0 = disabled )
 * @param byte GPO2OEN sets GP02 Si473X pin enabled (1 = anabled and 0 = disabled )
 * @param byte PATCH  Used for firmware patch updates. Use it always 0 here. 
 * @param byte XOSCEN byte XOSCEN set external Crystal enabled or disabled 
 * @param byte FUNC sets the receiver function have to be used [0 = FM Receive; 1 = AM (LW/MW/SW) and SSB (if SSB patch apllied)]
 * @param byte OPMODE set the kind of audio mode you want to use.
 */
void SI4735::setPowerUp(byte CTSIEN, byte GPO2OEN, byte PATCH, byte XOSCEN, byte FUNC, byte OPMODE)

analogPowerUp

/*
 * Powerup in Analog Mode
 * You have to call setPowerUp before call analogPowerUp. 
 * Use setPowerUp to select FM, AM or SSB (if SSB patch apllied) mode.
 */
void SI4735::analogPowerUp(void) 

Example of using analogPowerUp

    // Set the initial SI473X behavior
    // CTSIEN   1 -> Interrupt anabled;
    // GPO2OEN  1 -> GPO2 Output Enable;
    // PATCH    0 -> Boot normally;
    // XOSCEN   1 -> Use external crystal oscillator;
    // FUNC     defaultFunction = 0 = FM Receive; 1 = AM (LW/MW/SW) Receiver.
    // OPMODE   SI473X_ANALOG_AUDIO = 00000101 = Analog audio outputs (LOUT/ROUT).

    setPowerUp(1, 1, 0, 1, defaultFunction, SI473X_ANALOG_AUDIO);
    analogPowerUp();

powerDown

/* 
 * Moves the device from powerup to powerdown mode.
 * After Power Down command, only the Power Up command is accepted.
 */
void SI4735::powerDown(void)

setFrequency

/*
 * Set the frequency to the corrent function of the Si4735 (AM or FM)
 * You have to call setup or setPowerUp before call setFrequency.
 * 
 * @param unsigned freq Is the frequency to change. For example, FM => 10390 = 103.9 MHz; AM => 810 = 810 kHz. 
 */
void SI4735::setFrequency(unsigned freq) 

Example of using setFrequency

    si4735.setFM(); 
    si4735.setFrequency(fm_freq); 
    showStatus(fm_freq,"MHz");

See full example

frequencyUp

/*
 *  Increments the current frequency on current band/function by using the current step.
 *  See setFrequencyStep
 */ 
void SI4735::frequencyUp()

frequencyDown

/*
 *  Decrements the current frequency on current band/function by using the current step.
 *  See setFrequencyStep
 */ 
void SI4735::frequencyDown()

setTuneFrequencyAntennaCapacitor

/*
 * Selects the tuning capacitor value.
 * For FM, Antenna Tuning Capacitor is valid only when using TXO/LPI pin as the antenna input.
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 71 and 136
 * 
 * @param capacitor If zero, the tuning capacitor value is selected automatically. 
 *                  If the value is set to anything other than 0:
 *                  AM - the tuning capacitance is manually set as 95 fF x ANTCAP + 7 pF. ANTCAP manual range is 1–6143;
 *                  FM - the valid range is 0 to 191.    
 *                  According to Silicon Labs, automatic capacitor tuning is recommended (value 0). 
 */
void SI4735::setTuneFrequencyAntennaCapacitor(unsigned capacitor)

setTuneFrequencyFast

/*
 * If set, executes fast and invalidated tune. The tune status will not be accurate
 * @param FAST if 1 executes fast and invalidated tune. Defult value is 0.
 */
inline void setTuneFrequencyFast(byte FAST) 

setTuneFrequencyFreeze

/*
 * Freeze Metrics During Alternate Frequency Jump. Only used on FM. 
 */ 
inline void setTuneFrequencyFreeze(byte FREEZE) 

seekStation

/*
 * Look for a station 
 * See Si47XX PROGRAMMING GUIDE; AN332; page 72
 * 
 * @param SEEKUP Seek Up/Down. Determines the direction of the search, either UP = 1, or DOWN = 0. 
 * @param Wrap/Halt. Determines whether the seek should Wrap = 1, or Halt = 0 when it hits the band limit.
 */
void SI4735::seekStation(byte SEEKUP, byte WRAP)

Example of using seekStation

    si4735.seekStation(1,1);

seekStationUp and seekStationDown

/*
 * Search for the next station 
 */
void SI4735::seekStationUp() 

/*
 * Search the previous station
 */
void SI4735::seekStationDown()

See full example

setAM

/*
 * Set the radio to AM function. It means: LW, MW and SW.
 */ 
void SI4735::setAM()
You can also use setAM with parameters as shown below
/*
 * Set the radio to AM (LW/MW/SW) function. 
 * 
 * @param fromFreq minimum frequency for the band
 * @param toFreq maximum frequency for the band
 * @param initialFreq initial frequency 
 * @param step step used to go to the next channel   
 */
void SI4735::setAM(unsigned fromFreq, unsigned toFreq, unsigned initialFreq, byte step)

setFM

/*
 * Set the radio to FM function
 */
void SI4735::setFM()
You can also use setFM with parameters as shown below
/*
 * Set the radio to FM function. 
 * 
 * @param fromFreq minimum frequency for the band
 * @param toFreq maximum frequency for the band
 * @param initialFreq initial frequency (default frequency)
 * @param step step used to go to the next channel   
 */
void SI4735::setFM(unsigned fromFreq, unsigned toFreq, unsigned initialFreq, byte step)

Example of using setAM() and setFM()

    switch (key)
    {
    case 'A':
      si4735.setAM();
      si4735.setFrequency(am_freq);
      break;
    case 'F':
      si4735.setFM();
      si4735.setFrequency(fm_freq);
      break;
      .
      .
      .

See full example

isCurrentTuneFM

/*
 * Returns true if the radio is running FM (FM_TUNE_FREQ).
 */ 
bool SI4735::isCurrentTuneFM()

setVolume

/* 
 * Set the volume level
 * @param byte volume (domain: 0 - 63) 
 */
void SI4735::setVolume(byte volume)

Example of using setVolume()

  si4735.setVolume(45);

See full example

volumeUp

/*
 *  Set sound volume level Up   
 */
void SI4735::volumeUp()

volumeDown

/*
 *  Set sound volume level Down   
 */
void SI4735::volumeDown()

Example of using volumeUp() and volumeDown()

    switch (key)
    {
    case '+':
        si4735.volumeUp();
        break;
    case '-': 
        si4735.volumeDown();
        break;
    .
    .
    .    

See full example

getCurrentVolume

/*
 * Returns the current volume level
 */ 
inline byte SI4735::getCurrentVolume() 



FM Stereo and Mono Control

Methods to control the Stereo and Mono behaviour of the SI47XX.

setFmBlendStereoThreshold

/*
 * Sets RSSI threshold for stereo blend (Full stereo above threshold, blend below threshold). 
 * To force stereo, set this to 0. To force mono, set this to 127.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 90. 
 */
void SI4735::setFmBlendStereoThreshold(uint8_t parameter)

setFmBlendMonoThreshold

/*
 * Sets RSSI threshold for mono blend (Full mono below threshold, blend above threshold). 
 * To force stereo set this to 0. To force mono set this to 127. Default value is 30 dBμV.
 *  See Si47XX PROGRAMMING GUIDE; AN332; page 56.
 */
void SI4735::setFmBlendMonoThreshold(uint8_t parameter)

setFmBlendRssiStereoThreshold

/* 
 * Sets RSSI threshold for stereo blend. (Full stereo above threshold, blend below threshold.) 
 * To force stereo, set this to 0. To force mono, set this to 127. Default value is 49 dBμV.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 59. 
 */
void SI4735::setFmBlendRssiStereoThreshold(uint8_t parameter)

setFmBLendRssiMonoThreshold

/*
 * Sets RSSI threshold for mono blend (Full mono below threshold, blend above threshold). 
 * To force stereo, set this to 0. To force mono, set this to 127. Default value is 30 dBμV.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 59.  
 */
void SI4735::setFmBLendRssiMonoThreshold(uint8_t parameter)

setFmBlendSnrStereoThreshold

/*
 * Sets SNR threshold for stereo blend (Full stereo above threshold, blend below threshold). 
 * To force stereo, set this to 0. To force mono, set this to 127. Default value is 27 dB.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 59.  
 */
void SI4735::setFmBlendSnrStereoThreshold(uint8_t parameter)

setFmBLendSnrMonoThreshold

/*
 * Sets SNR threshold for mono blend (Full mono below threshold, blend above threshold). 
 * To force stereo, set this to 0. To force mono, set this to 127. Default value is 14 dB.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 59. 
 */
void SI4735::setFmBLendSnrMonoThreshold(uint8_t parameter)

setFmBlendMultiPathStereoThreshold

/* 
 * Sets multipath threshold for stereo blend (Full stereo below threshold, blend above threshold). 
 * To force stereo, set this to 100. To force mono, set this to 0. Default value is 20.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 60.
 */
void SI4735::setFmBlendMultiPathStereoThreshold(uint8_t parameter)

setFmBlendMultiPathMonoThreshold

/*
 * Sets Multipath threshold for mono blend (Full mono above threshold, blend below threshold). 
 * To force stereo, set to 100. To force mono, set to 0. The default is 60.
 * See Si47XX PROGRAMMING GUIDE; AN332; page 60.
 */
void SI4735::setFmBlendMultiPathMonoThreshold(uint8_t parameter)




SI4735 Current Status

Allows to query the current frequency, RSSI, SNR, multipath, and the antenna tuning capacitance value (0-191). You have to call getStatus before any method to get the information about SI4735 status


getStatus

/*
 * Gets the current status  of the Si4735 (AM or FM)
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 73 (FM) and 139 (AM)
 *
 */
void SI4735::getStatus()


/*
 * Gets the current status  of the Si4735 (AM or FM)
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 73 (FM) and 139 (AM)
 * 
 * @param byte INTACK Seek/Tune Interrupt Clear. If set, clears the seek/tune complete interrupt status indicator;
 * @param byte CANCEL Cancel seek. If set, aborts a seek currently in progress;
 * 
 */
void SI4735::getStatus(byte INTACK, byte CANCEL) {

getTuneCompleteTriggered

/*
 * Tune complete has been triggered (STCINT)
 */
inline bool SI4735::getTuneCompleteTriggered()

getSignalQualityInterrup

/* 
 * Gets Received Signal Quality Interrupt(RSQINT)
 * 
 */
inline bool SI4735::getSignalQualityInterrup()

getRadioDataSystemInterrupt

/* 
 * Gets Radio Data System (RDS) Interrupt
 */
inline bool SI4735::getRadioDataSystemInterrupt()

getStatusError

/*
 * Return the Error flag (true or false) of status of the least Tune or Seek 
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 63
 * @return true or false
 */
inline bool SI4735::getStatusError()

getStatusCTS

/*
 * Gets the Error flag of status response 
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 63
 */
inline bool SI4735::getStatusCTS()

getACFIndicator

/* 
 * Returns true if the AFC rails (AFC Rail Indicator). 
 */
inline bool SI4735::getACFIndicator()

getBandLimit

/* 
 * Returns true if a seek hit the band limit (WRAP = 0 in FM_START_SEEK) or 
 * wrapped to the original frequency (WRAP = 1).
 */
inline bool SI4735::getBandLimit()

getReceivedSignalStrengthIndicator

/*
 * Received Signal Strength Indicator.
 * This byte contains the receive signal strength when tune is complete (dBμV).
 */
inline byte SI4735::getReceivedSignalStrengthIndicator()

getStatusSNR

/*
 * SNR.
 * This byte contains the SNR metric when tune is complete (dB).
 */
inline byte SI4735::getStatusSNR()

getStatusMULT

/* 
 * Multipath.
 * This byte contains the multipath metric when tune is complete. 
 * Multipath indi- cator is available only for Si474x, Si4706-C30 and later and 
 * Si4704/05/30/31/34/35/84/85-D50 and later.
 */
inline byte SI4735::getStatusMULT()

getAntennaTuningCapacitor

/* 
 * Read Antenna Tuning Capacitor (Si4704/05/06/2x only). 
 * Returns a byte that contains the current antenna tuning capacitor value.
 */
inline uint16_t SI4735::getAntennaTuningCapacitor()

getStatusValid

/*
 * Returns true if the channel is currently valid as determined by the seek/tune properties (0x1403, 0x1404, 0x1108) 
 * and would have been found during a Seek.
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 63
 */
inline bool SI4735::getStatusValid()




SI4735 Received Signal Quality

You have a set o methods that allowto get some information about Received Signal Quality. See Si47XX PROGRAMMING GUIDE; AN332; pages 75 and 141

getCurrentReceivedSignalQuality

/*  
 * Queries the status of the Received Signal Quality (RSQ) of the current channel. The methods getCurrentRSSI(), getCurrentSNR() etc,
 * depend on this method. So, it have to be called first. However, this method is called internally by getFrequency(). In this case,
 * you do not need to use getCurrentReceivedSignalQuality if you are using getFrequency.
 * In other words, you can call getCurrentRSSI(), getCurrentSNR() etc, after call getFrequency().
 * 
 * @param INTACK Interrupt Acknowledge; 0 = Interrupt status preserved; 1 = Clears RSQINT, SNRHINT, SNRLINT, RSSIHINT, RSSILINT
 */
void getCurrentReceivedSignalQuality(byte INTACK)

getCurrentRSSI

/* 
 * Gets current receive signal strength (0–127 dBμV).
 * AM and FM
 */
inline byte SI4735::getCurrentRSSI() 

getCurrentSNR

/*
 * Gets current SNR metric (0–127 dB).
 * AM and FM
 */
inline byte SI4735::getCurrentSNR() 

getCurrentRssiDetectLow

/* 
 * Returns true if RSSI Detect Low.
 * AM and FM
 */ 
inline bool SI4735::getCurrentRssiDetectLow() 

getCurrentRssiDetectHigh

/* 
 * Return true if RSSI Detect High
 * AM and FM
 */ 
inline bool SI4735::getCurrentRssiDetectHigh() 

getCurrentSnrDetectLow

/* 
 * Returns true if SNR Detect Low.
 */ 
inline bool SI4735::getCurrentSnrDetectLow() 

getCurrentSnrDetectHigh

/* 
 * Returns true if SNR Detect High
 */ 
inline bool SI4735::getCurrentSnrDetectHigh() 

getCurrentValidChannel

/*
 *  Returns true if Valid Channel.
 */ 
inline bool SI4735::getCurrentValidChannel() 

getCurrentAfcRailIndicator

/*
 *  Returns true AFC (Automatic Frequency Control) Rail Indicator.
 */ 
inline bool SI4735::getCurrentAfcRailIndicator() 

getCurrentSoftMuteIndicator

/*
 * Returns true if soft mute is engaged.
 */
inline bool SI4735::getCurrentSoftMuteIndicator() 

getCurrentStereoBlend

/* 
 *  Returns the amount of stereo blend in% (100 = full stereo, 0 = full mono).
 */ 
inline byte SI4735::getCurrentStereoBlend()

getCurrentPilot

/*
 * Returns true if stereo pilot presence.
 */ 
inline bool SI4735::getCurrentPilot() 

getCurrentMultipath

/* 
 * Returns the current multipath metric. (0 = no multipath; 100 = full multipath)
 */ 
inline byte SI4735::getCurrentMultipath() 

getCurrentSignedFrequencyOffset

/* 
 * Returns Signed frequency offset (kHz).
 */ 
inline byte SI4735::getCurrentSignedFrequencyOffset() 

getCurrentMultipathDetectLow

/* 
 * Returns true if Multipath Detect Low.
 */ 
inline bool SI4735::getCurrentMultipathDetectLow()  

getCurrentMultipathDetectHigh

/*
 * Returns true if Multipath Detect High
 */ 
inline bool SI4735::getCurrentMultipathDetectHigh()   

getCurrentBlendDetectInterrupt

/*
 * Returns true if Blend Detect Interrupt
 */ 
inline bool SI4735::getCurrentBlendDetectInterrupt()  




Current AGC Status

Methods to query AGC status. Returns whether the AGC is enabled or disabled and it returns the gain index. You have to call getAutomaticGainControl before isAgcEnabled and getAgcGainIndex.

getAutomaticGainControl

/*
 * Queries AGC STATUS
 * See Si47XX PROGRAMMING GUIDE; AN332; For FM page 80; for AM page 142.
 * See AN332 REV 0.8 Universal Programming Guide Amendment for SI4735-D60 SSB and NBFM patches; page 18. 
 * After call this method, you can call isAgcEnabled to know the AGC status and getAgcGainIndex to know the gain index value.
 */
void SI4735::getAutomaticGainControl()

isAgcEnabled

/* 
 *  Returns true if the AGC is enabled
 */ 
inline bool isAgcEnabled()

getAgcGainIndex

/* 
 *  Returns the current AGC gain index.
 */ 
inline byte getAgcGainIndex() 

setAutomaticGainControl

/* 
 * If FM, overrides AGC setting by disabling the AGC and forcing the LNA to have a certain gain that ranges between 0 
 * (minimum attenuation) and 26 (maximum attenuation);
 * If AM/SSB, Overrides the AM AGC setting by disabling the AGC and forcing the gain index that ranges between 0 
 * (minimum attenuation) and 37+ATTN_BACKUP (maximum attenuation);
 * 
 * @param byte AGCDIS This param selects whether the AGC is enabled or disabled (0 = AGC enabled; 1 = AGC disabled);
 * @param byte AGCIDX AGC Index (0 = Minimum attenuation (max gain); 1 – 36 = Intermediate attenuation); 
 *             > 37 - Maximum attenuation (min gain) ).
 * 
 * See Si47XX PROGRAMMING GUIDE; AN332; For FM page 81; for AM page 143 
 */
void SI4735::setAutomaticGainControl(byte AGCDIS, byte AGCIDX)




Filters

Si4735 filters configuration

setBandwidth

/*
 * Selects the bandwidth of the channel filter for AM reception. The choices are 6, 4, 3, 2, 2.5, 1.8, or 1 (kHz). 
 * The default bandwidth is 2 kHz.
 * Works only in AM / SSB (LW/MW/SW) 
 * @param AMCHFLT the choices are:   0 = 6 kHz Bandwidth;                    
 *                                   1 = 4 kHz Bandwidth;
 *                                   2 = 3 kHz Bandwidth;
 *                                   3 = 2 kHz Bandwidth;
 *                                   4 = 1 kHz Bandwidth;
 *                                   5 = 1.8 kHz Bandwidth;
 *                                   6 = 2.5 kHz Bandwidth. 
 * @param AMPLFLT Enables the AM Power Line Noise Rejection Filter.
 */
void setBandwidth(byte AMCHFLT, byte AMPLFLT)




SI4735 Firmware Information

Permite consultar as informações sobre o Firmware armazenadas no SI4735.


getFirmwarePN

/*
 * Returns the final 2 digits of Part Number (HEX)
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwarePN()

getFirmwareFWMAJOR

/*
 * Returns the Firmware Major Revision (ASCII).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwareFWMAJOR()

getFirmwareFWMINOR

/*
 * Returns the Firmware Minor Revision (ASCII).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwareFWMINOR()

getFirmwarePATCHH

/*
 * Returns the Patch ID High Byte (HEX).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwarePATCHH()

getFirmwarePATCHL

/*
 * Returns the Patch ID Low Byte (HEX).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwarePATCHL()

getFirmwareCMPMAJOR

/*
 * Returns the Component Major Revision (ASCII).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwareCMPMAJOR()

getFirmwareCMPMINOR

/*
 * Returns the Component Minor Revision (ASCII).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66.
 */
inline byte SI4735::getFirmwareCMPMINOR()

getFirmwareCHIPREV

/*
 * Returns the Chip Revision (ASCII).
 * See Si47XX PROGRAMMING GUIDE; AN332; page 66
 */
inline byte SI4735::getFirmwareCHIPREV()




RDS

Discorrer sobre RDS e esta biblioteca.

setRdsIntSource

/* 
 * Configures interrupt related to RDS
 * Use this method if want to use interrupt
 * See Si47XX PROGRAMMING GUIDE; AN332; page 103
 * 
 * @param RDSRECV If set, generate RDSINT when RDS FIFO has at least FM_RDS_INT_FIFO_COUNT entries.
 * @param RDSSYNCLOST If set, generate RDSINT when RDS loses synchronization.
 * @param RDSSYNCFOUND set, generate RDSINT when RDS gains synchronization.
 * @param RDSNEWBLOCKA If set, generate an interrupt when Block A data is found or subsequently changed
 * @param RDSNEWBLOCKB If set, generate an interrupt when Block B data is found or subsequently changed
 */
void SI4735::setRdsIntSource(byte RDSNEWBLOCKB, byte RDSNEWBLOCKA, byte RDSSYNCFOUND, byte RDSSYNCLOST, byte RDSRECV)

setRdsConfig

/*
 * Set RDS property 
 * 
 * @param byte RDSEN RDS Processing Enable; 1 = RDS processing enabled.
 * @param byte BLETHA Block Error Threshold BLOCKA.   
 * @param byte BLETHB Block Error Threshold BLOCKB.  
 * @param byte BLETHC Block Error Threshold BLOCKC.  
 * @param byte BLETHD Block Error Threshold BLOCKD. 
 *  
 * IMPORTANT: 
 * All block errors must be less than or equal the associated block error threshold 
 * for the group to be stored in the RDS FIFO. 
 * 0 = No errors.
 * 1 = 1–2 bit errors detected and corrected. 
 * 2 = 3–5 bit errors detected and corrected. 
 * 3 = Uncorrectable.
 * Recommended Block Error Threshold options:
 *  2,2,2,2 = No group stored if any errors are uncorrected.
 *  3,3,3,3 = Group stored regardless of errors.
 *  0,0,0,0 = No group stored containing corrected or uncorrected errors.
 *  3,2,3,3 = Group stored with corrected errors on B, regardless of errors on A, C, or D.
 */
void SI4735::setRdsConfig(byte RDSEN, byte BLETHA, byte BLETHB, byte BLETHC, byte BLETHD)

getRdsStatus

/*
 * RDS COMMAND FM_RDS_STATUS
 * See Si47XX PROGRAMMING GUIDE; AN332; pages 77 and 78
 * @param INTACK Interrupt Acknowledge; 0 = RDSINT status preserved. 1 = Clears RDSINT.
 * @param MTFIFO 0 = If FIFO not empty, read and remove oldest FIFO entry; 1 = Clear RDS Receive FIFO.
 * @param STATUSONLY Determines if data should be removed from the RDS FIFO.
 */
void SI4735::getRdsStatus(byte INTACK, byte MTFIFO, byte STATUSONLY)
You can also use getRdsStatus with no parameters as shown below
/*
 * Gets RDS Status.
 * Call getRdsStatus(byte INTACK, byte MTFIFO, byte STATUSONLY) if you want other behaviour
 * same getRdsStatus(0,0,0)
 */
void SI4735::getRdsStatus() 

getRdsReceived

/*
 * Returns true if the number of the groups is filled.
 * (1 = FIFO filled to minimum number of groups)
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsReceived()       

getRdsSyncLost

/* 
 * Returns true if when the RDS synchronization status is lost (1 = Lost RDS synchronization)
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsSyncLost()  

getRdsSyncFound

/* 
 * Returns true when RDS synchronization status is found (Found RDS synchronization)
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsSyncFound() 

getRdsNewBlockA

/* 
 * Returns true when a valid Block A data has been received.
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsNewBlockA() 

getRdsNewBlockB

/* 
 * Returns true when a valid Block B data has been received.
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsNewBlockB() 

getRdsSync

/* 
 * Returns true when RDS currently synchronized.
 * You have to call getRdsStatus before. 
 */ 
inline bool getRdsSync() 

getGroupLost

/*
 * Returns true when One or more RDS groups discarded due to FIFO overrun.
 * You have to call getRdsStatus before. 
 */ 
 inline bool getGroupLost()          

getNumRdsFifoUsed

/*
 * Returns the number of groups remaining in the RDS FIFO (0 if empty).
 * You have to call getRdsStatus before.   
 */
inline byte getNumRdsFifoUsed() 

getRdsPI

/* 
 * Returns the programa type. 
 * Read the Block A content
 */  
unsigned SI4735::getRdsPI(void) 

getRdsGroupType

/*
 * Returns the Group Type (extracted from the Block B) 
 */ 
unsigned SI4735::getRdsGroupType(void)

getRdsVersionCode

/*
 * Gets the version code (extracted from the Block B)
 * Returns  0=A or 1=B
 */
unsigned SI4735::getRdsVersionCode(void)

getRdsProgramType

/* 
 * Returns the Program Type (extracted from the Block B)
 */ 
unsigned SI4735::getRdsProgramType(void)

getRdsText

/*
 * Gets the RDS Text when the message is of the Group Type 2 version A
 */  
String SI4735::getRdsText(void)

getRdsTime

/* 
 * Gets the RDS time and date when the Group type is 4 
 */  
String SI4735::getRdsTime()




Single Side Band (SSB) Support

Antes de tudo, é importante que o usuário desta biblioteca tenha em mente que o conteúdo do firmware de atualização para SSB não faz parte desta biblioteca. Esta biblioteca somente oferece funções que suportam a carga do firmware nos dispositivos Si4735-D60 e SI4732-A10, bem como implementa as funções para operação no modo SSB. Portanto, o autor desta biblioteca não encoraja nenhum usuário a comercializar o conteúdo do firmware SSB utilizando esta biblioteca.

Esta função foi testada no SI4735-D60 e no SI4732-A10. Para usar SSB com o SI4735-D60 or SI4732-A10, você deve carregar uma atualização (patch) no CI. No entanto, é importante salientar que a Silicon Labs só provê suporte a esse recurso para alguns clientes. Até a presente data, há pouca documentação disponível na Internet sobre como aplicar os patches para SI4735-D60/Si4732-A10.

O autor desta biblioteca não garante que os procedimentos sugeridos aqui funcionarão em seu ambiente de desenvolvimento. Dito isso, fica por sua conta e risco a execução dos procedimentos de aplicação da atualização (patch) do SI4735-D60/Si4732-A10, bem como do uso das funções para SSB desenvolvidas aqui. Em outras palavras, o autor desta biblioteca não se responsabilizará por qualquer dano em seu dispositivo SI4735 ou qualquer outro dispositivo que você utilize com esta biblioteca.

Conforme dito anteriormente, há pouca documentação disponível na Internet sobre a aplicação de patch para o SI4735. O conteúdo deste tópico expõe o entendimento do autor desta biblioteca. Dito disso, algumas informações colocadas aqui podem não ser precisas.

É importante saber que o patch aplicado para o SI4735-D60/Si4732-A10, fica armazenado na RAM interna do SI4735-D60/Si4732-A10. Como a RAM é uma memória volátil, essa atualização deve ser carregada sempre que você retornar o sistema para o modo SSB. Isto é, se você mudar o modo de SSB para FM ou AM e depois retornar para o modo SSB, essa ação exigirá que você recarregue o patch novamente antes começar a operar com SSB. O mesmo vale para os comandos reset ou power down.

setSSBBfo

/* 
 * Sets the SSB Beat Frequency Offset (BFO). 
 * @param offset 16-bit signed value (unit in Hz). The valid range is -16383 to +16383 Hz. 
 */ 
void SI4735::setSSBBfo(int offset)

setSSBConfig

/*
 * Set the SSB receiver mode details:
 * 1) Enable or disable AFC track to carrier function for receiving normal AM signals;
 * 2) Set the audio bandwidth;
 * 3) Set the side band cutoff filter;
 * 4) Set soft-mute based on RSSI or SNR;
 * 5) Enable or disbable automatic volume control (AVC) function. 
 * 
 * See AN332 REV 0.8 UNIVERSAL PROGRAMMING GUIDE; page 24 
 * 
 * @param AUDIOBW SSB Audio bandwidth; 0 = 1.2kHz (default); 1=2.2kHz; 2=3kHz; 3=4kHz; 4=500Hz; 5=1kHz.
 * @param SBCUTFLT SSB side band cutoff filter for band passand low pass filter
 *                 if 0, the band pass filter to cutoff both the unwanted side band and high frequency 
 *                  component > 2kHz of the wanted side band (default).
 * @param AVC_DIVIDER set 0 for SSB mode; set 3 for SYNC mode.
 * @param AVCEN SSB Automatic Volume Control (AVC) enable; 0=disable; 1=enable (default).
 * @param SMUTESEL SSB Soft-mute Based on RSSI or SNR.
 * @param DSP_AFCDIS DSP AFC Disable or enable; 0=SYNC MODE, AFC enable; 1=SSB MODE, AFC disable. 
 */
void SI4735::setSSBConfig(byte AUDIOBW, byte SBCUTFLT, byte AVC_DIVIDER, byte AVCEN, byte SMUTESEL, byte DSP_AFCDIS)

setSSBDspAfc

/* 
 * Sets DSP AFC disable or enable
 * 0 = SYNC mode, AFC enable
 * 1 = SSB mode, AFC disable
 */
void SI4735::setSSBDspAfc(byte DSP_AFCDIS)

setSSBSoftMute

/* 
 * Sets SSB Soft-mute Based on RSSI or SNR Selection:
 * 0 = Soft-mute based on RSSI (default).
 * 1 = Soft-mute based on SNR.
 */
void SI4735::setSSBSoftMute(byte SMUTESEL)

setSSBAutomaticVolumeControl

/*
 * Sets SSB Automatic Volume Control (AVC) for SSB mode
 * 0 = Disable AVC.
 * 1 = Enable AVC (default).
 */
void SI4735::setSSBAutomaticVolumeControl(byte AVCEN)

setSSBAvcDivider

/*
 * Sets AVC Divider
 * for SSB mode, set divider = 0
 * for SYNC mode, set divider = 3 Other values = not allowed.
 */
void SI4735::setSSBAvcDivider(byte AVC_DIVIDER)

setSBBSidebandCutoffFilter

/* 
 * Sets SBB Sideband Cutoff Filter for band pass and low pass filters:
 * 0 = Band pass filter to cutoff both the unwanted side band and high frequency components > 2.0 kHz of the wanted side band. (default)
 * 1 = Low pass filter to cutoff the unwanted side band. 
 * Other values = not allowed.
 */
void SI4735::setSBBSidebandCutoffFilter(byte SBCUTFLT)

setSSBAudioBandwidth

/*
 * SSB Audio Bandwidth for SSB mode
 * 
 * 0 = 1.2 kHz low-pass filter* . (default)
 * 1 = 2.2 kHz low-pass filter* .
 * 2 = 3.0 kHz low-pass filter.
 * 3 = 4.0 kHz low-pass filter.
 * 4 = 500 Hz band-pass filter for receiving CW signal, i.e. [250 Hz, 750 Hz]
 *     with center frequency at 500 Hz when USB is selected or [-250 Hz, -750 1Hz] with center 
 *     frequency at -500Hz when LSB is selected* .
 * 5 = 1 kHz band-pass filter for receiving CW signal, i.e. [500 Hz, 1500 Hz] with center 
 *     frequency at 1 kHz when USB is selected or [-500 Hz, -1500 1 Hz] with center frequency 
 *     at -1kHz when LSB is selected* .
 * Other values = reserved.
 * Note:
 *   If audio bandwidth selected is about 2 kHz or below, it is recommended to set SBCUTFLT[3:0] to 0 
 *   to enable the band pass filter for better high- cut performance on the wanted side band. 
 *   Otherwise, set it to 1.
 * 
 * See AN332 REV 0.8 UNIVERSAL PROGRAMMING GUIDE; page 24 
 */
void SI4735::setSSBAudioBandwidth(byte AUDIOBW)

setSSB

/*
 * Set the radio to SSB (LW/MW/SW) function. 
 * 
 * See AN332 REV 0.8 UNIVERSAL PROGRAMMING GUIDE; pages 13 and 14
 * 
 * @param fromFreq minimum frequency for the band
 * @param toFreq maximum frequency for the band
 * @param initialFreq initial frequency 
 * @param step step used to go to the next channel  
 * @param usblsb SSB Upper Side Band (USB) and Lower Side Band (LSB) Selection; 
 *               value 2 (banary 10) = USB; 
 *               value 1 (banary 01) = LSB.   
 */
void SI4735::setSSB(unsigned fromFreq, unsigned toFreq, unsigned initialFreq, byte step, byte usblsb)




Referências

  1. Silicon Labs Si4737 WB/AM/FM Stereo/RDS single-chip receiver HAL library for Arduino
  2. BROADCAST AM/FM/SW/LW RADIO RECEIVER
  3. SI47XX PROGRAMMING GUIDE
  4. AN332 REV 0.8 UNIVERSAL PROGRAMMING GUIDE AMENDMENT FOR SI4735-D60 SSB AND NBFM PATCHES
  5. Installing Additional Arduino Libraries
  6. Specification of the radio data system (RDS) for VHF/FM sound broadcasting in the frequency range from 87,5 to 108,0 MHz
  7. Radio Data System
  8. RDS Encoder
  9. RDS in Europe, RBDS in the USA –What are the differences and how canreceivers cope with both systems?
  10. RBDS & RDS PTY Codes and Program Types
  11. Using RDS/RBDS with the Si4701/03
  12. Si47XX ANTENNA, SCHEMATIC, LAYOUT, AND DESIGN GUIDELINES; AN383
  13. Other implementations using Si4735 and Arduino
  14. I2C
  15. Forums

Vídeos