lpc1114驱动RDA5820 FM收音机程序

发布者:rnm888最新更新时间:2016-12-09 来源: eefocus关键字:lpc1114  驱动RDA5820  FM收音机 手机看文章 扫描二维码
随时随地手机看文章

rda5820.h文件:

#ifndef __RDA5820_H
#define __RDA5820_H     

#define RDA5820_R00        0X00  //读出16个位的ID =0X5820
#define RDA5820_R02        0X02  //DHIZ[15],DMUTE[14],MONO[13],BASS[12],SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:4],ANTENNA[2],SOFTRESET[1],ENABLE[0]
#define RDA5820_R03        0X03  //CHAN[15:6],TUNE[4],BAND[3:2],SPACE[1:0]
#define RDA5820_R04        0X04  //STCIEN[14](搜索完成中断),DE[11],I2S_ENABLE[6],GPIO3~1[5:0]
#define RDA5820_R05        0X05  //INT_MODE[15],SEEKTH[14:8](设定信号强度),LNA_PORT_SEL[7:6],LNA_ICSEL_BIT[5:4],VOLUME[3:0];
#define RDA5820_R0A        0X0A  //STC[14](搜索完成标志),SF[13](搜索失败标志),ST[10](立体声标志),READCHAN[9:0](频率).
#define RDA5820_R0B        0X0B  //RSSI[15:9](信号强度),FM_TRUE[8](站点标志),FM_READY[7](fm就绪标志)
#define RDA5820_R40        0X40  //AUTO_SEEK[15](全/半自动搜台),CHAN_SCAN[14](搜空/忙台),CHIP_FUN[3:0](工作模式)
#define RDA5820_R41        0X41  //MEM_CLR[15](内存清除),RPT_TIME[14:9](RDS应答次数),MEM_DEPTH[8:0](FIFO大小,最大256)
#define RDA5820_R42        0X42  //TX_SIG_GAIN[10:8],TX_PA_GAIN[5:0](发射功率).
#define RDA5820_R4A        0X4A  //MEM_INTMOD[4:0]
#define RDA5820_R4B        0X4B  //CHAN_NUM[7:0](仅在全自动搜台有效,代表电台数量).
#define RDA5820_R4C        0X4C  //TX_AUDIO_DEV[15:0]
#define RDA5820_R4D        0X4D  //TX_PILOT_DEV[15:0]
#define RDA5820_R4E        0X4E  //TX_RDS_DEV[15:0]
#define RDA5820_R53        0X53  //CHAN_BOTTON[10:0](通道最低频率,100kHZ为单位)
#define RDA5820_R54        0X54  //CHAN_TOP[10:0](通道最高频率,100kHZ为单位)
#define RDA5820_R64        0X64  //RDS_RXMOD[4:3](FIFO模式[10]或者寄存器模式[11])         

#define RDA5820_READ    0X23  //读RDA5820
#define RDA5820_WRITE    0X22  //写RDA5820

uint8_t RDA5820_Init(void);                    //初始化                             
void RDA5820_WR_Reg(uint8_t addr,uint16_t val);    //写RDA5820寄存器
uint16_t RDA5820_RD_Reg(uint8_t addr);            //读RDA5820寄存器
void RDA5820_RX_Mode(void);                //设置RDA5820为RX模式
void RDA5820_TX_Mode(void);                //设置RDA5820为TX模式
uint8_t RDA5820_Rssi_Get(void);
void RDA5820_Mute_Set(uint8_t mute);
void RDA5820_Rssi_Set(uint8_t rssi);
void RDA5820_Vol_Set(uint8_t vol);
void RDA5820_TxPAG_Set(uint8_t gain);
void RDA5820_TxPGA_Set(uint8_t gain);
void RDA5820_Band_Set(uint8_t band);
void RDA5820_Space_Set(uint8_t spc);
void RDA5820_Freq_Set(uint16_t freq);
uint16_t RDA5820_Freq_Get(void);

#endif

rda5820.c文件:

#include "lpc11xx.h"
#include "rda5820.h"
#include "i2c.h"

