打印
[国产单片机]

有用过收音机RTC6222的吗?调试不通

[复制链接]
1028|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这是原理图,RCLK是直接接到单片机晶振32.768K的XOUT脚上。代码附上,也不知道什么原因,根据官方demo的,就是搜不了音


#include "main.h"


//读芯片寄存器
u16 OperationRTC6222_read(u8 reg_offset)                       
{
    u16 reg_value = 0;

    fm_i2c_start();
    fm_i2c_send_byte(0xc8);
    fm_i2c_recv_ack();
    fm_i2c_send_byte(reg_offset);
    fm_i2c_recv_ack();
    fm_i2c_stop();

    delay_ms(10);//RTC6222_Delay(10);
    fm_i2c_start();
    fm_i2c_send_byte(0xc9);
    fm_i2c_recv_ack();

    reg_value = fm_i2c_read_byte();
    fm_i2c_send_ack();
    reg_value = reg_value<<8;
    reg_value +=  fm_i2c_read_byte();
    fm_i2c_send_nack();

    delay_ms(10);//RTC6222_Delay(10);
    fm_i2c_stop();

    return  reg_value;
}
//写芯片寄存器
void OperationRTC6222_write(u16 in_data, u8 reg_offset)
{
    fm_i2c_start();
    fm_i2c_send_byte(0xc8);
    fm_i2c_recv_ack();
    fm_i2c_send_byte(reg_offset);
    fm_i2c_recv_ack();

    fm_i2c_send_byte((u8)(in_data >> 8));
    fm_i2c_recv_ack();
    fm_i2c_send_byte((u8)in_data);
    fm_i2c_recv_ack();

    fm_i2c_stop();
}

u8 RTC6222_online(void)
{
        u8 i;
    for(i=0;i<3;i++) {
        if(0x1688 == OperationRTC6222_read(0)) {
            return 1;
        }
    }
    return 0;
}

void RTC6222_init_(void)
{
    OperationRTC6222_write(0x16AA,0x00); //Power off
    delay_ms(50);

    OperationRTC6222_write(0x96AA,0x00);//Power on
    delay_ms(100);

    OperationRTC6222_write(0x4000,0x02);//vol = 0a ,disable mute

    OperationRTC6222_write(0x1900,0x04);//enable rclk osc

    OperationRTC6222_write(0x656f,0x05);//set seek noise th and spike th ,0x01h=0010bin,00=80(noise_th),01=144(spike_th),and rssi th=0x0c.

                OperationRTC6222_write(0xB000,0x06);//bit15:ENABLE IC ,bit12:enable check same channal, bit:2-0set rlck choice one from  32k~38.4M
                OperationRTC6222_write(0xB400,0x07);   //正弦波
    OperationRTC6222_write(0x043C,0x08);//set seek band of freq  start_freq0x043C=1084. x100khz
    OperationRTC6222_write(0x0280,0x09);//set seek start_freq 0x035C=860, x100khz
    OperationRTC6222_write(0x0B10,0x11);//rclk force 0x0Bh= bin1011
    OperationRTC6222_write(0x1108,0x20);//1008 hopping open is better than 1018 nohopping
    delay_ms(100);
//                OperationRTC6222_write((OperationRTC6222_read(0X06)|0X8000),0X06);
//                delay_ms(100);
    //print_all_reg();
}

