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/
Diff: RDA5807M.cpp
- 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. +} + +