1.介绍:想要控制 APM32 产生 I2C 方式的通讯,可以采用软件模拟或硬件 I2C 这两种方式。
(1)所谓软件模拟,即根据时序妖气控制 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
(2)硬件 I2C 是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C 外设则可以方便地通过外设寄存器产生 I2C 协议方式的通讯,如初始化好 I2C 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,而不需要内核直接控制引脚的电平。
2.编程要点:例如控制EEPROM
(1) 配置通讯使用的目标引脚为开漏模式;(2) 编写模拟 I2C 时序的控制函数;(3) 编写基本 I2C 按字节收发的函数;(4) 编写读写 EEPROM 存储内容的函数;(5) 编写测试程序,对读写数据进行校验。
3.分布解析:
(1)开漏模式:因为SCL,SDA的数据是有ACK应答信号,需要我们的引脚信号输出和输入的,在开漏模式下可以达到要求,记得加上10K上拉电阻。
(2)起始信号,停止信号,应答信号,这些是以MCU作为主机,这些都是由主机产生的信号,我的理解是封装好函数后,后面直接调用,就相当于是函数库的功能,这也是初学者后期编程可以借鉴的点。
(3)发送和接收函数是以I2C协议的时序图为基础的,就是对于每一个BIT位的编写,什么时候可以进行数据的采样,什么时候对于数据的变换,都是要参考时序,最主要的是对于ACK信号那一部分进行编写要注意。
(4)编写EEPROM的函数,要结合具体的EEPROM的时序,调用我们自己写好的函数库即可,其实也是前面的铺垫做好了,后面是可以直接调用的,都是大同小异的。这里面最主要的就是参考时序图的时间,比如:数据的读的电平要保持多久,写的电平要保持多久,需要满足这些电平的持续时间,才能让数据传输的稳定。
(5)进行调试。