内容发布更新时间 : 2024/12/22 21:47:27星期一 下面是文章的全部内容请认真阅读。
数字FM电台设计开发
频文件的总长度。
最后我们介绍一下VOL这个寄存器,该寄存器用于控制VS1053的输出音量,该寄存器可以分别控制左右声道的音量,每个声道的控制范围为0~254,每个增量代表0.5db的衰减,所以该值越小,代表音量越大。比如设置为0X0000则音量最大,而设置为0XFEFE则音量最小。注意:如果设置VOL的值为0XFFFF,将使芯片进入掉电模式!
22
数字FM电台设计开发
第3章 软件设计
电台软件设计流程图
23
3.1 FM
数字FM电台设计开发
3.2 软件设计结构框图
3.3 主函数介绍
3.3.1 系统初始化
该模块实现对系统各模块的初始化工作,以便后面程序使用这些模块时正常工作。以下是所有初始化函数:
delay_init(); 优先级
uart_init(9600); //串口初始化为9600 LCD_Init(); //显示屏初始化 KEY_Init(); //按键初始化 font_init(); //初始化字库 Audiosel_Init(); //初始化音源选择 usmart_dev.init(72); //usmart初始化 mem_init(SRAMIN); //初始化内部内存池 VS_Init();
//延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应
//初始化VS1053
24
数字FM电台设计开发
exfuns_init(); //为fatfs相关变量申请内存
f_mount(0,fs[0]); //挂载SD卡 f_mount(1,fs[1]); //挂载FLASH. usmart_dev.init(72); //初始化USMART RDA5820_Init(); //初始化FM收发
3.3.2 FM信号发射设置
该模块实现对RDA5820配置,根据需要这里将模式设置为发射,频率配置为93.6,发射功率设置为最大。以下是所有相关配置函数的调用:
RDA5820_Band_Set(0); //设置频段为87~108Mhz RDA5820_Space_Set(0); RDA5820_TxPGA_Set(3); RDA5820_TX_Mode(); freqset=9360;
//设置步进为100Khz //信号增益设置为3
//发送模式
RDA5820_TxPAG_Set(63); //发射功率为最大.
//默认为93.6Mhz
RDA5820_Freq_Set(freqset); //设置频率
3.3.3 TFTLCD显示基本信息
该模块部分主要在TFTLCD上显示必要的信息,提示用户如何操作。以下是程序内容:
POINT_COLOR=RED; //设置字体为红色 Show_Str(60,10,200,16,\电台实验\ Show_Str(60,30,200,16,\调频92.2Mhz\
Show_Str(60,50,200,16,\
LCD_ShowString(60,70,200,16,16,\Show_Str(60,90,200,16,\:M+ KEY2:M-\Show_Str(60,110,200,16,\Set\
3.3.4 音频源的选择
该模块部分选择FM发射的音源,通过按键KEY_UP来切换音源(SD卡MP3和MIC麦克风之间的切换),默认为SD卡MP3音源。以下是两个音源控制的函数调用:
mp3_play(); //SD卡MP3音源 recoder_play(); //麦克风音源
3.4 IIC驱动RDA5820 FM收发芯片
该模块部分实现了用IIC驱动RDA5820,从而实现了RDA5820的各种设置。\\
25
数字FM电台设计开发
以下是IIC控制RDA5820寄存器读写的具体函数:
void RDA5820_WR_Reg(u8 addr,u16 val) //写RDA5820寄存器 {
IIC_Start();
IIC_Send_Byte(RDA5820_WRITE); //发送写命令 IIC_Wait_Ack();
//发送地址
//发送高字节
IIC_Wait_Ack();
IIC_Send_Byte(addr);
IIC_Send_Byte(val>>8); IIC_Wait_Ack();
IIC_Send_Byte(val&0XFF); //发送低字节
IIC_Wait_Ack(); IIC_Stop(); }
u16 RDA5820_RD_Reg(u8 addr) //读RDA5820寄存器 { u16 res;
IIC_Start();
IIC_Send_Byte(RDA5820_WRITE); //发送写命令
IIC_Wait_Ack();
//发送地址
IIC_Wait_Ack();
IIC_Send_Byte(addr); IIC_Start();
//产生一个停止条件
IIC_Send_Byte(RDA5820_READ); //发送读命令 IIC_Wait_Ack();
res=IIC_Read_Byte(1); res<<=8;
res|=IIC_Read_Byte(0);
//读低字节,发送NACK //产生一个停止条件 //返回读到的数据
//读高字节,发送ACK
IIC_Stop(); }
return res;
26