hpdell 发表于 2011-5-29 09:31:52

rda5820 没有呻吟,代码如下,望高人指点

rda5820 没有呻吟,连噪音都没有,代码如下,望高人指点

sbit IIC_CLK = P1 ^ 7;
sbit IIC_SDA = P1 ^ 6;

#define IIC_CLK_L IIC_CLK=0
#define IIC_CLK_H IIC_CLK=1
#define IIC_SDA_L IIC_SDA=0
#define IIC_SDA_H IIC_SDA=1

#define INIT_FREQ   (875)    //870update by zhangjj
#define MIN_FM_FREQ (875)    //87MHz for EUR only for USA 87M
#define MAX_FM_FREQ (1080)   //108.Mhz
#define FM_SETUP_FREQ (1)    //调节频率时的步进范围 0.1Mhz

#define INIT_RX 0x0000//接收模式
#define INIT_TX 0x0001//发射模式

#define FM_AUTO_SEEK 0x8000//自动搜索模式
#define FM_NORMAL    0x0000//正常模式




#define RDA5820_I2C_ADRW 0x22
#define RDA5820_I2C_ADRR 0x23

/**********************************************************
启动子程序
在 SCL 高电平期间 SDA 发生负跳变【从高到低】
scl为高电平期间,sda产生一个下降沿
**********************************************************/
void IIC_start()
{
        DELAY5US();       
        IIC_SDA_H;       /*发送起始条件的数据信号*/
        DELAY5US();       
        IIC_CLK_H;
        DELAY5US();               /*起始条件建立时间大于4.7us,延时*/
        IIC_SDA_L;       /*发送起始信号*/
        DELAY5US();               /* 起始条件锁定时间大于4μs*/
        IIC_CLK_L;       /*钳住I2C 总线,准备发送或接收数据 */
        DELAY5US();       
}
/**********************************************************
停止子函数
在 SCL 高电平期间 SDA 发生正跳变 【从低到高】
scl高电平期间,sda产生一上升沿
**********************************************************/
void IIC_stop()
{
        DELAY5US();       
        IIC_SDA_L;                /*发送结束条件的数据信号*/
        DELAY5US();       
        IIC_CLK_H;                /*结束条件建立时间大于4μs*/
        DELAY5US();       
        IIC_SDA_H;                /*发送I2C 总线结束信号*/
        DELAY5US();       
}

/**********************************************************
读一个字节子程序
**********************************************************/
uchar RcvByte(uchar ack)               
{
        uchar i = LOW,Read_Data=LOW;
        IIC_SDA_H;                       /*置数据线为输入方式*/
        for(i=0;i<8;i++)    // 循环移入8个位
{
                DELAY5US();       
                IIC_CLK_L;       /*置时钟线为低,准备接收数据位*/
                DELAY5US();               /*时钟低电平周期大于4.7μs*/
                IIC_CLK_H;       /*置时钟线为高使数据线上数据有效*/
                DELAY5US();       
                Read_Data <<= 1;

                if(IIC_SDA==1)      
                {
                       Read_Data ++;
                }
        }
        IIC_CLK_L;       
        DELAY5US();       
        if(ack == SEND_ACK)       //主机读数据时,需要根据工作状况发送ACK
                IIC_SDA_L;                       //发送应答
        else
                IIC_SDA_H;                       //发送非应答

        DELAY5US();
        IIC_CLK_H;
        DELAY5US();
        IIC_CLK_L;
        DELAY5US();               
return (Read_Data);
}               

