I2C是各類傳感器與模塊與Arduino通信的最常用方式之一
I2C的全稱為:Inter-Integrated Circuit
中文名字:內(nèi)部集成電路
可以讀作"I-squared-C",在中國常被讀作"I方C"铣墨。
I2C是Philips公司在1980年代,為了讓主板、嵌入式系統(tǒng)用以連接低速周邊裝置泳赋,而開發(fā)的一種簡單的雙向二線制同步串行總線,現(xiàn)在被廣泛地使用在系統(tǒng)內(nèi)多個集成電路(IC)間的通訊对妄。
它具有如下特點(diǎn):
I2C是 master(主) & slave(從) 的設(shè)計(jì)??
整個線路上只可有一個 master, 其他的都是 slave?
只能 master 與 slave之間進(jìn)行通訊?
slave 與 slave 之間是不可以通訊的
只有 master 可以主動向 slave 發(fā)送資料或提出請求
slave 只可因應(yīng) master 的請求而回傳資料, 不可以主動發(fā)送資料給 master?????
主機(jī)(master)可以用作主機(jī)發(fā)送器和主機(jī)接收器
I2C總線上的每一個設(shè)備都可以作為主設(shè)備或者從設(shè)備轿钠,而且每一個設(shè)備都會對應(yīng)一個唯一的地址,主從設(shè)備之間就通過這個地址來確定與哪個器件進(jìn)行通信??
I2C總線上的主設(shè)備與從設(shè)備之間以字節(jié)(8位)為單位進(jìn)行?串行的八位雙向數(shù)據(jù)傳輸
半雙工通信方式
它是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線赛不,可發(fā)送和接收數(shù)據(jù),兩根通訊線一根為控制時鐘線(SCL——Serial Clock用于同步設(shè)備間的數(shù)據(jù)傳輸時鐘罢洲;另一根為數(shù)據(jù)線(SDA——Serial Data)用于攜帶數(shù)據(jù)
Arduino nano的相關(guān)引腳:A4 (SDA), A5 (SCL)
其他arduino板子相關(guān)引腳:
相關(guān)庫的使用:
Arduino中使用I2C通信可直接調(diào)用Wire.h庫踢故,這個庫允許Arduino鏈接其他I2C設(shè)備文黎,以類的形式對I2C通信協(xié)議進(jìn)行了封裝。
Wire庫以外掛庫的形式放置于libraries文件夾內(nèi)殿较。
與內(nèi)建庫不同的是耸峭,用戶在使用I2C庫時,需要手動加入I2C庫的頭文件:
#include <Wire.h>
同時淋纲,為方便用戶使用劳闹,庫文件預(yù)創(chuàng)建了Wire對象,這樣用戶就可以在程序中直接使用Wire實(shí)現(xiàn)I2C通訊了洽瞬。
它從軟件上徹底屏蔽了I2C的底層協(xié)議內(nèi)容本涕,這也是Arduino的設(shè)計(jì)原則,讓用戶更加關(guān)注業(yè)務(wù)層面伙窃,而不是實(shí)現(xiàn)層面菩颖。
通信原理:
通過對SCL和SDA線高低電平時序的控制,來產(chǎn)生I2C總線協(xié)議所需要的信號進(jìn)行數(shù)據(jù)的傳遞为障。在總線空閑狀態(tài)時晦闰,這兩根線一般被上面所接的上拉電阻拉高,保持著高電平鳍怨。
信號種類:
1. 起始信號.
定義:SCL線為高電平期間呻右,SDA線由高電平向低電平的變化。
2. 終止信號
定義:SCL線為高電平期間京景,SDA線由低電平向高電平的變化
3. 讀寫數(shù)據(jù)信號
I2C總線進(jìn)行數(shù)據(jù)傳送時窿冯,時鐘信號為高電平期間骗奖,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定确徙,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高低電平狀態(tài)才允許變化执桌。
4. 應(yīng)答信號
I2C總線協(xié)議規(guī)定鄙皇,每傳送一個字節(jié)數(shù)據(jù),都要有一個應(yīng)答信號以確定數(shù)據(jù)傳送是否被對方接收仰挣。應(yīng)答信號由接收設(shè)備產(chǎn)生伴逸,在SCL為高電平期間,接收設(shè)備將SDA拉低為低電平膘壶,表示數(shù)據(jù)傳輸正確错蝴。
wire庫中常用的函數(shù)(使用時在其前面加上——wire.):
1.Begin()、Begin(address)
初始化Wire庫颓芭,并針對性初始化為主機(jī)或是從機(jī)顷锰。
上述兩種形式的區(qū)別如下:
Begin()初始化為主機(jī),
Begin(address)初始化為從機(jī)亡问,并為從機(jī)設(shè)置地址(0-127)官紫。
2.Write()
主機(jī)向從機(jī)寫數(shù)據(jù),或從機(jī)為響應(yīng)主機(jī)請求向主機(jī)寫數(shù)據(jù)。
注意:當(dāng)工作于主機(jī)向從機(jī)寫數(shù)據(jù)時束世,
該語句要位于beginTransmission()和endTransmission()語句之間酝陈。
有以下三種具體形式,描述如下:
Wire.write(value) – 寫字符毁涉。
Wire.write(string)–寫字符串
Wire.write(data, length)-寫指定長度的數(shù)組data沉帮。
3.requestFrom()
用于主機(jī)向從設(shè)備請求數(shù)據(jù),
此后就可以用available()和read()來具體操作從設(shè)備返回的數(shù)據(jù)了贫堰。
形式為:Wire.requestFrom(address,quantity)Address指明從設(shè)備的地址遇西,quantity指明請求的字節(jié)數(shù)。
4.Available()
返回接收緩存(數(shù)組)里的字符數(shù)严嗜,以便后續(xù)使用read()具體讀取粱檀。
具體使用中,對主機(jī)而言漫玄,必須事先調(diào)用requestFrom函數(shù)茄蚯;對從機(jī)而言,常在onReceive事件中使用睦优。
5.Read()
從接收緩存(數(shù)組)中讀取數(shù)據(jù)渗常。
6.注冊事件
除了上述幾個方法外,Wire庫還定義了兩個事件:
onReceive()和onRequest()汗盘。
都是為從設(shè)備注冊一個事件函數(shù)皱碘,用于響應(yīng)不同的事件。
onReceive()用于從機(jī)接收到主機(jī)字符的響應(yīng)隐孽,事件中執(zhí)行從設(shè)備的寫操作癌椿。
onRequest()用于從機(jī)接收到主機(jī)上傳數(shù)據(jù)通知的響應(yīng),事件中執(zhí)行從設(shè)備的讀操作菱阵。