CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
I2C基础知识
一.I2C简介
二.I2C通信工作原理
-2.1.I2C报文Message
-2.2.I2C基本概念
-2.3.I2C通信数据传输步骤
三.I2C编程要点
-3.1.I2C初始化函数
-3.2.I2C数据发送函数
-3.3.I2C数据接收函数
四.I2C的优缺点
-4.1.I2C的优点
-4.2.I2C的缺点
五.I2C的典型应用
回到顶部
I2C基础知识
一.I2C简介
二.I2C通信工作原理
-2.1.I2C报文Message
-2.2.I2C基本概念
-2.3.I2C通信数据传输步骤
三.I2C编程要点
-3.1.I2C初始化函数
-3.2.I2C数据发送函数
-3.3.I2C数据接收函数
四.I2C的优缺点
-4.1.I2C的优点
-4.2.I2C的缺点
五.I2C的典型应用
回到顶部
# I2C基础知识 ## 一.I2C简介
I2C:Inter-Integrated Circuit,内部集成电路(总线),是一种常见的通用通信协议,I2C是单片机(或者SOC)与外设芯片通信的常用通信手段。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 ![](images/2023-09-18-18-30-27-image.png) SDA:Serial Data,数据线。 SCL:Serial Clock,时钟线。 I2C是串行通信协议,因此数据沿着SDA一位一位地传输。与SPI一样,I2C也需要时钟同步信号且时钟信号始终由主机控制。 按照速率不同,I2C可分为标准模式(最大100kbps),快速模式(最大400kbps),高速模式(最大3.4Mbps)与超快速模式(最大5Mbps)。 I2C在组网时允许单个主机多个从机或者多个主机多个从机,非常灵活。不同的工作模式下允许的总线负载电容不同:标准与快速400pF,高速100pF。总线负载电容决定了挂载在总线上设备数量的上限,通常I2C设备的容性负载小于10pF,所以设备数量上限400/10=40个。实际应用中,由于总线本身也包含容性负载,因此通常挂载设备小于30个。 大部分情况下,I2C的两根线需要通过电阻上拉到电源正极Vcc。对于标准模式与快速模式,上拉电阻的值一般小于5千欧。如果主机与从机均使用相同电压的电源,直接相连即可。如果主机与从机使用不同电压的电源,则可能还需要进行电平转换。 ## 二.I2C通信工作原理
### 2.1.I2C报文Message
I2C的数据传输以报文Message的形式进行,每个Message都包含从机的二进制地址帧,一个或多个数据帧,还包含开始条件和停止条件,读/写位,数据帧之间的ACK/NACK位。 ![](images/2023-09-18-18-45-16-image.png) **1.开始条件** 当SCL是高电平时,SDA从高电平向低电平切换。 **2.停止条件** 当SCL是高电平时,SDA从低电平向高电平切换。 **3.地址帧** 每个从设备唯一的7位或10位序列,用于主从设备之间的地址识别。 **4.读/写位** 一位,位于地址帧的后面,如果主机是向从机发送数据则为低电平,请求数据则为高电平。 **5.ACK/NACK位** Message中的每个帧后均带有一个ACK/NACK位,如果成功接收到地址帧或者数据帧,接收设备会返回一个ACK位用于表示确认。 ### 2.2.I2C基本概念
**1.寻址** 由于I2C没有像SPI那样的片选线,因此I2C需要使用另一种方式来确认某一个从设备,这个方式就是寻址。 主机将要通信的从机地址发送给每一个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。 **2.数据帧** 当主机检测到从机的ACK位后,就可以发送第一个数据帧了。I2C数据帧始终为8位,每个数据帧后紧跟一个ACK/NACK位来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来停止通信。 ### 2.3.I2C通信数据传输步骤
I2C通信数据传输步骤如下: 1.在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。 ![](images/2023-09-18-20-43-14-image.png) 2.主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位。 ![](images/2023-09-18-20-44-45-image.png) 3.每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。 ![](images/2023-09-18-20-51-26-image.png) 4.主机发送或者接收数据帧。 ![](\images\2023-09-18-20-52-32-image.png) 5.传输完每一个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧。 ![](images/2023-09-18-20-57-18-image.png) 6.随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。 ![](images/2023-09-18-20-58-56-image.png) ## 三.I2C编程要点
对主机的I2C进行编程,即开发I2C驱动。I2C驱动通常需要至少三个函数:I2C初始化函数、I2C数据发送函数与I2C数据接收函数。 ### 3.1.I2C初始化函数
I2C初始化函数用来初始化主机的I2C,通常在主机初始化任务中调用,I2C初始化函数的编程要点: 1.I2C工作模式,通常是标准模式(最大100kbps),快速模式(最大400kbps),高速模式(最大3.4Mbps)中的一种。 2.I2C波特率配置,I2C波特率通常由时钟分频系数、数据有效延迟、建立保持延迟、时钟高电平周期、时钟低电平周期、总线空闲超时等组成,需要根据芯片参考手册将波特率设置为一个合理的值。 3.使能/禁止10位从机地址(不常用),使能/禁止过滤脉冲尖刺(常用)。 ### 3.2.I2C数据发送函数
I2C数据传输函数用来给从机发送数据,通常在主机周期性任务中调用,I2C数据传输函数的编程要点: 1. 因为一个I2C主机可以驱动多个从机,因此从机的地址信息通常需要作为I2C数据发送函数的一个参数。 2. 因为I2C主机与从机之间通信的数据长度是不确定的,因此数据长度通常需要作为I2C数据发送函数的一个参数。还需要一个参数存放主机发往从机的数据,存放数据的参数可以使用uint8指针或者数组。 3. 如果采用阻塞方式发送数据,则还需要一个超时参数,当等待的时间超过这个参数时,函数返回超时状态。如果在超时参数以内发送完成,则返回发送成功状态。 ### 3.3.I2C数据接收函数
I2C数据接收函数用来接收数据,通常在周期性任务中调用,I2C数据接收函数的编程要点: 1. 因为一个I2C主机可以驱动多个从机,因此从机的地址信息通常需要作为I2C数据接收函数的一个参数。 2. 因为I2C主机与从机之间通信的数据长度是不确定的,因此数据长度通常需要作为I2C数据接收函数的一个参数。还需要一个参数存放待接收到的数据,存放数据的参数可以使用uint8指针或者数组。 3. 如果采用阻塞方式接收数据,则还需要一个超时参数,当等待的时间超过这个参数时,函数返回超时状态。如果在超时参数以内接收完成,则返回接收成功状态。 ## 四.I2C的优缺点
任何一种通信方式都有优缺点,I2C通信也不例外。 ### 4.1.I2C的优点
- I2C只需要使用两根线,硬件结构比较简单。 - I2C支持多个主机和多个从机,组网比较简单。 - I2C的ACK/NACK位用于确认每一帧都已成功传输,通信可靠。 - I2C芯片输入内含buffer(过滤脉冲尖刺),因此稳定性好。 ### 4.2.I2C的缺点
- I2C波特率较低,因此通信速率较慢。 - I2C数据帧的大小限制为8位,需要传输8位以上数据时比较繁琐。 ## 五.I2C的典型应用
I2C的典型应用有: - IO扩展,比如一些I2C接口的ADC芯片与DAC芯片可以扩展单片机的AD输入与DA输出。 - 传感器,比如一些I2C接口的压力传感器、温度传感器、加速度传感器等。 - 显示驱动,比如一些I2C接口的LCD驱动芯片等。 - 电源管理,比如一些I2C接口的电源管理芯片。 - 存储器,比如一些I2C接口的EEPROM芯片,FRAM芯片、FLASH芯片等。