當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]在說驅(qū)動之前,咱們可以先來了解下通信的基本原理。

微信公眾號:morixinguan
關(guān)注可了解更多的教程。問題,請公眾號留言,如有侵權(quán),請聯(lián)系刪除。
如果你覺得本文對你有幫助,歡迎贊賞



▲長按圖片保存可分享至朋友圈

在說驅(qū)動之前,咱們可以先來了解下通信的基本原理:

數(shù)據(jù)通信的種類有:串行通信、并行通信。不管是什么類型的通信,再怎么復(fù)雜的,也是在這兩種上面衍生出來的。

數(shù)據(jù)通信的傳輸方向又有:單工、半雙工、全雙工。它們之間各有什么樣的特點,我舉了車輛過道的實例,通俗易懂的跟大家講明白了。

數(shù)據(jù)通信的方式還可以分為:同步、異步。什么是同步?什么是異步?相信大家現(xiàn)在已經(jīng)有個概念了吧?同步就是根據(jù)一定的時鐘周期,做一定的事情,這里我舉了廣場舞的例子,那異步又是什么呢?異步就是隨時都可以,但怎么來區(qū)分開始,動作和結(jié)束呢?這就需要一幀數(shù)據(jù)里面安插開始傳輸位、數(shù)據(jù)內(nèi)容、結(jié)束位以作區(qū)分,然后還需要一定的傳輸頻率,這樣才能將數(shù)據(jù)發(fā)送出去。

而串口協(xié)議又是什么東西呢?串口協(xié)議就是一種串行異步通信協(xié)議。有協(xié)議還不行,得有硬件接口嘛,具體是什么就不說了。然后雙方都約定好,比如通信雙方都設(shè)置波特率115200,一次發(fā)8bit數(shù)據(jù),0個校驗位,1個停止位。接下來就開始發(fā)數(shù)據(jù),這時候就按照協(xié)議的規(guī)范,發(fā)送端開始發(fā)送一個起始位,通常是0,然后開始傳輸8bit數(shù)據(jù),如果需要校驗,那么就傳輸校驗位,最后再傳輸1bit的停止位,這樣一幀數(shù)據(jù)就發(fā)完了。

這節(jié),我們來說說I2C協(xié)議,I2C協(xié)議是什么鬼?I2C是(Inter-Integrated Circuit)的英文縮寫,是Philips公司開發(fā)的一個通信協(xié)議,只有兩根線是用來通信的。簡單的來說,如下圖:



我先來說下上面這幅圖具體是什么含義,然后接下來再來說說I2C是怎么操作數(shù)據(jù)的。I2C總線就是通過SDA總線(數(shù)據(jù))、SCL總線(時鐘)來傳輸數(shù)據(jù)的,那為什么I2C總線上還要接兩個上拉電阻呢?根據(jù)I2C規(guī)格設(shè)計上手冊上了解到,由于I2C接口設(shè)計大多采用的是集電極開路或者是開漏輸出的接口,當(dāng)總線為空閑的時候,兩根線均為高電平,由于I2C的SDA和SCL都具有線與功能,什么是線與?線與就是有0為0,同1為1,這是數(shù)字電路邏輯相關(guān)的了。也就是說只要有一個節(jié)點對總線(SCL或者SDA)發(fā)送了低電平,那么這整根線就會呈現(xiàn)為低電平,你想想,協(xié)議都說了,空閑要高電平,你突然給它來個低電平,這不逗死人嘛?這還叫協(xié)議?這明顯就是亂搞嘛,是不是?所以既然是協(xié)議,那I2C就肯定會有約束條件嘛,這個上拉電阻的其中一個作用就在這里了,給硬件電路的IO口提供一個確定的電平信號。

說到這里,可能有人要問了,我是寫代碼的,硬件我不太熟悉或者根本就不懂?。克麄兛赡軙岢鲞@樣的問題:什么是集電極開路輸出?什么是開漏輸出?什么是上拉電阻?上拉電阻取值要取什么值,這個電阻取大取小對I2C通信的時候有什么影響,應(yīng)該取什么值最合適?既然有上拉電阻,那是不是有下拉電阻?為什么我看有些I2C的外設(shè)接在MCU的IO口里,也沒有看見接上拉電阻啊,那為什么通信也正常?

下面咱們就來說說這些問題該怎么來解答,那什么問題好解釋,我們先從硬件電路開始下手,一步一步的分析上面的這些問題。

我們先來看一個簡單的電路:

想象一下,如果現(xiàn)在把B點上面那一部分去掉了,變成下面這樣:

學(xué)習(xí)數(shù)字電路后我們知道,電路的輸出狀態(tài)有三種:

1、高電平  2、低電平  3、高阻態(tài)

如圖(5),這種無法確定電路狀態(tài)到底是高電平還是低電平,就是高阻態(tài)。

什么是高阻態(tài)?

