GPIO的输出模式有四种,看到一篇文章,其中‘开漏输出’和‘推挽输出’的形象理解如下:
- 推挽电路
对于三极管而言,中间的基极相当于控制端。它是一个电流控制型元器件,意思就是说,只要基极B有输入(或输出)电流就可以对这个晶体管进行控制了。
下图为NPN型三极管:
那PNP型三极管正好相反,当有电流从控制端(基极)流出时,就会有电流从输入端流到输出端。
那么推挽电路:
经过上面的N型三极管提供电流给负载(Rload),这就叫「推」。
将三极管替换为场效应管:
场效应管是电压控制型元器件,只要对栅极施加电压,DS就会导通。 - 开漏电路
漏极那一端开路,直接作为输出端口。
仍然用三极管举例,开漏电路带一个负载LED,外接一个上拉电阻。
当Vin没有电流,Q5断开时,LED亮。
当Vin流入电流,Q5导通时,LED灭。 - 用开关代替晶体管或MOS管,等效电路如下:
下文参考 https://zhuanlan.zhihu.com/p/655515457
I2C通信时要求引脚配置为开漏输出模式,可能的原因如下:
- 防止短路:开漏输出模式允许多个设备同时连接到总线上而不会造成短路。因为开漏输出在高阻态时不提供电压,所以当多个设备尝试驱动总线到不同的电平时,只有接地(低电平)的设备会起作用,而试图输出高电平的设备由于是高阻态,不会对总线造成影响。
- 实现“线与”功能:I2C协议中的数据总线(SDA)和时钟总线(SCL)都需要实现“线与”功能,即多个设备可以共享同一条总线。开漏输出模式下,所有设备的输出都通过上拉电阻连接到电源,当没有设备拉低电平时,总线保持高电平;当有设备需要拉低电平时,总线随之变为低电平。这样的设计简化了总线的仲裁机制,使得多个主设备可以高效地共享总线资源。
- 兼容性:开漏输出模式可以通过外部上拉电阻来适配不同的电压水平,这使得I2C设备在不同的电源电压下能够正常工作。例如,如果外设的电压低于单片机的电压,使用开漏输出可以通过调整上拉电阻的值来确保信号的正确传输。
- 节省功耗:开漏输出模式在不输出高电平时呈现高阻态,这意味着在没有数据传输时,总线不会消耗额外的电流,有助于降低系统的功耗。
- 灵活性:开漏输出模式提供了更大的灵活性,因为它允许外部电路通过上拉电阻来定义输出高电平时的电平值。这对于设计具有不同电源要求的系统非常有用。
总之,开漏输出模式在I2C通信中的应用是为了确保通信的可靠性、灵活性和低功耗特性,同时也是为了满足I2C协议对于总线共享和多主设备通信的要求。
UART通信时要求引脚配置为复用推挽模式的原因可能有以下几点:
- 提高驱动能力:推挽输出模式可以提供较强的输出驱动能力,这对于长距离传输或者信号质量不佳的环境下尤为重要。它能够确保信号的稳定性,减少由于信号衰减导致的通信错误。
- 增强信号完整性:复用推挽模式下,输出信号具有更好的信号完整性,因为它可以提供明确的高电平和低电平状态,这有助于接收端更准确地识别逻辑水平。
- 兼容性:复用推挽模式使得UART通信更加灵活,可以适应不同的硬件设计需求。例如,某些外部设备可能需要一个明确的高电平信号来确保可靠的通信。
- 简化电路设计:在一些设计中,使用复用推挽输出可以减少外部元件的使用,如上拉电阻,这样可以简化电路板的设计,降低成本,并可能提高系统的可靠性。
- 适应不同的通信场景:尽管Rx引脚通常配置为浮空输入以允许外部设备驱动信号,但在某些特定的应用场景下,Tx引脚可能需要配置为上拉状态,以确保在没有数据传输时总线不会被悬空在不确定的状态。
此外,在一些情况下,为了避免信号反射或者确保信号在总线上的稳定性,可能会在Rx引脚上加上拉电阻。这个上拉电阻的值通常取决于具体的通信环境和总线的电气特性。
总的来说,UART通信时引脚配置为复用推挽模式是为了确保信号的稳定传输、提高系统的兼容性和简化电路设计等。