Library for KT0915, DSP radio IC
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Thu Jul 14 2022 08:00:47 by 1.7.2