void RTC6222_init(void)
{
    OperationRTC6222_write(0x16AA,0x00); //Power off
    delay_ms(50);

    OperationRTC6222_write(0x96AA,0x00);//Power on
    delay_ms(100);

    OperationRTC6222_write(0x4000,0x02);//vol = 0a ,disable mute

    OperationRTC6222_write(0x1900,0x04);//enable rclk osc

    OperationRTC6222_write(0x656f,0x05);//set seek noise th and spike th ,0x01h=0010bin,00=80(noise_th),01=144(spike_th),and rssi th=0x0c.

                OperationRTC6222_write(0xB000,0x06);//bit15:ENABLE IC ,bit12:enable check same channal, bit:2-0set rlck choice one from  32k~38.4M
        //        OperationRTC6222_write(0xB400,0x07);   //正弦波
    OperationRTC6222_write(0x043C,0x08);//set seek band of freq  start_freq0x043C=1084. x100khz
    OperationRTC6222_write(0x0280,0x09);//set seek start_freq 0x035C=860, x100khz
    OperationRTC6222_write(0x0B10,0x11);//rclk force 0x0Bh= bin1011
    OperationRTC6222_write(0x1108,0x20);//1008 hopping open is better than 1018 nohopping
    delay_ms(100);
//                OperationRTC6222_write((OperationRTC6222_read(0X06)|0X8000),0X06);
//                delay_ms(100);
    //print_all_reg();
}

void RTC6222_off(void)
{
    OperationRTC6222_write(0x16AA,0x00);
    delay_ms(50);
}

void RTC6222_set_vol(u8 FM_Volumn)
{
        u16 write_byte=0;
    if(FM_Volumn > 15) {
        FM_Volumn = 15;
    }

     write_byte = 0x4000|(FM_Volumn&0x0f);
    OperationRTC6222_write(write_byte,0x02);
    //printf("RTC6222_set_vol vol=%d,0x%04x reg[2]=0x%04x\n",FM_Volumn,write_byte,OperationRTC6222_read(0x02));
}

void RTC6222_mute(bool is_mute)
{
    u16 write_byte;
    write_byte = OperationRTC6222_read(0x02);
    if (is_mute) {
        write_byte &= ~0x4000;
    }
    else {
        write_byte |= 0x4000;
    }
    OperationRTC6222_write(write_byte,0x02);

    //printf("RTC6222_mute is_mute = %d, reg[2]=0x%04x\n",is_mute,OperationRTC6222_read(0x02));
}

u8 RTC6222_set_freq(u16 channel_freq)
{
    u16 write_byte;
    u8 timeout = 0;
    u16 Seek_Status = 0;
        u16 test=0;
       
#ifndef __RTCFM_STEP_50K__
    channel_freq *= 10;
#endif
    //printf("==RTC6222_set_freq: %d\n",channel_freq);
    OperationRTC6222_write(0x8000|channel_freq,0x03);

    //New Algorithm part 1=on 0=off by Danny 20150724
    do{
        delay_ms(40);               // 8 = 40ms(Default) 2 = 10ms(Speed limit) by Danny 20150724
        timeout++;
        Seek_Status = ((0xFC00 & OperationRTC6222_read(0x0B)) >> 10);   //add by Danny 20150702
        //WATCHDOG_CLR();
                        test=OperationRTC6222_read(0x0A);
    }while ((Seek_Status == 0) && ((0x4000 & OperationRTC6222_read(0x0A))== 0) && (timeout < 200));
    //printf("Seek_Status_STD1= 0x%02X ",Seek_Status);

    Seek_Status = ((0xFC00 & OperationRTC6222_read(0x0B)) >> 10);   //add by Danny 20150702
    //printf("Seek_Status1= 0x%04X ",Seek_Status);

    write_byte = channel_freq & (~0x8000);
    OperationRTC6222_write(write_byte,0x03);

    while(0x4000 & OperationRTC6222_read(0x0A));

    Seek_Status = ((0xFC00 & OperationRTC6222_read(0x0B)) >> 10);   //add by Danny 20150702
    //printf("Seek_Status2= 0x%04X\n ",Seek_Status);
    if(Seek_Status == 0) {           //When Get Seek_Satus BK0_B[15:10] all 6b' = 0, Return 1. add by Danny 20150703
        return 1;
    }
    else {
        return 0;
    }
}

