I²C总线没人主动输出高电平, 为什么还能回到1?

发布时间:2026/7/20 13:12:30
I²C总线没人主动输出高电平, 为什么还能回到1? 嵌入式 · I²C · 开漏输出I²C总线没人主动输出高电平为什么还能回到1答案在开漏和上拉开漏节点只负责拉低或释放高电平由上拉网络建立开漏输出的下拉晶体管导通时主动拉低总线关断时进入高阻只有当所有节点都释放总线才由上拉电阻回到高电平。这种结构允许多个器件共享一根线但上拉电阻、总线电容、低电平电流和掉电节点必须共同评估。示波器上I²C 的下降沿很快高电平却像斜坡一样慢慢爬升。更奇怪的是原理图里没有任何器件主动把 SDA 推到高电平。答案在开漏输出器件只会把线拉低或把输出关断。高电平不是“输出”出来的而是上拉电阻给总线电容充电形成的。一、开漏与推挽最大的区别是什么推挽输出既能主动拉高也能主动拉低开漏输出只保留下拉晶体管。晶体管导通时输出低电平关断时节点呈高阻无法独立产生高电平。图 1 开漏输出关断时进入高阻需要外部上拉因此开漏引脚没有合适上拉时释放后的电平可能不确定。上拉可以来自外部电阻也可能由器件内部结构提供必须查看目标器件说明。二、为什么多个器件可以安全共享一根线任何一个节点导通下拉总线就是低只有所有节点都关断释放总线才回到高。各节点不会出现一个强推高、另一个强拉低的直接争用。图 2 开漏输出只有主动拉低与高阻释放两种状态原理示意非实测结果这形成了“线与”关系并支持多主仲裁等总线机制。但前提是所有共享节点确实使用兼容的开漏开集结构不能混入普通推挽输出。三、上升沿为什么比下降沿慢下降沿由晶体管主动放电通常较快上升沿则由上拉电阻给总线上的器件输入、走线和连接器电容充电形成 RC 过程。总线越长、节点越多、电容越大上升越慢。这也是为什么 I²C 速度问题不能只看软件时钟设置。若电平还没达到接收阈值下一个采样时刻就到来通信可能在边界条件下失败。四、上拉电阻越小为什么也不是越好图 3 上拉电阻需要在上升时间和低电平电流之间折中原理示意非实测结果减小上拉电阻可以加快充电但低电平时下拉器件需要吸收更大电流功耗和低电平压降也会增加。电阻过大则上升时间变慢并降低对漏电和干扰的裕量。具体范围必须根据总线规范、上拉电压、器件低电平能力、总线电容和目标速率计算本文不提供脱离系统的固定阻值。五、跨电压域和掉电节点为什么要特别小心上拉电源决定总线高电平。连接不同电压域时必须确认每个器件引脚是否能承受该电平需要电平转换时应使用适合双向开漏总线的结构。某个节点掉电后其保护结构或漏电路径也可能把总线拉住或反向供电。排查“整条总线一直低”时要逐个隔离节点而不是只换主控。六、I²C总线按这5步排查图 4 开漏总线的排查顺序原理示意非实测结果确认所有共享节点的引脚模式排除误配置为推挽输出。核对上拉电源域与每个器件的电平耐受范围。估算总线电容并在目标速率下实测上升时间。同时检查低电平电压和下拉电流避免只追求更快上升沿。覆盖节点掉电、热插拔和长线条件检查反向供电与总线被拉死。工程判断I²C 高电平由上拉网络建立低电平由任一节点主动拉下。上拉电阻、总线电容、下拉能力和电压域共同决定波形软件频率只是其中一个条件。写在最后下一次看到 SDA 上升沿缓慢别先怀疑代码延时。量一下上拉电源、上拉电阻和总线电容看看这条线是谁在充电。理解“拉低或释放”之后多设备共享、仲裁、上升时间和掉电拉死就不再是四个互不相关的故障。