I2C 总线为什么需要上拉电阻?

嵌入式 · 3 浏览
I2C 总线为什么需要上拉电阻?

回答(4)

如果总线长度超过20cm,建议用4.7kΩ以下,或者加总线缓冲器,不然波形会很难看。
嵌入式阿凯 · 2026-08-20
实际画板时,上拉电阻尽量靠近主控或总线中间,别放太远,否则寄生电容大,高速通信容易出错。
硬件小兵 · 2026-08-20
补充一点:上拉电阻也决定了总线最大设备数,因为每个设备有漏电流,电阻太大时高电平可能被拉低到阈值以下。
老周嵌入式 · 2026-08-20
I2C总线采用开漏(open-drain)输出结构,器件只能主动拉低电平,无法主动输出高电平。上拉电阻的作用是将总线在空闲时拉至高电平(VDD),实现线与逻辑:任何设备拉低时总线为低,释放时自动恢复高。没有上拉电阻,总线无法产生高电平,通信完全失效。 选值需权衡:电阻过小(如<1kΩ)导致灌电流过大,增加功耗并可能损坏器件;过大(如>10kΩ)则上升沿变缓,限制通信速率(RC时间常数)。典型值:3.3V系统常用2.2kΩ~4.7kΩ,5V系统用4.7kΩ~10kΩ,高速模式(400kHz以上)建议≤2.2kΩ。 实操建议: 1. 上拉电阻接至VDD(通常与器件逻辑电平一致),不可接至5V当3.3V系统,否则漏电。 2. 若总线挂载多设备,等效上拉电阻并联,需重新计算(如两个4.7kΩ并联=2.35kΩ)。 3. 调试时可用示波器测上升沿,若过缓(>1μs)则减小电阻或降低速率。 ```c // 示例:STM32配置I2C上拉(内部上拉不推荐,外部必须加) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 开漏复用 GPIO_InitStruct.Pull = GPIO_NOPULL; // 外部上拉,内部不使能 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ```
mcuku 阿沐 · 2026-08-20