还有一点建议:对于没有显式“开漏”模式的微控制器,例如AVR和基于Arduino ATmega328的板卡(例如Uno),可以通过编写包装函数来模拟这种“开漏”模式当您将其发送给a时,它只是将一个引脚设置为“ Output LOW”,当您发送给a时,会将0
其配置为“ Input LOW”(高阻抗模式,内部上拉电阻未开启)1
。这样,您可以获得相同的效果。这些现代的32位ARM内核微控制器仅具有更多选择。
另外,链接到上述内容的STM32参考手册的 p146 指出以下内容:[我的补充内容放在方括号中]:
–开漏模式:输出寄存器中的“ 0”激活N-MOS [从而通过将引脚连接到GND从而主动将LOW驱动],而输出寄存器中的“ 1”则使端口处于Hi-Z状态(P- MOS永远不会激活)[高阻抗模式-与没有上拉或下拉电阻的浮动输入相同]
–推挽模式:输出寄存器中的“ 0”激活N-MOS [通过将引脚连接到GND来有效地驱动为低电平],而输出寄存器中的“ 1”激活P-MOS [通过连接而有效地驱动为高电平。针到VCC]
在Arduino代码中,“包装函数”可以这样实现:
digitalWriteOpenDrain(byte pin, bool state)
{
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
digitalWrite(pin, LOW);
}
}
或简化:
digitalWriteOpenDrain(byte pin, bool state)
{
digitalWrite(pin, LOW);
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
}
}
请注意,要打开 Arduino 上的内部上拉电阻,您可以执行以下操作:
pinMode(pin, INPUT_PULLUP);
或(同一件事):
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
补充阅读: