目录
1. I2C 通信介绍
- I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
- 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
- 同步,半双工
- 带数据应答 (0 -- > 确认应答、1 -- > 非应答)
- 支持总线挂载多设备(一主多从、多主多从)
异步时序的特点:
- 好处:不需要时钟线,省一根线
- 缺点:对硬件电路非常依赖
2. 硬件电路
- 所有 I2C 设备的 SCL 连在一起,SDA 连在一起
- 设备的 SCL 和 SDA 均要配置成开漏输出模式
- SCL 和 SDA 各添加一个上拉电阻,阻值一般为4.7KΩ左右
3. I2C 时序基本单元
特点:
- SCL 高电平期间如果检测到 SDA 有变化(拉低或者拉高)即是起始或者终止信号。
- SCL 高电平期间如果 SDA 无变化那就是正在读 SDA 信号,0 或 1。
- SCL 低电平期间可以允许 SDA 电平发生跳变,为下一次读取信号做准备。
栗子:
读取信号类似 123 木头人游戏。SCL 来发口令,SDA 来做动作:
当 SCL 是低电平时(相当于在喊123木头人),此时 SDA 允许变动来做好准备,当 SCL 变成高电平时(相当于喊完木头人此时转身),此时 SDA 不准变动,开始读取 SDA 的值来确定这一位是 0 还是 1,重复上述动作 8 次即可读取或者写入一个字节。
如果在 SCL 高电平期间(喊完123木头人转身后),发现 SDA 还在发生变动(还有人在动 -- > 淘汰),这说明这是一个起始信号或者终止信号。
3.1 起始与终止信号
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
3.2 发送一个字节
规则:SCL 低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程 8 次,即可发送一个字节
3.3 接收一个字节
规则:SCL 低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
接收字节与发送字节的区别(收发都是对主机是描述):
- (主机)发送数据时:SCL 低电平由主机来设定 SDA 数据,SCL 高电平时从机来读取 SDA 数据
- (主机)接收数据时:SCL 低电平由从机来设定 SDA 数据,SCL 高电平时主机来读取 SDA 数据
3.4 发送应答与接收应答
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
4. I2C 完整时序数据帧
4.1 指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)。
从机地址采用七位地址。最后一位(第七位)可变,可以用来区分接了多个相同的设备。
开始信号 --> 发送一个字节(7位从机地址 + 1位读(1) / 写(0)标志位) -- > 接收应答(每发送8位都要接收一次应答) --> 开始写入 8 位代表写入数据的指定地址 --> 接收应答(同上) --> 写入8位代表需要写入指定地址的数据 -- > 接收应答 -- > 结束信号。
4.2 指定地址读
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
5. I2C 基本结构
5.1 主机发送
5.2 主机接收
6. 软 / 硬件 I2C 对比
7. STM32 I2C 配置
8. STM32 硬件 I2C 发送与接收
8.1 I2C 发送一个字节
根据 5.1 流程可以写出以下逻辑,每次发送完数据后需要等待对应事件的发生。
8.2 I2C 接收一个字节
9. I2C 仲裁机制
I2C 总线仲裁主要遵循三个机制:
- 线与:多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平
- SDA回读:总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线
- 低电平优先:由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权