I2C 多从机通信(地址识别、冲突避免、从机如何知道轮到它)
一句话总结:
所有从机都共享两根线,通过主机发出的地址帧来判断是否该自己应答,只有匹配地址的从机会拉低 ACK。
- 原理
● 两根线:SCL(时钟)和 SDA(数据)
● 同一总线上可以挂无数从机
● 主机发送地址帧
● 每个从机内部有地址比较电路
● 只有地址匹配的从机会在 ACK 位拉低 SDA
● 其他从机保持高阻态不干涉 - 主机一直“拉低”吗?
● 主机不拉高,只在输出 0 时拉低
● 不需要拉低时就是高阻态 → 线上靠上拉电阻保持高电平 - 从机如何知道地址?
● 主机发送:7bit 地址 + 1bit 读写
● 从机内部硬件比较:
如果收到的 7bit 地址 == 自己的地址 → 回应 ACK
其他从机不动作 - 从机怎么“拉低”?
● 通过自己的开漏管把 SDA 接地
● 相当于把 MOSFET 打开 → 线就被拉低
● 并不意味着“连接上线”,只是将开漏口导通 - SDA 是一根线吗?
● SDA 就是一根线
● 但信号既可以被多个设备拉低,也可以被所有设备放开变高,因此称为线与逻辑(wired-AND) - 空闲时 SDA 是输入吗?
● 是的
● 所有设备此时都不驱动 SDA → 线被上拉 → 每个设备当作输入读取 - 从机如何进行输入/输出切换?
● 地址匹配时 → 在 ACK 位由硬件自动把 SDA 开漏管打开(输出 0)
● 其他时间 → 自己保持高阻态(输入)
● 硬件 I2C 控制器自动切换,不需要软件干涉
示意图:
主机
±----+
SCL ----------| SCL |
SDA ----------| SDA |(开漏)
±----+
|
| (总线两根线)
|
±------------±-------------+
| | |
| | |
±----+ ±----+ ±----+
|从机A| |从机B| |从机C|
|SDA | |SDA | |SDA |
|(开漏)| |(开漏)| |(开漏)|
±----+ ±----+ ±----+
| | |
±------------±-------------+
|
[上拉电阻到VCC] - 多从机同时存在不会冲突吗?
● 所有从机默认不驱动 SDA
● 只有地址匹配的从机会在 ACK 拉低
● 其他从机都是高阻 → 不会拉低
9589

被折叠的 条评论
为什么被折叠?



