之前做DS18B20實驗時,一直在糾結一個問題,數據線既需要接收數據,又需要傳輸數據,應該選擇什么輸入輸出方式呢?
最開始的時候選擇了推挽輸出和浮空輸入切換的方式,當引腳作為輸入的時候切換成浮空輸出,當引腳作為輸出的時候又切換成推挽輸出,但是這樣弄很麻煩不停地換來換去,最終這個實驗沒有成功,主要原因應該是時序的問題,過了 一段時間以后,突然想起之前在Ti申請過一片TMP101的I2C接口的溫度傳感器,之前那個沒弄出來很不甘心,這次在心里暗下決心一定要把這個芯片調通!
要弄好這個芯片首先遇到的問題,依然是端口的輸入輸出問題,這回我看了很多網友寫的I2C總線的代碼,絕大多數都是用推挽輸出加上拉電阻實現雙向數據傳輸的,所以我也這么干了,在芯片SDA腳加了一個5.1K的上拉電阻,剛開始用示波器看程序的時候發現SDA電平總是高,我開始有點不賴煩了,最后發現居然是示波器探頭沒接好(我發現有很多時候,我都會犯這種很低級的錯誤),就這樣,在時序上花一些功夫后最后縱欲調通了。調通知后,我馬上又 改配置,換成弱上拉的方式,把5.1K的上拉電阻給撤了,這樣也沒問題。
其實弱上拉說白了就是,開漏輸出加上拉電阻,也就是說STM32引腳的弱上拉方式就是ST公司為用戶提供的一個數據雙向傳輸口。
同理,弱下拉就是開漏輸出加下拉電阻,同樣是雙向數據傳輸口。因此大家基本上不需要用切換輸出方式的方法來處理雙向數據傳輸的問題。
//********************************************************************************************************
附上我在網上盪的別個的解釋:
IO配置輸入的時候有你說的三種模式外還有模擬輸入。
上拉輸入模式:區別在於沒有輸入信號的時候默認輸入高電平(因為有弱上拉)。
下拉輸入模式:區別在於沒有輸入信號的時候默認輸入低電平(因為有弱下拉)。
對於浮空輸入模式顧名思義也就是輸入什么信號才是什么信號,對於浮空輸入要保證有明確的輸入信號。

