1. I2C 协议简介
I2C(Inter-Integrated Circuit) 协议是由 Philips 公司开发的,由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部收发设备等特点,现在被广泛地使用在系统内多个集成电路 (I2C) 间的通信。根据I2C 总线协议版本 2.1-2000”的说明,我们可以更详细地了解I2C协议
1.1 物理层
1)它只使用两条总线线路 :一条双向串行数据线 (SDA),一条串行时钟线(SCL)。见图1。
2)每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
3)多主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线
4)具有三种传输模式:标准模式的传输速率为 100 Kbit/s ,快速模式为 400 Kbit/s,高速模式下可达 3.4 Mbit/s,但目前大多I2C 设备尚不支持高速模式。
5)片上的滤波器可以滤去总线数据线上的毛刺波以保证数据完整。
6)连接到相同总线的IC 数量受到总线的最大电容 400 pF 限制。

1.2 协议层
I2C 的协议包括起始和停止条件、数据有效性、响应、仲裁、时钟同步和地址广播等环节,由于我们使用的是 STM32 集成的硬件 I2C 接口,并不需要用软件去模拟 SDA 和 SCL线的时序,所以我们直接以I2C 通信的流程为大家讲解。见图2 和图3 。


图 2 和图3 的图例如下 :

数据由主机传输至从机

数据由从机传输至主机
S:传输开始信号
SLAVE_ADDRESS :从机地
R/W— :传输方向选择位,1为读,0 为写
A/A— : 应答或非应答信号
P:停止传输信号
这两幅图表示的是主机和从机通信时 SDA 线的数据包序列。
其中 S 表示由主机的I2C 接口产生的传输起始信号(S),这时连接到I2C 总线上的所有从机都会接收到这个信号。起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号 (SLAVEADDRESS),在I2C 总线上,每个设备的地址都是唯一的。当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据I2C 协议,这个从机地址可以是 7位或10 位。在地址位之后,是传输方向的选择位,该位为 0时,表示后面的数据传输方向是由主机传输至从机。该位为 1时,则相反。从机接收到匹配的地址后,主机或从机会返回一个应答 (A) 或非应答 (A—)信号,只有接收到应答信号后,主机才能继续发送或接收数据。
若配置的方向传输位为写数据,广播完地址,接收到应答信号后,主机开始正式向从机传输数据(DATA),数据包的大小为 8 位。主机每发送完一个数据,都要等待从机的应答信号 (A).重复这个过程,可以向从机传输 N 个数据,这个 没有大小限制。数据传输结束时,主机向从机发送一个停止传输信号 (P),表示不再传输据。若配置的方向传输位为读数据,广播完地址,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为 8 位。从机每发送完一个数据,都会等待主机的应答信号 (A),重复这个过程,可以返回 N 个数据,这个 N 也没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号 (A—),则从机自动停止数据传输。