STM32的两个GPIO引脚,分别用于SCL和SDA,按照I2C规约的时序,像控制LED灯那样控制引脚输出,若是接收数据时则读取SDA线上的电平,那就可以实现I2C通信了,这也是我们在51单片机上的“软件模拟协议”做法。但是STM32上还配有I2C控制器片上外设,只要配置好该外设,它就可以依据规约产生通讯信号。收/发数据置于缓存寄存器中,cpu只要检测该外设的状态和数据寄存器就能完成数据收发。但是利用该外设来实现I2C通讯,存在许多硬件Bug,下来还是简单讲解这种做法。
1. I2C通讯时序
通俗来讲,IIC的时序就是主机向从设备发出一个数据后,要间隔多少时间从机才会回复,或者说SCL上的信号要维持多久的高电平、低电平才使得SDA的信号正确传输到从机等,这些是在I2C协议明确规约的,在51单片机软件模拟IIC时序时,编程中我们需要自己实现函数去延时。在STM32的I2C控制器下的IIC时序将不需要这么繁琐。如何实现?看下面摘自《STM32中文参考手册_V10.pdf》I2C章节的两图(STM32系统既可以当IIC主机也可以当IIC从机,以I2C主机模式为例)。
主机发送:
(1) 主机端代码控制IIC控制器产生起始信号(S),当发生起始信号后,控制器产生事件“EV5”,并会对S