I2C协议-STM32平衡车应用
1 I2C主模式功能描述
I2C总线是由PHILIPS公司开发的两线式串行总线,多用于连接微处理器及其外围芯片。I2C接口只有2根信号线,总线上可以连接多个设备,硬件实现简单,可扩展性强。I2C接口主要用于通信速率要求不高,以及多个器件之间通信的应用场景。
2 I2C总线物理结构
I2C属于同步通信,SDA为数据线,SCL为时钟线。SCL时钟线负责收发双方的时钟节拍,SDA数据线负责传输数据。I2C 的发送方和接收方都以SCL这个时钟节拍为基准进行数据的发送和接收。I2C是一种多设备总线,一根I2C总线上可以挂载多个设备。例如,STM32F103开发板上的I2C总线通信系统所示,它连接了两个I2C设备,一个是EEPROM器件24C02,另一个是加速度计和陀螺仪传感器芯片MPU6050。理论上任何一个设备都可以作为主机,但是同一时刻只能有一个主机,我们的课程肯定是STM32作为主机了。
总线上挂的多个设备,每一个都像手机一样有自己唯一的地址,在通信过程中,通过设备唯一地址便可以正常找到想要通信的设备,就像我们想给他人打电话的时候,必须要知道他的手机号码一样。

图2.1 MPU通过I2C总线与器件连接示意图
2.1 数据线SDA与时钟线SCL
如上图2.1所示,MCU与它的所有从设备共同连接在SDA和SCL总线上。其中SDA线负责传输实际的数据,而SCL线则像节拍器一样,提供同步的时钟信号,确保数据在正确的时刻被读取。图中每个器件都有一个唯一的地址(如 0xA0、0xD0),当MCU需要与某个器件对话时,会先通过SDA线广播这个地址,只有地址匹配的器件才会响应,这就实现了在共享总线上的精准寻址。
硬件连接方面,MCU和所有从设备接口均需设置为开漏输出模式,并配合上拉电阻。
时钟信号SCL是由主设备控制的,I2C通信有标准模式和快速模式,标准模式传输速率为100kbit/s,快速模式传输速率为400kbit/s。。
两个关键名词:
- 释放总线-指设备输出高阻态,此时不影响总线;
- 拉低总线-指设备输出低电平。
2.2 逻辑线与
I2C通信中,SCL和SDA由主设备和所有连接的从设备共同构成逻辑线与的关系。
总线电平由所有设备共同决定,遵循"线与"逻辑(任一设备拉低则总线为低,所有设备释放则总线为高)
通过线与的逻辑,不难分析下数据是如何传输的。我们已经知道,所有接入的器件保持高电平,这条线才是高电平,而任何一个器件输出一个低电平,那这条线就会变成低电平。任何一个设备都可以做到拉低电平,所以说,所有设备都有成为主机的可能,但一般情况下,STM32都是作为主机使用。
3 I2C总线通信协议
I2C通信总是由主机启动,每个通信过程由起始信号开始,由停止信号结束。一个数据包有8位,每个数据包后有一个应答位(ACK)或非应答位(NACK)。例如,主设备向从设备发送1字节数据的时序图如下。为了便于大家更好的了解IIC协议,我们从起始信号、停止信号、应答信号、数据有效性、数据传输以及空闲状态等6个方面讲解


图3-1 I2C传输1个字节时序图
3.1 起始信号
I2C通信的起始信号的定义是SCL为高电平期间,SDA由高电平向低电平变化产生一个下降沿,表示起始信号。起始信号只能由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。
3.2 数据传输
I2C通信是高位在前,低位在后。I2C是同步传输,需要按照时序的要求工作,SCL在低电平的时候,SDA允许变化,也就是说,发送方必须先保持SCL是低电平,才可以改变数据线 SDA,输出要发送的当前数据的一位;而当SCL在高电平的时候,SDA绝对不可以变化,因为这个时候,接收方要来读取当前SDA的电平信号是0还是1,因此要保证SDA的稳定,如图 3-1中的每一位数据的变化,都是在SCL的低电平位置。8位数据位后边跟着的是一位应答位,应答位我们后边还要具体介绍。
3.3 停止信号
I2C通信停止信号的定义是SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿,表示停止信号。停止信号只能由主机发出,在停止信号发出后,总线就处于空闲状态。
3.4 应答信号
发送设备每发送一个字节,就在第9个SCL时钟周期释放数据线,由接收设备反馈一个应答信号。若在SCL的第9个周期采集的SDA为低电平,就是应答信号ACK,如果采集的SDA是高电平,就是非应答信号NACK。
观察图片可以发现,有效应答的要求是接收设备在第9个SCL时钟脉冲之前的低电平期间
将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主机接收器发送一个停止信号。
3.5 空闲状态
IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时所有设备处于高阻态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
在一次I2C通信过程中,可以传输多字节的数据。主机启动I2C通信后,发送的第一个字节是目标设备地址,后面再发送或接收的数据由具体器件的指令定义决定。I2C通信协议只是定义了基本的数据传输时序,可以使用MCU的硬件I2C接口实现,也可以用普通GPIO引脚的输入输出模拟I2C通信时序,即软件模拟I2C接口。
4 小结
I2C总线有如下的特点:
- I2C总线只有两根信号线,SDA是双向串行数据线,SCL是时钟信号线,用于数据收发的同步;
- I2C总线上可以挂载多个设备,一般有一个主设备、多个从设备。MCU一般作为主设备,外围器件作为从设备。在I2C通信协议中,主动发起通信的器件就是主设备,被动进行响应的器件就是从设备;
- 主设备发起通信时,会首先发送目标设备地址,只有地址对应的从设备才会做出响应;
- I2C总线的两根信号线有上拉电阻。当I2C器件空闲时,其输出接口是高阻态。当所有设备都空闲时,I2C总线上是高电平;
- I2C通信有标准模式和快速模式,标准模式传输速率为100kbit/s,快速模式传输速率为400kbit/s。
微信
支付宝