[应用相关] IO模拟I2C需要开漏模式吗

[复制链接]
3489|27
 楼主| 734774645 发表于 2024-8-31 22:59 | 显示全部楼层 |阅读模式
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。
一、I2C总线简介

I2C(Inter-Integrated Circuit)总线是一种双向串行通信总线,由两根线组成:SDA(数据线)和SCL(时钟线)。这两根线都是双向的,并且是开漏输出的,这意味着每个设备都可以将线拉低(Ground),但不能将线拉高(Vcc)。这种设计使得多个设备可以共享同一条总线,以进行通信。

二、 I2C接口接外部上拉电阻的原因

I2C(Inter-Integrated Circuit)接口在使用时需要连接外部上拉电阻,主要原因包括以下几点:
开漏(Open-drain)或开集电极(Open-collector)输出:I2C总线上的设备如主设备和从设备使用开漏或开集电极的输出方式来驱动总线。这意味着,设备只能将线路拉低(接地),而不能直接将线路拉高至供电电压。因此,需要外部上拉电阻来将线路拉高。多主设备配置:I2C允许多个主设备存在于同一总线上。为了防止输出冲突(例如,一个设备尝试将线路拉高,而另一个设备尝试将线路拉低),I2C设计为只能通过外部上拉电阻来将信号线拉高,从而简化了总线管理。逻辑状态的稳定和可靠性:外部上拉电阻确保在没有设备主动驱动线路时,数据线(SDA)和时钟线(SCL)能稳定地保持在高电平状态。这有助于提高信号的可靠性和减少误读。灵活的电压级别:由于I2C设备可以支持不同的逻辑电平,使用外部上拉电阻可以方便地匹配总线电平到特定的系统电压,例如3.3V或5V等,从而使得不同电压等级的设备可以共存于同一总线。电气特性的优化:通过选择合适的上拉电阻值,可以优化总线的电气特性,如上拉速率、功耗和噪声容限。电阻值太低会增加功耗和可能导致总线驱动器过载,而电阻值太高则可能导致信号上升时间过长,影响总线速率。所以综上所述,外部上拉电阻在I2C通信中发挥着至关重要的作用,保证了通信的稳定性和灵活性。在I2C通信中,使用推挽(push-pull)输出并不是标准的实现方式,因为这种输出方式与I2C设计的开漏(open-drain)或开集电极(open-collector)输出方式存在本质上的差异。下面详细解释为什么通常不使用推挽输出:总线冲突的风险:I2C总线设计为多主设备和多从设备可以共享同一总线。如果使用推挽输出,当一个设备试图将总线拉高而另一个设备试图将其拉低时,将会发生总线冲突,可能导致设备损坏。信号完整性问题:推挽输出可以同时驱动高电平和低电平,这在总线空闲和活跃时都维持总线状态。然而,这种方式缺乏开漏输出的灵活性,例如在总线检测和仲裁过程中动态改变控制权,这是I2C协议重要的一部分。电平匹配和灵活性降低:使用推挽输出意味着所有设备必须在相同的电压级别上操作,这限制了不同电压级别设备的互操作性。相比之下,开漏输出允许通过外部上拉电阻选择适当的电压级别,以匹配不同设备的电压要求。仲裁和时钟同步问题:I2C支持总线仲裁和时钟同步,这依赖于能够检测总线上的高电平和低电平状态。如果总线使用推挽输出,总线上的电平状态将由最后一个发送信号的设备完全控制,从而使得仲裁和同步变得困难或不可能。因此,尽管理论上可以通过某些特定设计让I2C总线上的设备使用推挽输出,但这样做通常需要额外的硬件支持和复杂的总线管理策略,且违背了I2C协议的基本设计原则。如果需要在I2C总线上实现类似推挽的功能,通常建议使用其他通信协议,如SPI或UART,这些协议本身就设计为支持推挽输出。

 楼主| 734774645 发表于 2024-8-31 23:00 | 显示全部楼层
那么问题来了,SPI需要开漏吗
星辰大海不退缩 发表于 2024-9-4 22:24 | 显示全部楼层
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。
nomomy 发表于 2024-9-9 10:14 | 显示全部楼层
在 I2C 总线上,所有设备的 SCL 和 SDA 引脚都是通过上拉电阻连接到正电源的。
wangdezhi 发表于 2024-9-9 11:21 | 显示全部楼层
开漏模式可以防止损坏 GPIO 引脚,因为它们不会试图直接驱动对方的输出。
AdaMaYun 发表于 2024-9-9 15:23 | 显示全部楼层
I2C总线是一种双向串行通信总线,由两根线组成:SDA(数据线)和SCL(时钟线)
biechedan 发表于 2024-9-9 19:53 | 显示全部楼层
需要在外部添加上拉电阻              
mmbs 发表于 2024-9-9 22:56 | 显示全部楼层
在使用STM32的GPIO模拟I2C通信时,通常需要将相关的GPIO引脚配置为开漏(Open-Drain)输出模式,
beacherblack 发表于 2024-9-10 01:56 | 显示全部楼层
通过设置GPIO为开漏输出模式,可以确保SDA和SCL线在未被驱动时保持高电平状态,从而避免信号冲突和设备损坏。
uiint 发表于 2024-9-10 04:58 | 显示全部楼层
开漏输出模式允许引脚在输出高电平时处于高阻态,此时引脚电平由外部上拉电阻决定。这有助于实现不同电压域之间的电平匹配,特别是在主从设备工作电压不一致的情况下。
earlmax 发表于 2024-9-10 18:01 | 显示全部楼层
当GPIO引脚配置为开漏模式时,它可以呈现高阻态(High-Z),这意味着引脚既不输出高电平也不输出低电平,而是处于高阻抗状态。
maqianqu 发表于 2024-9-10 19:48 | 显示全部楼层
如果电路设计中已经包含了上拉电阻,并且这些电阻可以提供足够的电流来驱动STM32的GPIO引脚,那么可以使用推挽模式。
averyleigh 发表于 2024-9-11 12:47 | 显示全部楼层
开漏输出模式允许引脚在输出高电平时处于高阻态,此时引脚电平由外部上拉电阻决定。这有助于实现不同电压域之间的电平匹配,特别是在主从设备工作电压不一致的情况下。
jackcat 发表于 2024-9-11 14:28 | 显示全部楼层
开漏模式:在这种模式下,STM32的GPIO引脚在输出低电平时可以提供足够的上拉电流,以驱动外部上拉电阻,从而在输出高电平时保持高阻态。
everyrobin 发表于 2024-9-11 16:25 | 显示全部楼层
对于SDA和SCL引脚,通常建议使用推挽模式
biechedan 发表于 2024-9-11 18:23 | 显示全部楼层
开漏模式的引脚可以实现线与逻辑,即多个设备共享同一根信号线时,只有当所有设备都输出低电平时,信号线才呈现低电平;否则,信号线呈现高电平。
phoenixwhite 发表于 2024-9-11 20:01 | 显示全部楼层
需要在外部添加上拉电阻              
LOVEEVER 发表于 2024-9-12 15:01 | 显示全部楼层
为防止问题发生建议增加线缆的上拉电阻,增强稳定性
lihuami 发表于 2024-9-12 22:31 | 显示全部楼层
多个设备可以共享同一条数据线或时钟线,并且任何一个设备都可以将该线拉低,但没有一个设备能够单独将线拉高。
10299823 发表于 2024-9-13 09:43 | 显示全部楼层
如果电路设计中没有上拉电阻,或者上拉电阻的电流不足以驱动STM32的GPIO引脚,那么可能需要使用开漏模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

3588

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部