|
最开始对RDA5807FP不太了解,就先尝试用Arduino Pro mini小板的的I2C(A4和A5脚)控制,
开始找了1个库的样例代码,跑不成功,老是在setup里面重复,进不了loop,也不知道啥原因。
换另外1个库的样例代码,一下子就响了。稀里糊涂的,也不知道库代码都干了啥。
之前有用软件模拟I2C控制过大众CD机的,了解到STC单片机的好多型号都有硬件I2C了,那就测试一下吧。
折腾了好几天,一直整不响,没有示波器,也没有逻辑分析仪,也不知道问题出在哪儿,都快放弃了,最后还是坚持尝试,终于成功。
踩了好几个坑,主要有以下几点:
(1)I2C输出的引脚应该配置为准双向口,默认是高阻,无法输出。
(2)最开始按键使用的是INT0外部中断(P3.2),引脚与配置的I2C引脚冲突,后面改成使用INT2。
实物如下:有三层,最底下是PAM8403功放模块,上面音量旋钮是带开关的,中间是RDA5807FP小板,上面有个LED是立体声指示灯,那根红色单独的电线是天线,随意找的,长度大概20厘米。
最上面是STC8G1K08A单片机小板,用了个鼠标微动开关作为按键。
使用的是这样的喇叭,用PAM8403带挺合适,音效还不错。
电路如下(已成功制作实物,并能正常搜台)
下面是C代码,比较简洁,当然功能也简洁,只有一个搜台按钮。
STC8G1K08A剩余3个引脚,还可以增加其他功能按键,有兴趣的自己扩充吧。
- //
- // RDA5807FP+STC8G1K08A硬件I2C控制测试
- // 晶振 4 MHz
- // 电源:DC5V
- // STC8G1K08A的SCL(P3.2)接RDA5807FP的SCL(7脚), SDA(P3.3)接RDA5807FP的SDA(8脚),RDA5807FP已经内置IIC上拉电阻。
- // 单一个按键向上搜台,按键接P5.4和GND之间,并一个103电容
- // 音频功放采用带音量点位器的PAM8403小功放板。
- // BY:XIAOCAKE 2025/04/09
- //
- #include "STC\STC8H.H"
- #define DevAddrW 0x22 //RDA5087FP 标准I2C写地址
- typedef unsigned char uint8;
- typedef unsigned short int uint16;
- void Wait()
- {
- while (!(I2CMSST & 0x40));
- I2CMSST &= ~0x40;
- }
- void Start()
- {
- I2CMSCR = 0x01; //发送START命令
- Wait();
- }
- void SendData(char dat)
- {
- I2CTXD = dat; //写数据到数据缓冲区
- I2CMSCR = 0x02; //发送SEND命令
- Wait();
- }
- void RecvACK()
- {
- I2CMSCR = 0x03; //发送读ACK命令
- Wait();
- }
- void Stop(void)
- {
- I2CMSCR = 0x06; //发送STOP命令
- Wait();
- }
- void Delay1ms(void) //@4MHz
- {
- uint8 i, j;
- i = 4;
- j = 225;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay(uint16 n)
- {
- uint16 i;
- for (i=0; i<n; i++)
- {
- Delay1ms();
- }
- }
- void RDA5807N_SendRegData(uint8 addrw, uint8 RegAddr ,uint8 DATH ,uint8 DATL )
- {
- Start(); //发送起始命令
- SendData(addrw); //发送设备地址+写命令
- RecvACK();
- SendData(RegAddr); //发送寄存器地址
- RecvACK();
- SendData(DATH); //发送寄存器内容高字节
- RecvACK();
- SendData(DATL); //发送寄存器内容低字节
- RecvACK();
- Stop(); //发送停止命令
- }
- void RDA5807N_PowerOn(void)
- {
- RDA5807N_SendRegData(DevAddrW,0x02,0xD0,0x01); //开机,开启低音增强
- Delay(70);
- RDA5807N_SendRegData(DevAddrW,0x04,0x04,0x10); //GPIO3 设置为立体声指示输出
- Delay(70);
- RDA5807N_SendRegData(DevAddrW,0x05,0x88,0x8A); //音量设置为10(最大是15)
- }
- void RDA5807N_SeekUp(void) //向上搜索
- {
- RDA5807N_SendRegData(DevAddrW,0x02,0xD3,0x01);
- }
- void INT2_Isr(void) interrupt 10 //INT2中断. 搜台按键接P5.4,按键上并个103电容
- {
- RDA5807N_SeekUp(); //中断唤醒后就发送向上搜台命令
- Delay(60);
- }
- void main(void)
- {
- P3M0 = 0x00;
- P3M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00; //P3 ,P5所有端口设置为准双向口
- INTCLKO = 0x10; //使能INT2中断
- EA = 1;
- P_SW2 = 0x80; //I2C引脚设置为 SDA:P3.3 + SCL:P3.2针对STC8G1K08(A)8脚系列, 其余单片机对应的是 SDA:P1.4 + SCL:P1.5
- I2CCFG = 0xC2; //使能I2C主机模式, 晶振4Mhz,Mspeed = 2 ,Mspeed可以调大一些。
- RDA5807N_PowerOn(); //RDA5807N开机初始化
- Delay(60);
- RDA5807N_SeekUp(); //发送自动搜台命令
- while(1)
- {
- Delay(60);
- PCON = PD; //进入掉电模式,等待按键中断唤醒
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|