前言

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的底层驱动函数我都放网盘了。
有什么问题我会继续优化。

评论下备注邮箱号,发资料。