前言
I2C通信协议相较于USART、SPI通信协议,其引脚较少,硬件连接简单,可扩展能力强,被多用于系统内多个IC之间的通信。
我们可以将I2C分作协议层以及物理层。物理层主要是主机与从机之间的关系,其关系如图一。与SPI通信协议不同的是,I2C主机与从机之间的访问是通过设备地址进行的,从机数目不定,有多少个从机,就有多少个设备地址。
I2C数据的传输依靠I2C总线。其中一个I2C总线使用两个总线线路,即SDA数据总线与SCL时钟总线。
(图一)
对于I2C的协议层,协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步等环节。
一、软件I2C与硬件I2C的区别
在自己编写或者移植程序时,都应该先明确自己需要是软件I2C还是硬件I2C,移植程序也同样如此。
软件I2C,顾名思义,就是编写程序来模拟I2C通信,直接控制GPIO引脚电平产生通信时序,通俗点就是配置GPIO引脚”有序“地输入输出0或1。软件I2C控制的GPIO引脚是任意的。
硬件I2C, 32芯片上有片上外设可以实现I2C通信协议,片上外设可不是开发板的硬件哈,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。硬件I2C的GPIO引脚是固定的如图二。
图二、STM32F10X的I2C硬件GPIO引脚
相较之下,我常用软件I2C,因为程序更加清楚明了,也便于不同的开发项目,硬件I2C的传输速度比较快,调用标准库函数编写通信程序。
从程序上分辨这两种方式(如下图),看有没有I2C工作模式的配置即可,有则是硬件,没有则是软件模拟。
二、I2C的主从模式
1、从发送器模式
2、从接收器模式
3、主发送器模式
4、主接收器模式
接下来以主发送、接收器模式介绍如下,硬件I2C的读写函数按照下图编写。
代码如下(示例):
三、资源连接
软件I2C与硬件I2C的底层驱动函数我都放网盘了。
有什么问题我会继续优化。
评论下备注邮箱号,发资料。