I2C 多从机通信原理?

I2C 多从机通信(地址识别、冲突避免、从机如何知道轮到它)
一句话总结:
所有从机都共享两根线,通过主机发出的地址帧来判断是否该自己应答,只有匹配地址的从机会拉低 ACK。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值