Library for TEA5767 FM stereo radio module
Dependents: TEA5767_RadioFM_Test_Code Progetto
TEA5767.cpp@1:d7804b4d7fa5, 2013-10-05 (annotated)
- 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?
User | Revision | Line number | New 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 |