Library for KT0915, DSP radio IC

KT0915.cpp

Committer:
ritarosakai
Date:
2018-01-09
Revision:
0:e5bccd46b6db
Child:
2:108a1ae04859

File content as of revision 0:e5bccd46b6db:

#include "mbed.h"
#include "KT0915.h"

KT0915::KT0915(PinName sda,PinName scl):
    _KT0915(sda,scl)
{
    _KT0915.frequency(100000);
}

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
    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);
    write_reg(0x23, (data1 | 0b00011100), data2);//low th:B
    write_reg(0x2E, 0b00101000, 0b10001100);//softmute:fast, AM softmute start level:0b100
    //softmute target volume:0b0100, softmute mode:RSSI, FM softmute start threshold:0b100
    write_reg(0x33, 0b01010100, 0b00000001);//AM space:9KHz
    read_reg(0x3F, &data1, &data2);
    write_reg(0x3F, data1, ((data2 & 0b10001000) | 0b00010011));//RF AGC patch
}

int KT0915::getID(void)
{
    int data1,data2;
    read_reg(0x01,&data1,&data2);
    return (data1<<8)+data2;
}

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);
    }
}

void KT0915::set_freq(bool mode,int freq)
{
    int f_upper, f_lower, freq2;
    if (mode == 0) {
        write_reg(0x16, 0b10000000, 0b11000010);
        f_upper = (freq >> 8 | 0b10000000);
        f_lower = freq & 0b11111111;
        write_reg(0x17, f_upper, f_lower);
    }
    if (mode == 1) {
        write_reg(0x16, 0b00000000, 0b11000010);
        freq2 = freq / 5;
        f_upper = (freq2 >> 8 | 0b10000000);
        f_lower = freq2 & 0b11111111;
        write_reg(0x03, f_upper, f_lower);
    }
}

int KT0915::get_rssi(bool mode)
{
    int rssi, data1, data2;
    if (mode == 0) {
        read_reg(0x24, &data1, &data2);
        rssi = -90 + ( data1 & 0b00011111) * 3;
    }
    if (mode == 1) {
        read_reg(0x12, &data1, &data2);
        rssi = -100 + (data2 >> 3) * 3;
    }
    return rssi;
}

int KT0915::get_snr(bool mode)
{
    int snr, data1, data2;
    if (mode == 1) {
        read_reg(0x14, &data1, &data2);
        snr = (data1 & 0b00011111) * 0b100 + (data2 >> 6);
    }
    return snr;
}

bool KT0915::get_ready(void)
{
    int data1,data2;
    read_reg(0x14,&data1,&data2);
    return (data1&0b00100000)>>5;
}

void KT0915::cali(void)//re_cali
{
    write_reg(0x10,0b01100000,0b00000000);
}


void KT0915::write_reg(int memory_address,int data1,int data2)
{
    char cmd[3]= {memory_address,data1,data2};
    _KT0915.write(KT0915_address,cmd,3);
}

void KT0915::read_reg(int memory_address,int *data1,int *data2)
{
    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];
}