Library for KT0915, DSP radio IC

Revision:
2:108a1ae04859
Parent:
0:e5bccd46b6db
Child:
3:a86c8f7a4e47
--- a/KT0915.cpp	Tue Jan 09 11:48:49 2018 +0000
+++ b/KT0915.cpp	Wed Jan 10 08:49:24 2018 +0000
@@ -9,13 +9,14 @@
 
 void KT0915::init(void)
 {
-    int data1,data2;
     write_reg(0x02, 0b00000000, 0b00000111);//FM space:100KHz, R/L mute:disable
     write_reg(0x04, 0b11100000, 0b10010000);//FM/AM/device mute:disable, bass:disable DAC cap:60uF
     write_reg(0x05, 0b10011000, 0b00100000);//Mono:enable, de-emphasis:50uF, blend:disable
     write_reg(0x0A, 0b00000100, 0b00000000);//LDO:highest, FM AFC:enable
     write_reg(0x0C, 0b00000000, 0b00101100);//FM wide freq:enable
     write_reg(0x0F, 0b10001000, 0b00000000);//Stanby:disable, volume:0
+    read_reg(0x16,&data1,&data2);
+    write_reg(0x16,data1&0b000111111, 0b11000010);
     write_reg(0x22, 0b10100010, 0b11101100);//AM AGC fast win:fastest, AM AGC short win:slowest
     //AM bandwidth:6KHz, AM gain:12dB, Left Inverse Control:enable
     read_reg(0x23, &data1, &data2);
@@ -29,14 +30,53 @@
 
 int KT0915::getID(void)
 {
-    int data1,data2;
     read_reg(0x01,&data1,&data2);
     return (data1<<8)+data2;
 }
 
+void KT0915::set_xtal(int xtal)
+{
+    read_reg(0x16,&data1,&data2);
+    if(xtal==32) {
+        write_reg(0x16,data1&0b11100000,data2);
+    } else if(xtal==38) {
+        write_reg(0x16,(data1&0b11100000)|0b00001001,data2);
+    } else if(xtal==12000) {
+        write_reg(0x16,(data1&0b11100000)|0b00010011,data2);
+    } else if(xtal==24000) {
+        write_reg(0x16,(data1&0b11100000)|0b00010111,data2);
+    }
+}
+
+void KT0915::set_space(bool mode,int space)
+{
+    if(mode==0) {
+        read_reg(0x33,&data1,&data2);
+        read_reg(0x22,&data1,&data2);
+        if(space==1) {
+            write_reg(0x33,data1&0b00111111,data2);
+            write_reg(0x22,data1,data2&0b00111111);
+        } else if(space==9) {
+            write_reg(0x33,(data1&0b00111111)|0b01000000,data2);
+            write_reg(0x22,data1,data2|0b11000000);
+        } else if(space==10) {
+            write_reg(0x33,data1|0b11000000,data2);
+            write_reg(0x22,data1,data2|0b11000000);
+        }
+    } else {
+        read_reg(0x02,&data1,&data2);
+        if(space==50) {
+            write_reg(0x02,data1,(data2&0b11110011)|0b00001000);
+        } else if(space==100) {
+            write_reg(0x02,data1,(data2&0b11110011)|0b00000100);
+        } else if(space==200) {
+            write_reg(0x02,data1,data2&0b11110011);
+        }
+    }
+}
+
 void KT0915::set_vol(int vol)
 {
-    int data1, data2;
     read_reg(0x0F, &data1, &data2);
     if ((data2 & 0b00011111) != vol) {
         write_reg(0x0F, data1, (data2 >> 5) * 0b100000 + vol);
@@ -46,14 +86,15 @@
 void KT0915::set_freq(bool mode,int freq)
 {
     int f_upper, f_lower, freq2;
+    read_reg(0x16,&data1,&data2);
     if (mode == 0) {
-        write_reg(0x16, 0b10000000, 0b11000010);
+        write_reg(0x16, data1|0b10000000,data2);
         f_upper = (freq >> 8 | 0b10000000);
         f_lower = freq & 0b11111111;
         write_reg(0x17, f_upper, f_lower);
     }
     if (mode == 1) {
-        write_reg(0x16, 0b00000000, 0b11000010);
+        write_reg(0x16, data1&0b01111111,data2);
         freq2 = freq / 5;
         f_upper = (freq2 >> 8 | 0b10000000);
         f_lower = freq2 & 0b11111111;
@@ -63,7 +104,7 @@
 
 int KT0915::get_rssi(bool mode)
 {
-    int rssi, data1, data2;
+    int rssi;
     if (mode == 0) {
         read_reg(0x24, &data1, &data2);
         rssi = -90 + ( data1 & 0b00011111) * 3;
@@ -77,7 +118,7 @@
 
 int KT0915::get_snr(bool mode)
 {
-    int snr, data1, data2;
+    int snr;
     if (mode == 1) {
         read_reg(0x14, &data1, &data2);
         snr = (data1 & 0b00011111) * 0b100 + (data2 >> 6);
@@ -87,29 +128,28 @@
 
 bool KT0915::get_ready(void)
 {
-    int data1,data2;
     read_reg(0x14,&data1,&data2);
     return (data1&0b00100000)>>5;
 }
 
-void KT0915::cali(void)//re_cali
+void KT0915::cali(void)   //re_cali
 {
     write_reg(0x10,0b01100000,0b00000000);
 }
 
 
-void KT0915::write_reg(int memory_address,int data1,int data2)
+void KT0915::write_reg(int memory_address,int byte1,int byte2)
 {
-    char cmd[3]= {memory_address,data1,data2};
+    char cmd[3]= {memory_address,byte1,byte2};
     _KT0915.write(KT0915_address,cmd,3);
 }
 
-void KT0915::read_reg(int memory_address,int *data1,int *data2)
+void KT0915::read_reg(int memory_address,int *byte1,int *byte2)
 {
     char cmd[2];
     cmd[0]=memory_address;
     _KT0915.write(KT0915_address,cmd,1,true);
     _KT0915.read(KT0915_address|1,cmd,2);
-    *data1=cmd[0];
-    *data2=cmd[1];
+    *byte1=cmd[0];
+    *byte2=cmd[1];
 }