stm32中的i2c协议编程
2019-07-13 来源:eefocus
在上篇博客中,我已经介绍完了i2c的各种特征,这次就结合师兄给我的编程实例来分析学习。首先i2c协议的编程可以分为硬件i2c和模拟i2c,一般在51之类的低端单片机都是使用模拟i2c(即用软件编程来控制io口上的时序变化以符合i2c协议的biao标准),而在stm32一类的中高端单片机本身就自带可以某些硬件gpio口自动实现i2c协议。下面就分别讨论下两种方式的编程初始化配置过程。
1.1.模拟i2c编程
1.1.1初始化i2c函数
首先i2c协议通信需要两根总线数据线SDA与时钟线SCL,所以我们先选择两个gpio口进行相应初始化。gpio口的初始化过程在之前博客也详细介绍过这里就不过多赘述,主要就是调用库函数开启gpio口时钟,选择输入输出模式在i2c通信中我们选择是推挽留输出,然后速度是50MHZ。最后在把定义好的SDA与SCL拉高,准备进行i2c通信。i2c初始化函数如下图:
1.1.2 起始信号与结束信号函数
在初始化函数编写完后,我们按照i2c协议中时序图所需要的起始信号和结束信号以及应答信号的编写。整个编程过程严格对照下图的数据传输图以及时序图:
如上图可知,要产生起始信号条件即为在SCL为高电平的情况下,SDA产生一个下降沿脉冲。同理结束信号便是在SCL为高电平的情况下,SDA产生一个上升沿脉冲。具体实现代码如下:
1.1.3发送数据函数
由于i2c协议规定发送数据一次只能发送一个字节8位,所以我们编程也要严格按照标准。编程内容主要先定义一个8位发送数据,然后将时钟总线SCL拉低这一步非常重要,因为在SCL为高电平时SDA的变化都是起始或者停止信号,所以要发送数据必须先拉低。一个字节的发送数据8位,用右移一位位发送即可,最后是默认收到应答信号故不再编写应答信号函数。整个编程代码如下图:
2.1.硬件i2c
硬件i2c的初始化过程和软件i2c相似,同样都需要初始化配置gpio口,然后配置下i2c硬件的模式。具体的起始信号以及结束信号以及应答函数都在官方固件库中编写好了,所以只需调用配置模式即可。具体编程代码如下图:
具体发送函数会根据不同的接受设备而有一些变化,以上代码是根据与CH423进行通信的编程,也请读者们参考时留心。