引言
? ? ? 這里祝大家新年快樂!前面我們介紹了串口通訊協議,現在我們繼續來介紹另一種常見的簡單的串行通訊方式——I2C通訊協議。
一、什么是I2C
? ? ? ? I2C 通訊協議(Inter-Integrated Circuit)是由Phiilps公司在上個世紀80年代開發的,其英文翻譯過來實際上是【內部集成電路】,所以他就是為內部集成電路與其他各種模塊進行簡單的串口通訊設置的這樣一個協議。
關于I2C的叫法,簡單說明一下:
? ? ? ?根據英文縮寫,應該是寫成IIC,不過通常我們讀的時候會把兩個I讀成I2(I的平方的意思,標準寫法的2應該是在I的右上角)。之所以平時描述時直接寫I2C,主要是因為打角標相對麻煩,所以就出現這樣的寫法。當然了,字母旁邊跟著的“2”一般是表示“to”,所以很多時候會看見比如【P2P】這樣的寫法,這其實就是【Point to Point點對點】的意思。同時有些老外也會直接叫“I to C”,主要原因還是因為“I方C”說起來的話那個平方square念起來比較長,顯得麻煩,所以為了簡單就直接叫I to C了,所以關于I2C的叫法主要會存在這兩種說法。
? ? ? ?總的來說,關于I2C的叫法標準來說就是“I方C”,叫“I2C”相對顯得沒那么準確,也問題不大。
二、I2C有什么特點
? ? ? ?I2C主要優點是引腳少、硬件單路實現比較簡單、可擴展性強,其通訊相對來說還是非常穩定的。后來飛利浦公司將其知識產權完全放開,任何人都能隨意使用,成為了一個通用的通訊協議。不需要 USART、CAN等通訊協議的外部收發設備,加之其簡單易用等特點,因此現在被廣泛的使用在系統內多個集成電路(IC)間的低速串行通訊當中。
I2C是一種簡單的雙向兩線制總線協議標準,支持同步串行半雙工通訊。也就是說I2C通訊使用兩根線實現數據的傳輸;同時他是雙向的,既可以收,也可以發。由于其支持的是同步通訊,因此兩根線中必有一根是時鐘信號線,因此只有一條線進行數據的收發,因此其只能支持串行半雙工通訊,這也是I2C通訊與串口通訊的一個顯著區別。
三、I2C通訊的速度如何
? ? ? ?I2C通訊其在標準模式下的傳輸速率為100kbit/s,快速模式下傳輸速率為400kbit/s,高速模式下可達到3.4Mbit/s,目前大多I2C設備上不支持高速模式。
可見,I2C通訊的速度實際上也比較慢,畢竟其硬件簡單,對比串口通訊,前面設置的波特率一般是115200,也就是115.2,速率也差不多,最快的是450,理論上串口還會比I2C快一點點,當然也都快的有限,所以他們都算是一種低速串行通訊。所以I2C的硬件可能會更簡單,而串口通訊可能還相對復雜一點,主要是因為其同時又要收又要發,所以有一個通用的異步收發器UART在里面。
四、I2C的物理層
這里,我們來了解一下I2C的物理層,看看其硬件設備到底是如何進行設計的。
1、兩種總線
先介紹兩種總線,分別是SCL和SDA
SCL:Serial CLock,串行時鐘總線,用于數據的收發同步;
SDA:Serial DAta,串行數據總線,用高低電平表示數據。
2、通訊設備的連接
? ? ? ? 知道了使用的兩根線,那么設備他是怎么連接的呢?前面介紹串口通訊時我們知道,串口兩根線連接設備時是點對點的連接,有一個對應關系。而這里I2C通訊我們就一根數據線SCL,很顯然我們這里將會把各種設備掛在一根線上,進行數據的收或發。
? ? ? ?如上圖,也就是說,這實際上是一種總線連接的傳輸方式。也就是我們可以在SCL時鐘線和SDA數據線之間掛載多個I2C通訊設備。當然了,所有的這些I2C設備就相當于電路上的一種并聯的方式將通訊設備連接在了總線上。
? ? ? ?其可以連接多個I2C設備,其中多個設備中必須要有一個主設備,另外其他的可以是從設備。同時I2C通訊協議支持一主多從,也支持多主多從。
這里簡單解釋一下,什么叫主從設備?
主從設備是指總線上連接的設備,按其對總線有無控制功能可分為主設備和從設備兩種。
主設備,英文名Master,主人,起到一個控制的作用。這里主要是控制時鐘信號,相當于跑步時喊121的人,控制一個整體的節奏。
從設備,就相當于是聽指令的人,主從設備相當于一種主仆關系。
這里有一個疑問:如果多個設備同時要收發數據的話,全部在總線上進行,那數據不會亂嗎?
實際上,為了避免這種問題,我們I2C通訊協議規定,為了區分不同的設備,每個設備都會有一個唯一的地址,主設備會通過這個地址來與相應的從機進行通訊。然后總線連接方式下,我們使用的工作模式應該是開漏輸出,默認會處于一個高阻態,這時候就需要在外面接一個上拉電阻。
還有一個疑問:如果現在有多個主設備和從設備之間要進行數據的傳遞,全都要占用總線,那怎么辦呢?
? ? ? ?首先,總線是不能直接讓所有的設備都占用的,所以默認情況下總線會處于高阻態。總線通過上拉電阻接到電源。設備空閑時,輸出高阻態;當所有設備都空閑時,都輸出高阻態時,由上拉電阻把總線拉成高電平。
? ? ? ?當總線上有一個設備為0,就相當于設備接地,這時候整個數據總線上就都會被接地拉低,置為0,告訴數據總線上的其他所有設備該設備將要占用總線,然后就開始輸出數據。
一般情況下,主從設備是不能占用時鐘信號線的。
? ? ? ?但在特殊情況下,也可以往時鐘線上輸出0:在STM32的I2C模塊中有一個特殊的功能——時鐘擴展,即在I2C的主從通信過程中,總線上的SCL時鐘總是由主機來產生和控制的,但如果從機跟不上主機的速率,I2C協議規定:在開啟時鐘延展功能后,從機可以通過將SCL時鐘線拉低來暫停一個傳輸的,直到從機釋放掉SCL線,傳輸繼續進行。
五、I2C的協議層
? ? ? ?為了了解I2C通訊的數據傳輸需要怎么做,具體怎么樣規定要開始發送、結束發送、以什么樣的方式進行傳輸,數據是否有效等等問題的答案,我們需要來看看關于I2C通訊的相關協議部分。
1、位傳輸
? ? ? 前面提到,I2C通訊也是一種低速串行通訊方式。所以在數據傳輸方式上,作為串行通信,I2C時按照位進行傳輸,一般時高位先行。(與串口通訊是相反的)
2、起始信號
? ? ? ?知道數據時如何傳輸后,接下來我們就要討論數據什么時候開始傳輸了。也就是當出現什么信號后,就預示著我們要開始進行數據傳遞了。
? ? ? ?由于在沒有設備進行數據傳遞,也就是總線處于空閑時,總線上是處于高阻態,同時外接了上拉電阻接到電源,因此在沒有發送數據傳遞時總線或者說SDA線上應該處于高電平。因此我們可以給SDA低電平作為開始發送數據傳遞的起始信號。當然了,為了保證起始信號的獨特性,避免SDA線的低電平被視作一位數據,前提需要時鐘線SCL是處于高電平,這樣才能作為I2C通訊傳遞信號的起始信號。
簡單來說,起始信號:SCL是高電平時,SDA線從高電平向低電平切換。? 用start的S表示
3、停止信號
同理,停止信號就是SDA線由低電平又變成高電平,出現的上升沿信號。
即,停止信號:SCL是高電平時,SDA線從低電平向高電平切換。用stop的P表示
4、傳輸地址
? ? ? ?知道了什么時候進行或者結束數據傳遞后,我們當然就要開始進行數據傳遞了,這時候就會出現一個問題:我們和誰進行數據傳遞?此時就涉及到通訊設備的地址了。
? ? ? ?為了對應設備進行數據傳遞,主機會通過SDA信號線發送設備地址(SLAVE_ADDRESS)來查找從機。其中,I2C協議規定設備地址可以是7位或10位,實際中7位的地址應用比較廣泛。可見,7位設備地址就可以有2^7種設備同時去進行通信,再不夠可以擴展成10位,即2^10種設備同時進行數據傳遞。
? ? ? ?如上圖所示,一般設備地址占7位,然后緊跟著的一個數據位用來表示數據傳輸方向,他是數據方向位(R/W),通常是第8位或第11位。其中,數據方向位為“1”時表示主機由從機讀數據,該位為“0”時表示主機向從機寫數據。
5、數據的有效性
? ? ? ?確定了設備地址,那就真的要開始進行數據傳遞了。這時候就會涉及到另一個問題:系統他不會隨隨便便把一個信號當做傳遞的數據,所以I2C協議規定了什么情況下的數據才是有效數據。
? ? ? ?I2C協議規定SDA線的高低電平狀態只有在SCL時鐘信號線處于低電平時才能改變,同時SDA線上的數據必須在SCL時鐘信號線處于高電平周期保持穩定。
? ? ? ?也就是說,SCL線上處于高電平的時候,SDA線上的數據必須要保持穩定,相當于要做一個數據信號線的采樣;如果此時SDA線上處于一個下降沿,就意味著要開始傳遞數據;如果此時SDA線上處于一個上升沿,就意味著要停止傳遞數據。然后SCL線處于低電平時,SDA線上才能進行電平轉換。
6、響應
? ? ? I2C協議規定,當數據發送方發送數據以后,如果接收方收到了數據就必須給發送方一個響應(ACKnowledge),表示接收方收到數據了。
由上圖可知,按照主機控制的時鐘信號,每次時鐘信號高電平時在數據信號線上進行數據采樣,然后當數據線產生停止信號時表示數據傳遞結束,釋放SDA線。此時接收方就要發出響應,這里有兩種響應:
? ? ? ?1、應答響應ACK:接收器會給發送方一小段低電平信號;
? ? ? ?2、非應答響應NACK:接收器會給發送方一個高電平信號。
以上便是本次文章的所有內容,歡迎各位朋友在評論區討論,本人也是一名正在學習的小白,愿大家共同努力,一起進步吧!
鑒于筆者能力有限,難免出現一些紕漏和不足,望大家在評論區批評指正,謝謝!