答:電路分析時高阻態(tài)可做開路理解。你可以把它看作輸出(輸入)電阻非常大。它的極限狀態(tài)可以認為懸空(開路)。也就是說理論上高阻態(tài)不是懸空,它是對地或?qū)﹄娫措娮铇O大的狀態(tài)。而實際應(yīng)用上與引腳的懸空幾乎是一樣的。

所以,我們可以認為,B點在開關(guān)斷開的時候,相當(dāng)于懸空引腳,沒有辦法確定它的狀態(tài),而一般情況下,為了給它確定一個電平,通常就會給IO口加一個上拉電阻,也就是圖(4)看到的情況,也就是當(dāng)按鍵沒按下的時候,B點為高電平,MCU讀取B點也為高電平。而當(dāng)按鍵按下的時候,則情況相反,這就是上拉電阻的其中一個作用------確定電路的狀態(tài)。那么下拉電阻也同樣是這么一個功能,該怎么分析,就不用我說了,道理是一樣的。

那么,最前面我們在分析I2C為什么要接上拉電阻的問題,其中一個原因是因為集電極開路輸出和漏極開路輸出,先來搞明白第一個問題,什么是集電極開路輸出?

什么是集電極開路輸出?集電極是什么指的什么東西?

答:集電極是三極管的其中一個電極,這里我們形象的把它畫出來:



那么怎么解決這么不能確定c點到底輸出多少的問題呢?上拉電阻閃亮登場?。。?!確定電路狀態(tài),這無疑就是個寶貝,關(guān)鍵時刻可以用到了,我們來看看怎么改變它。

由此可見,當(dāng)集電極開路的時候,比如就上面說的,當(dāng)三極管處于截止狀態(tài)的時候。也就相當(dāng)于bc之間沒有形成通路的時候,那么c點的電平無法確定,也就是說,將一個無法確定電平的線路接在I2C總線的SDA和SCL上,當(dāng)I2C為空閑的時候,能保證SDA和SCL輸出高電平嗎?不能?那不能的話,假設(shè)輸出低電平,由于I2C總線的線與關(guān)系,那不就相當(dāng)于違背了I2C協(xié)議所說的條件了嗎?所以這就是上拉電阻存在的必要性了。集電極開路也被稱為OC開路,OC,就是Open Collector的英文縮寫。

那么講到這里,有人可能就要問了,那現(xiàn)在我輸入1時,最終就要輸出1,不要反向,我現(xiàn)在輸入0的時候,我就要輸出0,不要被反向,那如何來實現(xiàn)呢?很簡單,我們接兩個反向器不就得了?來看看怎么接:


但通常在MCU中,不會這么接,但最終的效果是一樣的,原理還是有所區(qū)別。于是經(jīng)過改造就有了如圖(10)所示的電路,由兩只三極管共同控制,當(dāng)電平不同的時候,總有一只三極管是導(dǎo)通的,當(dāng)我把上拉電阻換成開關(guān)的時候,這個電路就稱為推挽輸出電路。

那么什么又是漏極輸出呢?漏極又是什么東西?漏極是場效應(yīng)管中的一個極:如圖(11)所示,場效應(yīng)晶體管(Field Effect Transistor縮寫(FET))簡稱場效應(yīng)管。主要有兩種類型(junction FET—JFET)和金屬 - 氧化物半導(dǎo)體場效應(yīng)管(metal-oxide semiconductor FET,簡稱MOS-FET)。由多數(shù)載流子參與導(dǎo)電,也稱為單極型晶體管。它屬于電壓控制型半導(dǎo)體器件。具有輸入電阻高(107~1015Ω)、噪聲小、功耗低、動態(tài)范圍大、易于集成、沒有二次擊穿現(xiàn)象、安全工作區(qū)域?qū)挼葍?yōu)點,現(xiàn)已成為雙極型晶體管和功率晶體管的強大競爭者。

場效應(yīng)管(FET)是利用控制輸入回路的電場效應(yīng)來控制輸出回路電流的一種半導(dǎo)體器件,并以此命名。

因此為什么I2C總線外要接兩個上拉電阻的原因就在于此。這時候疑問就來了,為什么有些MCU不需要加上拉電阻也可以正常驅(qū)動I2C總線呢?

答:有些MCU內(nèi)部帶了弱上拉電阻,這樣也可以與I2C總線實現(xiàn)線與的功能,這樣可以保證I2C在空閑的時候都為高電平。但考慮到驅(qū)動能力的問題,畢竟由芯片輸出的驅(qū)動能力有限,所以在外部接上拉電阻可以增加驅(qū)動能力。

至于電阻的大小取什么值,可以參考博客末尾的文章。

關(guān)于協(xié)議部分,常用的參考以下博客即可,寫得通俗易懂,也很好理解,以下這篇文章考慮的只是主-從模式,而多主機模式在這篇文章中并沒有涉及,建議還是看I2C官方的User Spec來了解,畢竟官方的是最標準的。

http://blog.csdn.net/w89436838/article/details/38660631


一網(wǎng)友寫的一個51單片機的程序,非常好理解,截取過來:





完整PPT:

http://download.csdn.net/download/morixinguan/10205419



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