/**********************************************************
发送一个字节子程序
**********************************************************/
unsigned char IIC_writebyte(uchar write_data)               
{
       uchar i=0,ack=0;               //SWS自己的IIC
        for(i=0;i<8;i++)
        {
               if(write_data & 0x80)
                       IIC_SDA_H;
               else   
                      IIC_SDA_L;

               IIC_CLK_H;       /*置时钟线为高,通知被控器开始接收数据位*/
               DELAY5US();                       /*保证时钟高电平周期大于4μs*/
               IIC_CLK_L;       
               write_data <<= 1;       
               DELAY5US();
        }
        DELAY5US();
        IIC_SDA_H;               /*8 位发送完后释放数据线,准备接收应答位*/
        DELAY5US();
        IIC_CLK_H;
        DELAY5US();
        i = IIC_SDA;       //读取从机的应答信号,如果READ_SDA() == 0,应答;否则==1不应答

        if(i == 0x00)
                ack = SEND_ACK;
        else
                ack = SEND_NACK;

        DELAY5US();                               
        IIC_CLK_L;
        DELAY5US();
        return         (ack);
}



/*--------------------------------------------------
参数说明:
函数功能:void OperationRDA58XX_wr(unsigned char addr,unsigned int data_)
向RDA5820芯片里面写入相关的控制数据
addr器件的字地址
data_写入的数据
--------------------------------------------------*/
void OperationRDA58XX_wr(unsigned char addr,unsigned int data_)
{
        IIC_start();
        IIC_writebyte(RDA5820_I2C_ADRW);       
        IIC_writebyte(addr);
        delay_ms(2);       //延时很关键,
IIC_writebyte((unsigned char)(data_>>8));       //先写高8位
        IIC_writebyte((unsigned char)(data_));               //后写低8位
       
        IIC_stop();//发送结束       
        delay_ms(2);       //延时很关键,       
}



/*--------------------------------------------------
参数说明:
函数功能:unsigned int OperationRDA58XX_rd(unsigned char addr)
从RDA5820芯片里面读出数据

addr器件的字地址
返回读回来的数据
--------------------------------------------------*/
unsigned int OperationRDA58XX_rd(unsigned char addr)
{
        unsigned int ra_data=0;

        IIC_start();
        IIC_writebyte(RDA5820_I2C_ADRW);       
        IIC_writebyte(addr);
        delay_ms(2);       //延时很关键,
        IIC_start();
        IIC_writebyte(RDA5820_I2C_ADRR);
        ra_data = RcvByte(SEND_ACK) << 8;
        ra_data |= RcvByte(SEND_NACK);//读最后一个数据,发送NACK
        IIC_stop();//发送结束               
        return (ra_data);
}

void Radio_SoundOn()               //手动调台时用的函数。静音关闭,即开启声音输出功能
{       
        OperationRDA58XX_wr(0x02,0xc001);
}


void RDA5807_MUTE()
{
        OperationRDA58XX_wr(0x02,0x8001);       
}


void Radio_Freq_Write(unsigned short TunerFrequency)
{
        unsigned short curFreq=0;
        unsigned shortRDA5820_channel_tune = 0;
       
       unsigned charRDA5820_channel_tune ={0};
        nBand = 760;
        curFreq        = TunerFrequency - nBand ;
        RDA5820_channel_tune = curFreq>>2;        //03H 15:8
        RDA5820_channel_tune = (((curFreq&0x0003)<<6)|0x18);       //|(RDA5807_dat&0x0f));
        curFreq = (RDA5820_channel_tune <<8) | RDA5820_channel_tune;//| 0x0080;//频率范围是76-108MHz       
       
        OperationRDA58XX_wr(0x03,curFreq);

       
        OperationRDA58XX_wr(0x03,RDA5820_channel_tune);



}

