|
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, 杜汶泽)
|