? ? ? ?首先介紹下自己的學(xué)習(xí)背景,博主本人是在上周剛?cè)腴T(mén)stm32并且學(xué)習(xí)gpio口基本用法和中斷的介紹。在這樣的知識(shí)儲(chǔ)備下我開(kāi)始學(xué)習(xí)I2c通信協(xié)議,并嘗試編寫(xiě)了師兄布置的一個(gè)小任務(wù)。
1.1.? I2C總線物理結(jié)構(gòu)
首先介紹下i2c通信協(xié)議,從物理層上來(lái)看這是一種非常簡(jiǎn)潔明了的通信協(xié)議。本身一共就兩條總線,一條SCL(時(shí)鐘總線),一條SDA(數(shù)據(jù)總線)。通信原理是通過(guò)對(duì)SCL和SDA線高低電平時(shí)序的控制,來(lái) 產(chǎn)生I2C總線協(xié)議所需要的信號(hào)進(jìn)行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時(shí),這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。硬件圖如下:

1.2? I2C總線特征
I2C總線上的每一個(gè)設(shè)備都可以作為主設(shè)備或者從設(shè)備,而且每一個(gè)設(shè)備都會(huì)對(duì)應(yīng)一個(gè)唯一的地址(可以從I2C器件的數(shù)據(jù)手冊(cè)得知),主從設(shè)備之間就通過(guò)這 個(gè)地址來(lái)確定與哪個(gè)器件進(jìn)行通信,在通常的應(yīng)用中,我們把CPU帶I2C總線接口的模塊作為主設(shè)備,把掛接在總線上的其他設(shè)備都作為從設(shè)備。
I2C總線上可掛接的設(shè)備數(shù)量受總線的最大電容400pF 限制,如果所掛接的是相同型號(hào)的器件,則還受器件地址位的限制。
I2C總線數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá)3.4Mbit/s。一般通過(guò)I2C總線接口可編程時(shí)鐘來(lái)實(shí)現(xiàn)傳輸速率的調(diào)整,同時(shí)也跟所接的上拉電阻的阻值有關(guān)。
I2C總線上的主設(shè)備與從設(shè)備之間以字節(jié)(8位)為單位進(jìn)行雙向的數(shù)據(jù)傳輸。
1.3? I2C總線協(xié)議
I2C協(xié)議規(guī)定,總線上數(shù)據(jù)的傳輸必須以一個(gè)起始信號(hào)作為開(kāi)始條件,以一個(gè)結(jié)束信號(hào)作為傳輸?shù)耐V箺l件。起始和結(jié)束信號(hào)總是由主設(shè)備產(chǎn)生。總線在空閑狀態(tài) 時(shí),SCL和SDA都保持著高電平,當(dāng)SCL為高電平而SDA由高到低的跳變,表示產(chǎn)生一個(gè)起始條件;當(dāng)SCL為高而SDA由低到高的跳變,表示產(chǎn)生一個(gè) 停止條件。在起始條件產(chǎn)生后,總線處于忙狀態(tài),由本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備獨(dú)占,其他I2C器件無(wú)法訪問(wèn)總線;而在停止條件產(chǎn)生后,本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備 將釋放總線,總線再次處于空閑狀態(tài)。如圖所示:

在了解起始條件和停止條件后,我們?cè)賮?lái)看看在這個(gè)過(guò)程中數(shù)據(jù)的傳輸是如何進(jìn)行的。前面我們已經(jīng)提到過(guò),數(shù)據(jù)傳輸以字節(jié)為單位。主設(shè)備在SCL線上產(chǎn)生每個(gè) 時(shí)鐘脈沖的過(guò)程中將在SDA線上傳輸一個(gè)數(shù)據(jù)位,當(dāng)一個(gè)字節(jié)按數(shù)據(jù)位從高位到低位的順序傳輸完后,緊接著從設(shè)備將拉低SDA線,回傳給主設(shè)備一個(gè)應(yīng)答位, 此時(shí)才認(rèn)為一個(gè)字節(jié)真正的被傳輸完成。當(dāng)然,并不是所有的字節(jié)傳輸都必須有一個(gè)應(yīng)答位,比如:當(dāng)從設(shè)備不能再接收主設(shè)備發(fā)送的數(shù)據(jù)時(shí),從設(shè)備將回傳一個(gè)否 定應(yīng)答位。數(shù)據(jù)傳輸?shù)倪^(guò)程如圖所示:
?
在前面我們還提到過(guò),I2C總線上的每一個(gè)設(shè)備都對(duì)應(yīng)一個(gè)唯一的地址,主從設(shè)備之間的數(shù)據(jù)傳輸是建立在地址的基礎(chǔ)上,也就是說(shuō),主設(shè)備在傳輸有效數(shù)據(jù)之前 要先指定從設(shè)備的地址,地址指定的過(guò)程和上面數(shù)據(jù)傳輸?shù)倪^(guò)程一樣,只不過(guò)大多數(shù)從設(shè)備的地址是7位的,然后協(xié)議規(guī)定再給地址添加一個(gè)最低位用來(lái)表示接下來(lái) 數(shù)據(jù)傳輸?shù)姆较颍?表示主設(shè)備向從設(shè)備寫(xiě)數(shù)據(jù),1表示主設(shè)備向從設(shè)備讀數(shù)據(jù)。如圖所示:

1.4? I2C總線操作
對(duì)I2C總線的操作實(shí)際就是主從設(shè)備之間的讀寫(xiě)操作。大致可分為以下三種操作情況:
第一,主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:
?
第二,主設(shè)備從從設(shè)備中讀數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:

第三,主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù),然后重啟起始條件,緊接著從從設(shè)備中讀取數(shù)據(jù);或者是主設(shè)備從從設(shè)備中讀數(shù)據(jù),然后重啟起始條件,緊接著主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:

其實(shí)以上關(guān)于I2C的詳細(xì)介紹都大同小異,而且一般介紹都比較詳細(xì)充分,我建議初學(xué)者只要提煉主要的有效信息就可以。初學(xué)者想要進(jìn)一步了解還是要結(jié)合具體程序來(lái)分析,所以下一篇博客我將詳細(xì)介紹下I2C應(yīng)用程序的編寫(xiě)。