//初始化
//0,初始化成功;
//其他,初始化失败.
uint8_t RDA5820_Init(void)
{
    uint16_t id;
    I2C_Init();                        //初始化I2C口    

    id=RDA5820_RD_Reg(RDA5820_R00);    //读取ID =0X5805

    if(id==0X5805)                    //读取ID正确
    {
         RDA5820_WR_Reg(RDA5820_R02,0x0002);    //软复位
        delay_ms(50);
         RDA5820_WR_Reg(RDA5820_R02,0xC001);    //立体声,上电
        delay_ms(600);                        //等待时钟稳定 
         RDA5820_WR_Reg(RDA5820_R05,0X884F);    //搜索强度8,LNAN,1.8mA,VOL最大
          RDA5820_WR_Reg(0X07,0X7800);        // 
         RDA5820_WR_Reg(0X13,0X0008);        // 
         RDA5820_WR_Reg(0X15,0x1420);        //VCO设置  0x17A0/0x1420 
         RDA5820_WR_Reg(0X16,0XC000);        //  
         RDA5820_WR_Reg(0X1C,0X3126);        // 
         RDA5820_WR_Reg(0X22,0X9C24);        //fm_true 
         RDA5820_WR_Reg(0X47,0XF660) ;        //tx rds 
     }else return 1;//初始化失败
    return 0;
}
//写RDA5820寄存器                                             
void RDA5820_WR_Reg(uint8_t addr,uint16_t val)
{
    I2C_Start();  

    I2C_Send_Byte(RDA5820_WRITE);    //发送写命令        
    I2C_Wait_Ack();       
    I2C_Send_Byte(addr);               //发送地址
    I2C_Wait_Ack();                                                           
    I2C_Send_Byte(val>>8);             //发送高字节                               
    I2C_Wait_Ack();                     
     I2C_Send_Byte(val&0XFF);         //发送低字节                               
     I2C_Wait_Ack();                     
    I2C_Stop();                        //产生一个停止条件      
}
//读RDA5820寄存器    
uint16_t RDA5820_RD_Reg(uint8_t addr)
{
    uint16_t res;

    I2C_Start(); 

    I2C_Send_Byte(RDA5820_WRITE);    //发送写命令        
    I2C_Wait_Ack();       
    I2C_Send_Byte(addr);               //发送地址
    I2C_Wait_Ack();                                                           
    I2C_Start();                 
    I2C_Send_Byte(RDA5820_READ);    //发送读命令                               
    I2C_Wait_Ack();                     
     res=I2C_Read_Byte(1);             //读高字节,发送ACK      
      res<<=8;
      res|=I2C_Read_Byte(0);             //读低字节,发送NACK                               
      I2C_Stop();                        //产生一个停止条件 
    return res;                        //返回读到的数据
}
//设置RDA5820为RX模式
void RDA5820_RX_Mode(void)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X40);        //读取0X40的内容
    temp&=0xfff0;                    //RX 模式   
    RDA5820_WR_Reg(0X40,temp) ;        //FM RX模式 
}            
//设置RDA5820为TX模式
void RDA5820_TX_Mode(void)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X40);        //读取0X40的内容
    temp&=0xfff0;
    temp|=0x0001;                    //TX 模式
    RDA5820_WR_Reg(0X40,temp) ;        //FM TM 模式 
}
//得到信号强度
//返回值范围:0~127
uint8_t RDA5820_Rssi_Get(void)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X0B);        //读取0X0B的内容
    return temp>>9;                 //返回信号强度
}
//设置音量ok
//vol:0~15;
void RDA5820_Vol_Set(uint8_t vol)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X05);        //读取0X05的内容
    temp&=0XFFF0;
    temp|=vol&0X0F;                            
    RDA5820_WR_Reg(0X05,temp) ;        //设置音量    
}
//静音设置
//mute:0,不静音;1,静音
void RDA5820_Mute_Set(uint8_t mute)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X02);        //读取0X02的内容
    if(mute)temp|=1<<14;
    else temp&=~(1<<14);                            
    RDA5820_WR_Reg(0X02,temp) ;        //设置MUTE    
}
//设置灵敏度
//rssi:0~127;
void RDA5820_Rssi_Set(uint8_t rssi)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X05);        //读取0X05的内容
    temp&=0X80FF;
    temp|=(uint16_t)rssi<<8;                            
    RDA5820_WR_Reg(0X05,temp) ;        //设置RSSI    
}
//设置TX发送功率
//gain:0~63
void RDA5820_TxPAG_Set(uint8_t gain)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X42);        //读取0X42的内容
    temp&=0XFFC0;
    temp|=gain;                           //GAIN
    RDA5820_WR_Reg(0X42,temp) ;        //设置PA的功率
}
//设置TX 输入信号增益
//gain:0~7
void RDA5820_TxPGA_Set(uint8_t gain)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X42);        //读取0X42的内容
    temp&=0XF8FF;
    temp|=gain<<8;                    //GAIN
    RDA5820_WR_Reg(0X42,temp) ;        //设置PGA
}
//设置RDA5820的工作频段
//band:0,87~108Mhz;1,76~91Mhz;2,76~108Mhz;3,用户自定义(53H~54H)
void RDA5820_Band_Set(uint8_t band)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X03);        //读取0X03的内容
    temp&=0XFFF3;
    temp|=band<<2;                 
    RDA5820_WR_Reg(0X03,temp) ;        //设置BAND
}
//设置RDA5820的步进频率
//band:0,100Khz;1,200Khz;3,50Khz;3,保留
void RDA5820_Space_Set(uint8_t spc)
{
    uint16_t temp;
    temp=RDA5820_RD_Reg(0X03);        //读取0X03的内容
    temp&=0XFFFC;
    temp|=spc;                 
    RDA5820_WR_Reg(0X03,temp) ;        //设置BAND
}
//设置RDA5820的频率
//freq:频率值(单位为10Khz),比如10805,表示108.05Mhz
void RDA5820_Freq_Set(uint16_t freq)
{
    uint16_t temp;
    uint8_t spc=0,band=0;
    uint16_t fbtm,chan;
    temp=RDA5820_RD_Reg(0X03);    //读取0X03的内容
    temp&=0X001F;
    band=(temp>>2)&0x03;        //得到频带
    spc=temp&0x03;                 //得到分辨率
    if(spc==0)spc=10;
    else if(spc==1)spc=20;
    else spc=5;
    if(band==0)fbtm=8700;
    else if(band==1||band==2)fbtm=7600;
    else 
    {
        fbtm=RDA5820_RD_Reg(0X53);//得到bottom频率
        fbtm*=10;
    }
    if(freq>6;   
    band=(temp>>2)&0x03;        //得到频带
    spc=temp&0x03;                 //得到分辨率
    if(spc==0)spc=10;
    else if(spc==1)spc=20;
    else spc=5;
    if(band==0)fbtm=8700;
    else if(band==1||band==2)fbtm=7600;
    else 
    {
        fbtm=RDA5820_RD_Reg(0X53);//得到bottom频率
        fbtm*=10;
    }
     temp=fbtm+chan*spc;                 
    return temp;//返回频率值
}

main.c文件:

#include "lpc11xx.h"
#include "ili9325.h"
#include "w25q16.h"
#include "rda5820.h"

#define KEY1_DOWN (LPC_GPIO1->DATA&(1<<9))!=(1<<9)
#define KEY2_DOWN (LPC_GPIO1->DATA&(1<<10))!=(1<<10)

int main()
{
    uint16_t freqset=0;
    uint8_t i,rssi;
    
    LCD_Init();
    LCD_Clear(WHITE);
    W25Q16_Init();       // 初始化字库芯片W25Q16
    LCD_ShowString(20, 5, "START");
    delay_ms(600);
    LCD_ShowString(20, 5, "     ");
    if(RDA5820_Init()==0)
    {
        LCD_ShowString(20, 5, "OK");
    }
    else 
    {
        LCD_ShowString(20, 5, "NO");
    }
    
    RDA5820_Band_Set(0);    //设置频段为87~108Mhz
    RDA5820_Space_Set(0);    //设置步进为100Khz
    RDA5820_TxPGA_Set(3);    //信号增益设置为3
    RDA5820_TxPAG_Set(63);    //发射功率为最大.
    RDA5820_RX_Mode();        //设置为接收模式  
    
    freqset=8800;                //默认为88Mhz
    RDA5820_Freq_Set(freqset);    //设置频率
    
    while(1)
    {
        if(KEY1_DOWN)
        {
            delay_ms(30);
            if(KEY1_DOWN)
            {
                if(freqset>8700)freqset-=10;
                LCD_ShowNum(100,30,freqset,5);
                RDA5820_Freq_Set(freqset);    //设置频率
            }
        }
        else if(KEY2_DOWN)
        {
            delay_ms(30);
            if(KEY2_DOWN)
            {
                if(freqset<10800)freqset+=10;
                LCD_ShowNum(100,30,freqset,5);
                RDA5820_Freq_Set(freqset);    //设置频率
            }
        }
        i++;
        delay_ms(10);      
        if(i==200)//每两秒左右检测一次信号强度信息
        {
            i=0;
            rssi=RDA5820_Rssi_Get();                //得到信号强度
            LCD_ShowNum(100,230,rssi,3);            //显示信号强度
        }
    }
}


关键字:lpc1114  驱动RDA5820  FM收音机 引用地址:lpc1114驱动RDA5820 FM收音机程序

上一篇:ATT7053智能电表程序与电路图设计
下一篇:LPC1114单片机OLED驱动程序

推荐阅读最新更新时间:2024-03-16 15:24

LPC1114如何在程序中软件复位
LPC1114软件复位,在程序中,需要复位的地方,加上NVIC_SystemReset();这条语句即可。 NVIC_SystemReset()函数位于core_m0.h文件中,只要在头文件中包含lpc11xx.h文件即可使用。 /** \brief System Reset The function initiates a system reset request to reset the MCU. */__STATIC_INLINE void NVIC_SystemReset(void) { __DSB(); SCB- AIRCR = ((0x5FA SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SY
[单片机]
<font color='red'>LPC1114</font>如何在程序中软件复位
LPC1114_Timer16_0中断程序_MDK编译环境
关于Timer16_0代码: LPC_SYSCON- SYSAHBCLKCTRL |= (1 7); //开启定时器时钟 LPC_TMR16B0- PR=1000;//1000-1; //预分频计数器 LPC_TMR16B0- MR0=12000; //匹配寄存器 LPC_TMR16B0- TCR=0x1; //开启定时器计数器 LPC_TMR16B0- MCR=3;//(1 0)&(1 1); //匹配控制--匹配则引发中断并复位定时器 NVIC_EnableIRQ(TIMER_16_0_IRQ
[单片机]
cortex mo lpc1114 uart串口中断收发数据
中断方式串口接收数据 新建一个工程,结构如下图所示: 在main.c文件中,输入以下代码: #include “lpc11xx.h” #include “uart.h” uint8_t rec_buf; void UART_IRQHandler(void) { uint32_t IRQ_ID; // 定义读取中断ID号变量 uint8_t rec_buf; // 定义接收数据变量数组 IRQ_ID = LPC_UART- IIR; // 读中断ID号 IRQ_ID =((IRQ_ID 1)&0x7);// 检测bit3:bit1 if(IRQ_ID == 0x02 )
[单片机]
cortex mo <font color='red'>lpc1114</font> uart串口中断收发数据
RDA5820收音机芯片驱动
RDA5820 是北京锐迪科推出的一款集成度非常高的立体声 FM收发芯片。该芯片具有以下 特点:  FM 发射和接收一体  支持 65Mhz~115Mhz的全球 FM接收频段,收发天线共用。  支持 IIC/SPI接口  支持 32.768K晶振  数字音量及自动 AGC控制  支持立体声/单声道切换,带软件静音功能  支持 I2S接口(输入/输出)  内置 LDO,使用电压范围宽(2.7~5.5V)  高功率 32欧负载音频输出、可直接驱动耳机  集成度高、功耗低、尺寸小(4mm*4mm QFN封装)、应用简单 RDA5820引脚图如图所示 RDA5820 支持 2种通信模式, SPI和 IIC,MODE
[单片机]
<font color='red'>RDA5820</font>收音机芯片<font color='red'>驱动</font>
LPC1114/LPC11U14和LPC1343对比学习(七)SSP
LPC1114和LPC11U14有两路SSP总线,而LPC1343只有一路SSP总线,其他没有太大的区别,不过LPC11U14的SSP1总线都有两路管脚可以设置,进一步增加了芯片的灵活性。 三种芯片的SSP总线初始化基本一致: 但是需要注意,LPC1114和LPC1343的SSP0总线,再设置好时钟后,还必须选择时钟的输出引脚, LPC_IOCON- SCK_LOC = SSP0_SCK_SELECT; 而LPC1114的SSP1总线和LPC11U14的两路SSP总线则不需要这样设置。对于LPC1114的SSP1总线可以理解,因为没 有管脚映射。但是LPC11U14却有管脚映射功能,如果没有此寄存器,如果多个管脚都设置成
[单片机]
<font color='red'>LPC1114</font>/LPC11U14和LPC1343对比学习(七)SSP
LPC1114时钟学习
功能:(设置 GPIO口方向),参数(端口号,位,输入或输出(0入1出)) GPIOSetDir( PORT0, 1, 0 ); GPIOSetValue() 一个是设置端口方向,一个是设置输出的值,直接调用就可以了。 如果在片内RAM当中运行代码并且应用程序需要调用中断,那么必须将中断向量重新映射到Flash地址0x0。这样做是因为所有的异常向量都位于地址0x0及以上。通过将寄存器MEMMAP(位于系统控制模块当中)配置为用户RAM模式来实现这一点。 #ifdef __DEBUG_RAM LPC_SYSCON- SYSMEMREMAP = 0x1; #else #ifdef __D
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved