RDA5807M FM Radio library with RDS.

Dependents:   RDA5807M-FM-Radio EFM32 RDA5807M RDS Radio

Example program here:

https://developer.mbed.org/users/star297/code/RDA5807M-FM-Radio/

Revision:
0:527aa96336ac
Child:
1:2c8a64e71afd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RDA5807M.cpp	Tue Mar 31 22:26:32 2015 +0000
@@ -0,0 +1,173 @@
+#include "RDA5807M.h"
+
+
+int volume;
+
+unsigned int RDA5807M_WriteRegDef[6] ={0xC004,0x0000,0x0100,0x84D4,0x4000,0x0000}; // initial data
+
+
+RDA5807M::RDA5807M(PinName sda, PinName scl, int addr) : i2c(sda, scl), addr(addr)
+{   
+    Init();
+}
+
+RDA5807M::~RDA5807M()
+{
+}
+
+void RDA5807M::WriteAll()
+{ 
+    char buf[30];  
+    int i,x = 0;
+    for(i=0; i<12; i=i+2){
+        buf[i] = RDA5807M_WriteReg[x] >> 8;
+        x++;
+    }
+    x = 0;
+    for(i=1; i<13; i=i+2){
+        buf[i] = RDA5807M_WriteReg[x] & 0xFF;
+        x++;
+    }
+    i2c.write(0x20, buf, 14);
+}
+
+void RDA5807M::Init(){
+    int i;
+    for(i=0; i<6; i++){
+        RDA5807M_WriteReg[i] = RDA5807M_WriteRegDef[i];
+    }
+}
+
+void RDA5807M::PowerOn(){
+    RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] | 0x0010;
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_POWER;
+    WriteAll();
+    RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] & 0xFFEF;   //Disable tune after PowerOn operation
+}
+
+void RDA5807M::PowerOff(){
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] ^ RDA_POWER;
+    WriteAll();
+}
+
+void RDA5807M::Reset(){
+    Init();
+    PowerOn();
+}
+
+void RDA5807M::Volume(int vol){
+    if(vol > 15){
+        vol = 15;
+    }
+    if(vol < 0){
+        vol = 0;
+    }
+    RDA5807M_WriteReg[3] = (RDA5807M_WriteReg[3] & 0xFFF0)| vol;   // Set New Volume
+    WriteAll();
+}
+
+void RDA5807M::BassBoost(){
+    if ((RDA5807M_WriteReg[0] & 0x1000)==0){
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_BASS_ON;
+    }
+    else{
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_BASS_OFF;
+    }
+    WriteAll();
+}
+
+void RDA5807M::Mono(){
+    if ((RDA5807M_WriteReg[0] & 0x2000)==0){
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_MONO_ON;
+    }
+    else{
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_MONO_OFF;
+    }
+    WriteAll();
+}
+
+void RDA5807M::Mute(){
+    if ((RDA5807M_WriteReg[0] & 0x8000)==0){
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | 0x8000;
+    }
+    else{
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & 0x7FFF;
+    }
+    WriteAll();
+}
+
+void RDA5807M::Softmute(){
+    if ((RDA5807M_WriteReg[2] & 0x0200)==0){
+        RDA5807M_WriteReg[2] = RDA5807M_WriteReg[2] | 0x0200;
+    }
+    else{
+        RDA5807M_WriteReg[2] = RDA5807M_WriteReg[2] & 0xFDFF;
+    }
+    WriteAll();
+}
+
+void RDA5807M::SoftBlend(){
+    if ((RDA5807M_WriteReg[6] & 0x0001)==0){
+        RDA5807M_WriteReg[6] = RDA5807M_WriteReg[6] | 0x0001;
+    }
+    else{
+        RDA5807M_WriteReg[6] = RDA5807M_WriteReg[6] & 0xFFFE;
+    }
+    WriteAll();
+}
+
+void RDA5807M::SeekUp(){
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_SEEK_UP;   // Set Seek Up
+    WriteAll();
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_SEEK_STOP;   // Disable Seek
+}
+
+void RDA5807M::SeekDown(){
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_SEEK_DOWN;   // Set Seek Down
+    WriteAll();
+    RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_SEEK_STOP;   // Disable Seek
+}
+
+void RDA5807M::Frequency(float Freq){
+    int Channel;
+    Channel = (Freq-StartingFreq)/0.1;
+    Channel = Channel & 0x03FF;
+    RDA5807M_WriteReg[1] = Channel*64 +0x10;  // Channel + TUNE-Bit + Band=00(87-108) + Space=00(100kHz)
+    WriteAll();
+    RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] & RDA_TUNE_OFF;
+}
+
+void RDA5807M::RDS(){
+    if ((RDA5807M_WriteReg[0] & RDA_RDS_ON)==0){
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_RDS_ON;
+    }
+    else{
+        RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_RDS_OFF;
+    }
+    WriteAll();
+}
+
+void RDA5807M::Read(){
+   int i;
+   char rcv[12];    
+   i2c.read(0x20, rcv,12);   // read 12 bytes for reg 0x0A .. reg 0x0F 
+        for(i=0; i<6; i++){
+            RDA5807M_ReadReg[i] = ((rcv[i *2] << 8) | rcv [(i*2) +1] );
+        }
+   
+    rdsready = RDA5807M_ReadReg[0] & 0x8000;            //if rdsready != 0 rds data are ready
+    tuneok = RDA5807M_ReadReg[0] & 0x4000;              //if tuneok != 0 seek/tune completed
+    nochannel = RDA5807M_ReadReg[0] & 0x2000;           //if nochannel != 0 no channel found
+    rdssynchro = RDA5807M_ReadReg[0] & 0x1000;          //if rdssynchro = 1000 rds decoder syncrhonized
+    stereo = RDA5807M_ReadReg[0] & 0x0400;              //if stereo = 0 station is mono else stereo
+    freq = (((RDA5807M_ReadReg[0] & 0x03FF) * 100) + 87000);    //return freq ex 102600KHz > 102.6MHz
+    signal = RDA5807M_ReadReg[1] >> 10;                 //return signal strength rssi
+    fmready = RDA5807M_ReadReg[1] & 0x0008;             //if fmready = 8 > fm is ready
+    fmstation = RDA5807M_ReadReg[1] & 0x0100;           //if fmstation = 100 fm station is true
+    rdsblockerror = RDA5807M_ReadReg[1] & 0x000C;       //check for rds blocks errors
+                                                        //00= 0 errors,01= 1~2 errors requiring correction
+                                                        //10= 3~5 errors requiring correction
+                                                        //11= 6+ errors or error in checkword, correction not possible.
+}
+
+