之前做DS18B20实验时,一直在纠结一个问题,数据线既需要接收数据,又需要传输数据,应该选择什么输入输出方式呢?
最开始的时候选择了推挽输出和浮空输入切换的方式,当引脚作为输入的时候切换成浮空输出,当引脚作为输出的时候又切换成推挽输出,但是这样弄很麻烦不停地换来换去,最终这个实验没有成功,主要原因应该是时序的问题,过了 一段时间以后,突然想起之前在Ti申请过一片TMP101的I2C接口的温度传感器,之前那个没弄出来很不甘心,这次在心里暗下决心一定要把这个芯片调通!
要弄好这个芯片首先遇到的问题,依然是端口的输入输出问题,这回我看了很多网友写的I2C总线的代码,绝大多数都是用推挽输出加上拉电阻实现双向数据传输的,所以我也这么干了,在芯片SDA脚加了一个5.1K的上拉电阻,刚开始用示波器看程序的时候发现SDA电平总是高,我开始有点不赖烦了,最后发现居然是示波器探头没接好(我发现有很多时候,我都会犯这种很低级的错误),就这样,在时序上花一些功夫后最后纵欲调通了。调通知后,我马上又 改配置,换成弱上拉的方式,把5.1K的上拉电阻给撤了,这样也没问题。
其实弱上拉说白了就是,开漏输出加上拉电阻,也就是说STM32引脚的弱上拉方式就是ST公司为用户提供的一个数据双向传输口。
同理,弱下拉就是开漏输出加下拉电阻,同样是双向数据传输口。因此大家基本上不需要用切换输出方式的方法来处理双向数据传输的问题。
//********************************************************************************************************
附上我在网上荡的别个的解释:
IO配置输入的时候有你说的三种模式外还有模拟输入。
上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。
下拉输入模式:区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。
对于浮空输入模式顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号。