Library for KT0915, DSP radio IC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers KT0915.cpp Source File

KT0915.cpp

00001 #include "mbed.h"
00002 #include "KT0915.h"
00003 
00004 KT0915::KT0915(PinName sda,PinName scl):
00005     _KT0915(sda,scl)
00006 {
00007     _KT0915.frequency(100000);
00008 }
00009 
00010 void KT0915::init(void)
00011 {
00012     write_reg(0x02, 0b00000000, 0b00000111);//FM space:100KHz, R/L mute:disable
00013     write_reg(0x04, 0b11100000, 0b10010000);//FM/AM/device mute:disable, bass:disable DAC cap:60uF
00014     write_reg(0x05, 0b10011000, 0b00100000);//Mono:enable, de-emphasis:50uF, blend:disable
00015     write_reg(0x0A, 0b00000100, 0b00000000);//LDO:highest, FM AFC:enable
00016     write_reg(0x0C, 0b00000000, 0b00101100);//FM wide freq:enable
00017     write_reg(0x0F, 0b10001000, 0b00000000);//Stanby:disable, volume:0
00018     read_reg(0x16,&data1,&data2);
00019     write_reg(0x16,data1&0b000111111, 0b11000010);//mode:FM, use internal defined band, audio gain:0dB, AM AFC:enable
00020     write_reg(0x22, 0b10100010, 0b11101100);//AM AGC fast win:fastest, AM AGC short win:slowest
00021     //AM bandwidth:6KHz, AM gain:12dB, Left Inverse Control:enable
00022     read_reg(0x23, &data1, &data2);
00023     write_reg(0x23, (data1 | 0b00011100), data2);//low th:B
00024     write_reg(0x2E, 0b00101000, 0b10001100);//softmute:fast, AM softmute start level:0b100
00025     //softmute target volume:0b0100, softmute mode:RSSI, FM softmute start threshold:0b100
00026     write_reg(0x33, 0b01010100, 0b00000001);//AM space:9KHz
00027     read_reg(0x3F, &data1, &data2);
00028     write_reg(0x3F, data1, ((data2 & 0b10001000) | 0b00010011));//RF AGC patch
00029 }
00030 
00031 int KT0915::getID(void)
00032 {
00033     read_reg(0x01,&data1,&data2);
00034     return (data1<<8)+data2;
00035 }
00036 
00037 void KT0915::set_xtal(int xtal)
00038 {
00039     read_reg(0x16,&data1,&data2);
00040     if(xtal==32) {
00041         write_reg(0x16,data1&0b11100000,data2);
00042     } else if(xtal==38) {
00043         write_reg(0x16,(data1&0b11100000)|0b00001001,data2);
00044     } else if(xtal==12000) {
00045         write_reg(0x16,(data1&0b11100000)|0b00010011,data2);
00046     } else if(xtal==24000) {
00047         write_reg(0x16,(data1&0b11100000)|0b00010111,data2);
00048     }
00049 }
00050 
00051 void KT0915::set_space(bool mode,int space)
00052 {
00053     if(mode==0) {
00054         read_reg(0x33,&data1,&data2);
00055         read_reg(0x22,&data1,&data2);
00056         if(space==1) {
00057             write_reg(0x33,data1&0b00111111,data2);
00058             write_reg(0x22,data1,data2&0b00111111);
00059         } else if(space==9) {
00060             write_reg(0x33,(data1&0b00111111)|0b01000000,data2);
00061             write_reg(0x22,data1,data2|0b11000000);
00062         } else if(space==10) {
00063             write_reg(0x33,data1|0b11000000,data2);
00064             write_reg(0x22,data1,data2|0b11000000);
00065         }
00066     } else {
00067         read_reg(0x02,&data1,&data2);
00068         if(space==50) {
00069             write_reg(0x02,data1,(data2&0b11110011)|0b00001000);
00070         } else if(space==100) {
00071             write_reg(0x02,data1,(data2&0b11110011)|0b00000100);
00072         } else if(space==200) {
00073             write_reg(0x02,data1,data2&0b11110011);
00074         }
00075     }
00076 }
00077 
00078 void KT0915::set_vol(int vol)
00079 {
00080     read_reg(0x0F, &data1, &data2);
00081     if ((data2 & 0b00011111) != vol) {
00082         write_reg(0x0F, data1, (data2 >> 5) * 0b100000 + vol);
00083     }
00084 }
00085 
00086 void KT0915::set_freq(bool mode,int freq)
00087 {
00088     int f_upper, f_lower, freq2;
00089     read_reg(0x16,&data1,&data2);
00090     if (mode == 0) {
00091         write_reg(0x16, data1|0b10000000,data2);
00092         f_upper = (freq >> 8 | 0b10000000);
00093         f_lower = freq & 0b11111111;
00094         write_reg(0x17, f_upper, f_lower);
00095     }
00096     if (mode == 1) {
00097         write_reg(0x16, data1&0b01111111,data2);
00098         freq2 = freq / 5;
00099         f_upper = (freq2 >> 8 | 0b10000000);
00100         f_lower = freq2 & 0b11111111;
00101         write_reg(0x03, f_upper, f_lower);
00102     }
00103 }
00104 
00105 int KT0915::get_rssi(bool mode)
00106 {
00107     int rssi;
00108     if (mode == 0) {
00109         read_reg(0x24, &data1, &data2);
00110         rssi = -90 + ( data1 & 0b00011111) * 3;
00111     }
00112     if (mode == 1) {
00113         read_reg(0x12, &data1, &data2);
00114         rssi = -100 + (data2 >> 3) * 3;
00115     }
00116     return rssi;
00117 }
00118 
00119 int KT0915::get_snr(bool mode)
00120 {
00121     int snr;
00122     if (mode == 1) {
00123         read_reg(0x14, &data1, &data2);
00124         snr = (data1 & 0b00011111) * 0b100 + (data2 >> 6);
00125     }
00126     return snr;
00127 }
00128 
00129 bool KT0915::get_ready(void)
00130 {
00131     read_reg(0x14,&data1,&data2);
00132     return (data1&0b00100000)>>5;
00133 }
00134 
00135 void KT0915::cali(void)   //re_cali
00136 {
00137     write_reg(0x10,0b01100000,0b00000000);
00138 }
00139 
00140 
00141 void KT0915::write_reg(int memory_address,int byte1,int byte2)
00142 {
00143     char cmd[3]= {memory_address,byte1,byte2};
00144     _KT0915.write(KT0915_address,cmd,3);
00145 }
00146 
00147 void KT0915::read_reg(int memory_address,int *byte1,int *byte2)
00148 {
00149     char cmd[2];
00150     cmd[0]=memory_address;
00151     _KT0915.write(KT0915_address,cmd,1,true);
00152     _KT0915.read(KT0915_address|1,cmd,2);
00153     *byte1=cmd[0];
00154     *byte2=cmd[1];
00155 }