void RDA5807Init()
{                                      
        unsigned int x40data=0;
        OperationRDA58XX_wr(0x02,0x0002);
        delay_ms(50);
        OperationRDA58XX_wr(0x02,0xC001);
        OperationRDA58XX_wr(0x02,0xC001);
        delay_ms(600);           //根据资料要求延时600ms,以保证晶体振动稳定

       
        OperationRDA58XX_wr(0x03,0x0010);       
        OperationRDA58XX_wr(0x04,0x0400);
        OperationRDA58XX_wr(0x05,0x88af);                //0x88af.0x884f 1000 1000 1010 1111       音量7
        OperationRDA58XX_wr(0x07,0x7800);
        OperationRDA58XX_wr(0x13,0x0008);
        OperationRDA58XX_wr(0x15,0x1420);               //0x1420,0x17a0
        OperationRDA58XX_wr(0x16,0xc000);
        OperationRDA58XX_wr(0x1c,0x3126);
        OperationRDA58XX_wr(0x22,0x9c24);               // 0x9624,
        OperationRDA58XX_wr(0x40,INIT_RX);        //上电初始化为接收模式
//        OperationRDA58XX_wr(0x47,0xf660);               // tx rds
///        OperationRDA58XX_wr(0x56,0xfc00);
//        OperationRDA58XX_wr(0x58,0x07ff);
//        OperationRDA58XX_wr(0x59,0x33ff);
}       

void main()
{       
        delays(1);//delay 1s
        TMOD = 0X00;       
        IIC_init();
        time1_init();
        RDA5807Init();

//        OperationRDA58XX_wr(0x02,0xd281);                //启动FM模块
//        Radio_Freq_Write(1062);
        for(;;)
        {
                Key_san();
        }
}

uud001 发表于 2011-5-29 10:52:58

个人觉得是i2c延时的事情 试试改下延时 以前自己的5807没音是这个原因导致的

hpdell 发表于 2011-5-29 12:27:01

这个I2C的,可以正常读写24C02、等其他的I2C芯片,现在发现打电话时,耳机里面会有嘟嘟的干扰声音出现,但就是没有噪音与电台的声音出现

format 发表于 2011-5-29 14:06:28

这个中文手册和英文手册,寄存器都对不上

hpdell 发表于 2011-5-29 18:53:27

好像有些事对不上,

hpdell 发表于 2011-5-29 18:55:07

现在好像有时候会有噪音出来,但是有时又没有,不知道是何故????
void RDA5807Init()
{   
        OperationRDA58XX_wr(0x02,0x0002);
        delay_ms(350);                                                                                //delay time >>100ms
        OperationRDA58XX_wr(0x02,0xC001);
        OperationRDA58XX_wr(0x02,0xC001);
        delay_ms(750);           //根据资料要求延时600ms,以保证晶体振动稳定


        OperationRDA58XX_wr(0x03,0x0010);       
        OperationRDA58XX_wr(0x05,0x884f);                //0x88af.0x884f 1000 1000 1010 1111       音量7



}   //修改初始化后才有噪音出来,但是,现在搜不到任何电台???????????????

avdiyer 发表于 2012-3-6 16:04:34

没有"呻吟"??
它要爽了才有可能吧?

hpdell 发表于 2012-3-9 17:25:59

哈哈,惭愧呀,字打错了哦

lettuce 发表于 2012-4-10 23:32:43

楼主是否可以共享一下您的相关文档。我发现好多文档里寄存器的设置都不全。谢谢!另外接收部分我已经调通了,以下初始设置请参考。
OperationRDA58XX_wr(0x02,0x0002);
OperationRDA58XX_wr(0x02,0xC301);
OperationRDA58XX_wr(0x05,0x88A3);
//Tune 99.0 MHz
freq=990;
chan=(((freq-870))<<6)|0x10;
OperationRDA58XX_wr(0x03,chan);

lwb807 发表于 2012-4-13 22:29:03

公司产品是用RDA5802粗看差点错了,
RDA的FM模块应该有提供初始化程序,正常情况先照搬,后再修改比较安全!

验证问答也有这种问题:7-9=?

sunmapleleaf 发表于 2012-12-2 22:00:54

我也遇到问题了 你调通了嘛? 我按手册上做了,但是收不都信号。

caesar_song 发表于 2012-12-17 15:57:17

页: [1]
查看完整版本: rda5820 没有呻吟,代码如下,望高人指点