Library for TEA5767 FM stereo radio module

Dependents:   TEA5767_RadioFM_Test_Code Progetto

Committer:
edodm85
Date:
Sat Oct 05 11:54:59 2013 +0000
Revision:
1:d7804b4d7fa5
Parent:
0:bb7cae1d62ce
Added header

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 0:bb7cae1d62ce 1 #include "TEA5767.h"
edodm85 0:bb7cae1d62ce 2
edodm85 0:bb7cae1d62ce 3
edodm85 0:bb7cae1d62ce 4 TEA5767::TEA5767(PinName sda, PinName scl, int addr) : i2c(sda, scl), addr(addr)
edodm85 0:bb7cae1d62ce 5 {
edodm85 0:bb7cae1d62ce 6 SetBand('e');
edodm85 0:bb7cae1d62ce 7 Init();
edodm85 0:bb7cae1d62ce 8 }
edodm85 0:bb7cae1d62ce 9
edodm85 0:bb7cae1d62ce 10
edodm85 0:bb7cae1d62ce 11 TEA5767::~TEA5767()
edodm85 0:bb7cae1d62ce 12 {
edodm85 0:bb7cae1d62ce 13 }
edodm85 0:bb7cae1d62ce 14
edodm85 0:bb7cae1d62ce 15
edodm85 0:bb7cae1d62ce 16 void TEA5767::Init()
edodm85 0:bb7cae1d62ce 17 {
edodm85 0:bb7cae1d62ce 18 if(band == 'e')
edodm85 0:bb7cae1d62ce 19 {
edodm85 0:bb7cae1d62ce 20 SetFrequency(87.5, 'h'); // starting frequency
edodm85 0:bb7cae1d62ce 21 }else
edodm85 0:bb7cae1d62ce 22 {
edodm85 0:bb7cae1d62ce 23 SetFrequency(76, 'h'); // starting frequency
edodm85 0:bb7cae1d62ce 24 }
edodm85 0:bb7cae1d62ce 25 }
edodm85 0:bb7cae1d62ce 26
edodm85 0:bb7cae1d62ce 27
edodm85 0:bb7cae1d62ce 28 void TEA5767::SetBand(char valueBand)
edodm85 0:bb7cae1d62ce 29 {
edodm85 0:bb7cae1d62ce 30 if(valueBand == 'e' | valueBand == 'j')
edodm85 0:bb7cae1d62ce 31 band = valueBand;
edodm85 0:bb7cae1d62ce 32 }
edodm85 0:bb7cae1d62ce 33
edodm85 0:bb7cae1d62ce 34
edodm85 0:bb7cae1d62ce 35 void TEA5767::SetFrequency(double freq, char side)
edodm85 0:bb7cae1d62ce 36 {
edodm85 0:bb7cae1d62ce 37 frequency = SideInjection(freq, side);
edodm85 0:bb7cae1d62ce 38 SetData(frequency);
edodm85 0:bb7cae1d62ce 39 }
edodm85 0:bb7cae1d62ce 40
edodm85 0:bb7cae1d62ce 41
edodm85 0:bb7cae1d62ce 42 unsigned int TEA5767::SideInjection(float freq, char mode)
edodm85 0:bb7cae1d62ce 43 {
edodm85 0:bb7cae1d62ce 44 side = mode;
edodm85 0:bb7cae1d62ce 45 if(side == 'h')
edodm85 0:bb7cae1d62ce 46 {
edodm85 0:bb7cae1d62ce 47 // IF = 225KHz
edodm85 0:bb7cae1d62ce 48 unsigned int N_h = (4 * (freq * 1000000 + 225000)) / 32768; // formula for high side injection
edodm85 0:bb7cae1d62ce 49 return N_h; // return PLL word
edodm85 0:bb7cae1d62ce 50 }else
edodm85 0:bb7cae1d62ce 51 {
edodm85 0:bb7cae1d62ce 52 unsigned int N_l = (4 * (freq * 1000000 - 225000)) / 32768; // formula for low side injection
edodm85 0:bb7cae1d62ce 53 return N_l; // return PLL word
edodm85 0:bb7cae1d62ce 54 }
edodm85 0:bb7cae1d62ce 55 }
edodm85 0:bb7cae1d62ce 56
edodm85 0:bb7cae1d62ce 57
edodm85 0:bb7cae1d62ce 58 void TEA5767::SearchUp(float freq)
edodm85 0:bb7cae1d62ce 59 {
edodm85 0:bb7cae1d62ce 60 SetData(SideInjection(freq, 'h'), 0x40, 0xd0, 0x10, 0x00);
edodm85 0:bb7cae1d62ce 61 }
edodm85 0:bb7cae1d62ce 62
edodm85 0:bb7cae1d62ce 63
edodm85 0:bb7cae1d62ce 64 void TEA5767::SearchDown(float freq)
edodm85 0:bb7cae1d62ce 65 {
edodm85 0:bb7cae1d62ce 66 SetData(SideInjection(freq, 'h'), 0x40, 0x50, 0x10, 0x00);
edodm85 0:bb7cae1d62ce 67 }
edodm85 0:bb7cae1d62ce 68
edodm85 0:bb7cae1d62ce 69
edodm85 0:bb7cae1d62ce 70 float TEA5767::FreqCurrent()
edodm85 0:bb7cae1d62ce 71 {
edodm85 0:bb7cae1d62ce 72 char buf_temp[5];
edodm85 0:bb7cae1d62ce 73 GetData(buf_temp);
edodm85 0:bb7cae1d62ce 74 frequency = ((buf_temp[0]&0x3f)<<8) | buf_temp[1];
edodm85 0:bb7cae1d62ce 75
edodm85 0:bb7cae1d62ce 76 if(side == 'h')
edodm85 0:bb7cae1d62ce 77 {
edodm85 0:bb7cae1d62ce 78 return (((((float)frequency*32768)/4)-225000)/1000000);
edodm85 0:bb7cae1d62ce 79 }else
edodm85 0:bb7cae1d62ce 80 {
edodm85 0:bb7cae1d62ce 81 return (((((float)frequency*32768)/4)+225000)/1000000);
edodm85 0:bb7cae1d62ce 82 }
edodm85 0:bb7cae1d62ce 83 }
edodm85 0:bb7cae1d62ce 84
edodm85 0:bb7cae1d62ce 85
edodm85 0:bb7cae1d62ce 86 void TEA5767::SetData(unsigned int N, char data_1, char data_3, char data_4, char data_5)
edodm85 0:bb7cae1d62ce 87 {
edodm85 0:bb7cae1d62ce 88
edodm85 0:bb7cae1d62ce 89
edodm85 0:bb7cae1d62ce 90 char buf[5];
edodm85 0:bb7cae1d62ce 91 char freqMSB = N >> 8; // 1st 6bit
edodm85 0:bb7cae1d62ce 92 char freqLSB = N & 0xff; // 2nd 8bit
edodm85 0:bb7cae1d62ce 93
edodm85 0:bb7cae1d62ce 94 buf[0] = ((data_1 & 0xc0) | freqMSB);
edodm85 0:bb7cae1d62ce 95 buf[1] = freqLSB;
edodm85 0:bb7cae1d62ce 96 buf[2] = data_3;
edodm85 0:bb7cae1d62ce 97 if(band == 'e')
edodm85 0:bb7cae1d62ce 98 {
edodm85 0:bb7cae1d62ce 99 buf[3] = data_4 & 0xdf;
edodm85 0:bb7cae1d62ce 100 }else
edodm85 0:bb7cae1d62ce 101 {
edodm85 0:bb7cae1d62ce 102 buf[3] = data_4 | 0x10;
edodm85 0:bb7cae1d62ce 103 }
edodm85 0:bb7cae1d62ce 104 buf[4] = data_5;
edodm85 0:bb7cae1d62ce 105
edodm85 0:bb7cae1d62ce 106 i2c.write(addr, buf, 5);
edodm85 0:bb7cae1d62ce 107 }
edodm85 0:bb7cae1d62ce 108
edodm85 0:bb7cae1d62ce 109
edodm85 0:bb7cae1d62ce 110
edodm85 0:bb7cae1d62ce 111 void TEA5767::GetData(char* reg)
edodm85 0:bb7cae1d62ce 112 {
edodm85 0:bb7cae1d62ce 113 memset(reg, 0, sizeof(reg));
edodm85 0:bb7cae1d62ce 114 i2c.read(addr, reg, 5);
edodm85 0:bb7cae1d62ce 115 }
edodm85 0:bb7cae1d62ce 116
edodm85 0:bb7cae1d62ce 117
edodm85 0:bb7cae1d62ce 118 int TEA5767::CheckDevice()
edodm85 0:bb7cae1d62ce 119 {
edodm85 0:bb7cae1d62ce 120 return i2c.write(addr, NULL, 0);
edodm85 0:bb7cae1d62ce 121 }
edodm85 0:bb7cae1d62ce 122
edodm85 0:bb7cae1d62ce 123
edodm85 0:bb7cae1d62ce 124 int TEA5767::SignalLevel()
edodm85 0:bb7cae1d62ce 125 {
edodm85 0:bb7cae1d62ce 126 char reg[5];
edodm85 0:bb7cae1d62ce 127 GetData(reg);
edodm85 0:bb7cae1d62ce 128 return ((reg[3]&0xf0)>>4);
edodm85 0:bb7cae1d62ce 129 }
edodm85 0:bb7cae1d62ce 130