u8 RTC6222_seek_hw(u16 channel_freq)
{
    u16  write_byte;
        u16 read_buf;
    u8 return_value = 0;
#ifndef __RTCFM_STEP_50K__
    channel_freq *= 10;
#endif
    write_byte = OperationRTC6222_read(0x05);
   

    write_byte &= (~0x8000);
    OperationRTC6222_write(write_byte,0x05);

    write_byte |= 0x8000;
    OperationRTC6222_write(write_byte,0x05);

    do {
        read_buf = OperationRTC6222_read(0x0A);
        delay_ms(45);      //time out determined by reg0x04_9:8 seek time 0:40ms 1:160 ms
        //WATCHDOG_CLR();
    }
    while(!(0x4000&read_buf));

    if((0x6000&read_buf) == 0x6000) {//must judge at here and not move it at end of fuction
        return_value = 0;       //reach band top limited, all transport 0xff because app level has handled top limited freq like 110Mhz
    }
    else {
        //printf("\t%5d\t%d\t", 0x7fff&OperationRTC6222_read(0x0C),0x00ff&OperationRTC6222_read(0x0B));
        return_value = 1;       //tell app lever that need to read cur_freq from driver lever.
    }

    write_byte &= (~0x8000);
    OperationRTC6222_write(write_byte,0x05);

    while(0x4000&OperationRTC6222_read(0x0A));

    return return_value;
}

u8 RTC6222_seek(u16 channel_freq)
{
#if FM_SEEK_HW
    return RTC6222_seek_hw(channel_freq);
#else
    u8 Status0 = 0;

#ifdef __RTCFM_STEP_50K_CHOOSE_BEST_FROM_TW0__
    u16 IF_Shift_1 = 0, IF_Shift_2 = 0;
    u8 Status1 =0;
    u8 shiftindex=0; //请看函数头的返回值说明,0表示当前上层传给底层的頻点,1表示上层传给底层的頻点再+50k。在搜到台时来告诉上层存台和放音选择正确的頻点。
#endif

    Status0 = RTC6222_set_freq(channel_freq);  // Check Seek_States is 0 ornot by Danny 20150702
    //delay_5ms(20);

    if(Status0)
            {//Get one ture Channnel
#ifdef __RTCFM_STEP_50K_CHOOSE_BEST_FROM_TW0__
        if((0x0040 & OperationRTC6222_read(0x0E)) != 0)
                {
            IF_Shift_1 = (~(0x003F & OperationRTC6222_read(0x0E))+1) &0x003F; //2's complement
        }
        else {
            IF_Shift_1 = ((0x007F & OperationRTC6222_read(0x0E))); //2's complement
        }
        Status1 = RTC6222_set_freq(channel_freq+5);

        if(Status1)
                {
            if((0x0040 & OperationRTC6222_read(0x0E)) != 0)
                    {
                IF_Shift_2 = (~(0x003F & OperationRTC6222_read(0x0E))+1) &0x003F; //2's complement
            }
            else {
                IF_Shift_2 = ((0x007F & OperationRTC6222_read(0x0E))); //2's complement
            }


            if(IF_Shift_1 < IF_Shift_2) {
                RTC6222_set_freq(channel_freq);
                shiftindex = 0;
            }
            else {
                RTC6222_set_freq(channel_freq+5);
                shiftindex = 1;
            }

        }
        else {
            RTC6222_set_freq(channel_freq); //Back Channel 50KHz for Return 1
        }
        RSSIValue = (0x00FF & (OperationRTC6222_read(0x0B)));
        Reg_C = (OperationRTC6222_read(0x0C));
        //printf("freq= %d RSSI= %02d IF_Shift_1= %02d IF_Shift_2= %02d shiftindex= %d Return %d \n",Reg_C,RSSIValue,IF_Shift_1,IF_Shift_2,shiftindex,1+shiftindex);

        return (1+shiftindex);
#else
        return 1;
#endif
    }
    else {
        return 0;
    }
#endif
}

u16 RTC6222_read_cur_seeking_freq(void)
{
#ifdef __RTCFM_STEP_50K__
    return (0x7fff&OperationRTC6222_read(0x0C));
#else
    return (0x7fff&OperationRTC6222_read(0x0C)) / 10;
#endif
}




使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

570

帖子

1

粉丝