本帖最后由 gaoyang9992006 于 2023-11-13 11:14 编辑
收音机曾经是一个很重要的信息获取设备,如今已经沦落为情怀了,然而它作为无线电传输设备,将会长久的 存在于历史舞台。接下来根据以下ST板块相关帖子或许开发它的知识吧。通常这些收音机模块都是I2C接口的,有的公用版的I2C协议,有的是变种协议,因此要学习的知识点有:i2C协议,如何通过IO模拟I2C时序,剩下的就是要深刻理解芯片手册关于寄存器各个位的描述,如果使用别人写好的驱动库,那就简单多了,只需要学会程序移植即可。
- /*
- I2C Start
- 起始信号:时钟信号在高电平状态时候,数据线产生一个下降沿表示开始信号
- */
- void I2C_Start()
- {
- IO_SCL_SET_H();
-
- IO_SDA_SET_H();
- IO_SDA_SET_L();
- }
- /*
- I2C Stop
- 停止信号:时钟信号在高电平状态时候,数据线产生一个上升沿表示停止
- */
- void I2C_Stop()
- {
- IO_SCL_SET_H();
-
- IO_SDA_SET_L();
- IO_SDA_SET_H();
- }
- /*
- I2C ACK/NACK
- 应答信号:第九个时钟周期的时钟高电平时候读取SDA数据,如果SDA此时为0,则表示应答,如果为1则表示非应答。
- */
- void I2C_ACK()
- {
- IO_SDA_SET_H();
-
- IO_SCL_SET_H();
- if(Get_IO_SDA()==0)
- IO_SCL_SET_L();
- else
- while(Get_IO_SDA()==1);
- IO_SCL_SET_L();
- }
- /*
- I2C 上发送一个字节数据
- 发送字节:发送字节是时钟信号的低电平时候修改数据,。
- */
- void Write_I2C_Byte(unsigned char I2C_Byte)
- {
- unsigned char i;
-
- for(i=0;i<8;i++)
- {
- IO_SCL_SET_L();
-
- if((I2C_Byte<<i)&0x80)
- IO_SDA_SET_H();
- else
- IO_SDA_SET_L();
-
- IO_SCL_SET_H();
- }
- IO_SCL_SET_L();
- }
- /*
- add:7位地址;
- rwbit:读写位,1表示读,0表示写
- dat:数据字节
- 命令或数据:1表示发送的字节是数据,0表示发送的字节是命令
-
- */
- void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
- {
- I2C_Start();
- Write_I2C_Byte(0x78);
- I2C_ACK();
- if(cmd)
- Write_I2C_Byte(0x40);
- else
- Write_I2C_Byte(0x00);
- I2C_ACK();
- Write_I2C_Byte(dat);
- I2C_ACK();
- I2C_Stop();
- }
[payamount]1.00[/payamount]
|