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/
RDA5807M.cpp@0:527aa96336ac, 2015-03-31 (annotated)
- 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?
User | Revision | Line number | New 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 |