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/

Committer:
star297
Date:
Tue Mar 31 22:26:32 2015 +0000
Revision:
0:527aa96336ac
Child:
1:2c8a64e71afd
Initial version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:527aa96336ac 1 #include "RDA5807M.h"
star297 0:527aa96336ac 2
star297 0:527aa96336ac 3
star297 0:527aa96336ac 4 int volume;
star297 0:527aa96336ac 5
star297 0:527aa96336ac 6 unsigned int RDA5807M_WriteRegDef[6] ={0xC004,0x0000,0x0100,0x84D4,0x4000,0x0000}; // initial data
star297 0:527aa96336ac 7
star297 0:527aa96336ac 8
star297 0:527aa96336ac 9 RDA5807M::RDA5807M(PinName sda, PinName scl, int addr) : i2c(sda, scl), addr(addr)
star297 0:527aa96336ac 10 {
star297 0:527aa96336ac 11 Init();
star297 0:527aa96336ac 12 }
star297 0:527aa96336ac 13
star297 0:527aa96336ac 14 RDA5807M::~RDA5807M()
star297 0:527aa96336ac 15 {
star297 0:527aa96336ac 16 }
star297 0:527aa96336ac 17
star297 0:527aa96336ac 18 void RDA5807M::WriteAll()
star297 0:527aa96336ac 19 {
star297 0:527aa96336ac 20 char buf[30];
star297 0:527aa96336ac 21 int i,x = 0;
star297 0:527aa96336ac 22 for(i=0; i<12; i=i+2){
star297 0:527aa96336ac 23 buf[i] = RDA5807M_WriteReg[x] >> 8;
star297 0:527aa96336ac 24 x++;
star297 0:527aa96336ac 25 }
star297 0:527aa96336ac 26 x = 0;
star297 0:527aa96336ac 27 for(i=1; i<13; i=i+2){
star297 0:527aa96336ac 28 buf[i] = RDA5807M_WriteReg[x] & 0xFF;
star297 0:527aa96336ac 29 x++;
star297 0:527aa96336ac 30 }
star297 0:527aa96336ac 31 i2c.write(0x20, buf, 14);
star297 0:527aa96336ac 32 }
star297 0:527aa96336ac 33
star297 0:527aa96336ac 34 void RDA5807M::Init(){
star297 0:527aa96336ac 35 int i;
star297 0:527aa96336ac 36 for(i=0; i<6; i++){
star297 0:527aa96336ac 37 RDA5807M_WriteReg[i] = RDA5807M_WriteRegDef[i];
star297 0:527aa96336ac 38 }
star297 0:527aa96336ac 39 }
star297 0:527aa96336ac 40
star297 0:527aa96336ac 41 void RDA5807M::PowerOn(){
star297 0:527aa96336ac 42 RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] | 0x0010;
star297 0:527aa96336ac 43 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_POWER;
star297 0:527aa96336ac 44 WriteAll();
star297 0:527aa96336ac 45 RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] & 0xFFEF; //Disable tune after PowerOn operation
star297 0:527aa96336ac 46 }
star297 0:527aa96336ac 47
star297 0:527aa96336ac 48 void RDA5807M::PowerOff(){
star297 0:527aa96336ac 49 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] ^ RDA_POWER;
star297 0:527aa96336ac 50 WriteAll();
star297 0:527aa96336ac 51 }
star297 0:527aa96336ac 52
star297 0:527aa96336ac 53 void RDA5807M::Reset(){
star297 0:527aa96336ac 54 Init();
star297 0:527aa96336ac 55 PowerOn();
star297 0:527aa96336ac 56 }
star297 0:527aa96336ac 57
star297 0:527aa96336ac 58 void RDA5807M::Volume(int vol){
star297 0:527aa96336ac 59 if(vol > 15){
star297 0:527aa96336ac 60 vol = 15;
star297 0:527aa96336ac 61 }
star297 0:527aa96336ac 62 if(vol < 0){
star297 0:527aa96336ac 63 vol = 0;
star297 0:527aa96336ac 64 }
star297 0:527aa96336ac 65 RDA5807M_WriteReg[3] = (RDA5807M_WriteReg[3] & 0xFFF0)| vol; // Set New Volume
star297 0:527aa96336ac 66 WriteAll();
star297 0:527aa96336ac 67 }
star297 0:527aa96336ac 68
star297 0:527aa96336ac 69 void RDA5807M::BassBoost(){
star297 0:527aa96336ac 70 if ((RDA5807M_WriteReg[0] & 0x1000)==0){
star297 0:527aa96336ac 71 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_BASS_ON;
star297 0:527aa96336ac 72 }
star297 0:527aa96336ac 73 else{
star297 0:527aa96336ac 74 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_BASS_OFF;
star297 0:527aa96336ac 75 }
star297 0:527aa96336ac 76 WriteAll();
star297 0:527aa96336ac 77 }
star297 0:527aa96336ac 78
star297 0:527aa96336ac 79 void RDA5807M::Mono(){
star297 0:527aa96336ac 80 if ((RDA5807M_WriteReg[0] & 0x2000)==0){
star297 0:527aa96336ac 81 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_MONO_ON;
star297 0:527aa96336ac 82 }
star297 0:527aa96336ac 83 else{
star297 0:527aa96336ac 84 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_MONO_OFF;
star297 0:527aa96336ac 85 }
star297 0:527aa96336ac 86 WriteAll();
star297 0:527aa96336ac 87 }
star297 0:527aa96336ac 88
star297 0:527aa96336ac 89 void RDA5807M::Mute(){
star297 0:527aa96336ac 90 if ((RDA5807M_WriteReg[0] & 0x8000)==0){
star297 0:527aa96336ac 91 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | 0x8000;
star297 0:527aa96336ac 92 }
star297 0:527aa96336ac 93 else{
star297 0:527aa96336ac 94 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & 0x7FFF;
star297 0:527aa96336ac 95 }
star297 0:527aa96336ac 96 WriteAll();
star297 0:527aa96336ac 97 }
star297 0:527aa96336ac 98
star297 0:527aa96336ac 99 void RDA5807M::Softmute(){
star297 0:527aa96336ac 100 if ((RDA5807M_WriteReg[2] & 0x0200)==0){
star297 0:527aa96336ac 101 RDA5807M_WriteReg[2] = RDA5807M_WriteReg[2] | 0x0200;
star297 0:527aa96336ac 102 }
star297 0:527aa96336ac 103 else{
star297 0:527aa96336ac 104 RDA5807M_WriteReg[2] = RDA5807M_WriteReg[2] & 0xFDFF;
star297 0:527aa96336ac 105 }
star297 0:527aa96336ac 106 WriteAll();
star297 0:527aa96336ac 107 }
star297 0:527aa96336ac 108
star297 0:527aa96336ac 109 void RDA5807M::SoftBlend(){
star297 0:527aa96336ac 110 if ((RDA5807M_WriteReg[6] & 0x0001)==0){
star297 0:527aa96336ac 111 RDA5807M_WriteReg[6] = RDA5807M_WriteReg[6] | 0x0001;
star297 0:527aa96336ac 112 }
star297 0:527aa96336ac 113 else{
star297 0:527aa96336ac 114 RDA5807M_WriteReg[6] = RDA5807M_WriteReg[6] & 0xFFFE;
star297 0:527aa96336ac 115 }
star297 0:527aa96336ac 116 WriteAll();
star297 0:527aa96336ac 117 }
star297 0:527aa96336ac 118
star297 0:527aa96336ac 119 void RDA5807M::SeekUp(){
star297 0:527aa96336ac 120 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_SEEK_UP; // Set Seek Up
star297 0:527aa96336ac 121 WriteAll();
star297 0:527aa96336ac 122 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_SEEK_STOP; // Disable Seek
star297 0:527aa96336ac 123 }
star297 0:527aa96336ac 124
star297 0:527aa96336ac 125 void RDA5807M::SeekDown(){
star297 0:527aa96336ac 126 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_SEEK_DOWN; // Set Seek Down
star297 0:527aa96336ac 127 WriteAll();
star297 0:527aa96336ac 128 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_SEEK_STOP; // Disable Seek
star297 0:527aa96336ac 129 }
star297 0:527aa96336ac 130
star297 0:527aa96336ac 131 void RDA5807M::Frequency(float Freq){
star297 0:527aa96336ac 132 int Channel;
star297 0:527aa96336ac 133 Channel = (Freq-StartingFreq)/0.1;
star297 0:527aa96336ac 134 Channel = Channel & 0x03FF;
star297 0:527aa96336ac 135 RDA5807M_WriteReg[1] = Channel*64 +0x10; // Channel + TUNE-Bit + Band=00(87-108) + Space=00(100kHz)
star297 0:527aa96336ac 136 WriteAll();
star297 0:527aa96336ac 137 RDA5807M_WriteReg[1] = RDA5807M_WriteReg[1] & RDA_TUNE_OFF;
star297 0:527aa96336ac 138 }
star297 0:527aa96336ac 139
star297 0:527aa96336ac 140 void RDA5807M::RDS(){
star297 0:527aa96336ac 141 if ((RDA5807M_WriteReg[0] & RDA_RDS_ON)==0){
star297 0:527aa96336ac 142 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] | RDA_RDS_ON;
star297 0:527aa96336ac 143 }
star297 0:527aa96336ac 144 else{
star297 0:527aa96336ac 145 RDA5807M_WriteReg[0] = RDA5807M_WriteReg[0] & RDA_RDS_OFF;
star297 0:527aa96336ac 146 }
star297 0:527aa96336ac 147 WriteAll();
star297 0:527aa96336ac 148 }
star297 0:527aa96336ac 149
star297 0:527aa96336ac 150 void RDA5807M::Read(){
star297 0:527aa96336ac 151 int i;
star297 0:527aa96336ac 152 char rcv[12];
star297 0:527aa96336ac 153 i2c.read(0x20, rcv,12); // read 12 bytes for reg 0x0A .. reg 0x0F
star297 0:527aa96336ac 154 for(i=0; i<6; i++){
star297 0:527aa96336ac 155 RDA5807M_ReadReg[i] = ((rcv[i *2] << 8) | rcv [(i*2) +1] );
star297 0:527aa96336ac 156 }
star297 0:527aa96336ac 157
star297 0:527aa96336ac 158 rdsready = RDA5807M_ReadReg[0] & 0x8000; //if rdsready != 0 rds data are ready
star297 0:527aa96336ac 159 tuneok = RDA5807M_ReadReg[0] & 0x4000; //if tuneok != 0 seek/tune completed
star297 0:527aa96336ac 160 nochannel = RDA5807M_ReadReg[0] & 0x2000; //if nochannel != 0 no channel found
star297 0:527aa96336ac 161 rdssynchro = RDA5807M_ReadReg[0] & 0x1000; //if rdssynchro = 1000 rds decoder syncrhonized
star297 0:527aa96336ac 162 stereo = RDA5807M_ReadReg[0] & 0x0400; //if stereo = 0 station is mono else stereo
star297 0:527aa96336ac 163 freq = (((RDA5807M_ReadReg[0] & 0x03FF) * 100) + 87000); //return freq ex 102600KHz > 102.6MHz
star297 0:527aa96336ac 164 signal = RDA5807M_ReadReg[1] >> 10; //return signal strength rssi
star297 0:527aa96336ac 165 fmready = RDA5807M_ReadReg[1] & 0x0008; //if fmready = 8 > fm is ready
star297 0:527aa96336ac 166 fmstation = RDA5807M_ReadReg[1] & 0x0100; //if fmstation = 100 fm station is true
star297 0:527aa96336ac 167 rdsblockerror = RDA5807M_ReadReg[1] & 0x000C; //check for rds blocks errors
star297 0:527aa96336ac 168 //00= 0 errors,01= 1~2 errors requiring correction
star297 0:527aa96336ac 169 //10= 3~5 errors requiring correction
star297 0:527aa96336ac 170 //11= 6+ errors or error in checkword, correction not possible.
star297 0:527aa96336ac 171 }
star297 0:527aa96336ac 172
star297 0:527aa96336ac 173