搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 2011-5-29 09:31:52 | 显示全部楼层 |阅读模式
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)    //870  update 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 short  RDA5820_channel_tune = 0;
         
         unsigned char  RDA5820_channel_tune[2] ={0};
        nBand = 760;
        curFreq        = TunerFrequency - nBand ;
        RDA5820_channel_tune[0] = curFreq>>2;        //03H 15:8
        RDA5820_channel_tune[1] = (((curFreq&0x0003)<<6)|0x18);       //|(RDA5807_dat[3]&0x0f));
        curFreq = (RDA5820_channel_tune[0] <<8) | RDA5820_channel_tune[1];//| 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();
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-5-29 10:52:58 | 显示全部楼层
个人觉得是i2c延时的事情 试试改下延时 以前自己的5807没音是这个原因导致的

出0入0汤圆

 楼主| 发表于 2011-5-29 12:27:01 | 显示全部楼层
这个I2C的,可以正常读写24C02、等其他的I2C芯片,现在发现打电话时,耳机里面会有嘟嘟的干扰声音出现,但就是没有噪音与电台的声音出现

出0入0汤圆

发表于 2011-5-29 14:06:28 | 显示全部楼层
这个中文手册和英文手册,寄存器都对不上

出0入0汤圆

 楼主| 发表于 2011-5-29 18:53:27 | 显示全部楼层
好像有些事对不上,

出0入0汤圆

 楼主| 发表于 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



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

出0入0汤圆

发表于 2012-3-6 16:04:34 | 显示全部楼层
没有"呻吟"??
它要爽了才有可能吧?

出0入0汤圆

 楼主| 发表于 2012-3-9 17:25:59 | 显示全部楼层
哈哈,惭愧呀,字打错了哦

出0入0汤圆

发表于 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);  

出0入0汤圆

发表于 2012-4-13 22:29:03 | 显示全部楼层
公司产品是用RDA5802粗看差点错了,
RDA的FM模块应该有提供初始化程序,正常情况先照搬,后再修改比较安全!

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

出0入0汤圆

发表于 2012-12-2 22:00:54 | 显示全部楼层
我也遇到问题了 你调通了嘛? 我按手册上做了,但是收不都信号。
头像被屏蔽

出0入0汤圆

发表于 2012-12-17 15:57:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表