I2C總線詳解
一、特點(diǎn)
I2C總線是由Philips公司開發(fā)的一種簡單、雙向二線制同步串行總線。其主要特點(diǎn)可以概括如下:
(1)在硬件上,12C總線只需要一根數(shù)據(jù)線SDA和一根時(shí)鐘線SCL兩根線,SDA傳輸數(shù)據(jù),每次傳輸8bit,即一字節(jié),且先傳輸高bit,再傳輸?shù)蚥it。SCL是時(shí)鐘線,用于時(shí)鐘同步。
(2)I2C總線是一個(gè)真正的多主機(jī)總線。如果兩個(gè)或多個(gè)主機(jī)同時(shí)初始化數(shù)據(jù)傳輸,可以通過沖突檢測和仲裁防止數(shù)據(jù)破壞,每個(gè)連接到總線上的器件都有唯一的地址,任何器件既可以作為主機(jī)也可以作為從機(jī),但任何時(shí)間點(diǎn)只能有一個(gè)主機(jī)??偩€上每個(gè)設(shè)備都有自己的一個(gè)地址,通過地址方式尋址各個(gè)器件,共7個(gè)bit,理論上總線可掛載127個(gè)器件(全0為廣播地址),但一個(gè)系統(tǒng)中可能有多個(gè)同種芯片,因此地址又分為固定部分和可編程部份,具體視芯片而定。
(3)連接到總線上的芯片數(shù)量除受7bit地址限制外,還受總線最大電容的限制。
(4)串行的8位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100Kbit/s,快速模式下可達(dá)400Kbit/s,高速模式下可達(dá)3.4Mbit/s。
二、工作原理
SDA和SCL都是雙向I/O線,接口電路為開漏輸出,使用時(shí)必須通過上拉電阻接到電源VCC.當(dāng)總線空閑時(shí),兩根線都是高電平,連接總線的所有器件輸出級(jí)都是開漏電路,從而在總線上消耗的電流很小。因此,總線上擴(kuò)展的器件數(shù)量主要由電容負(fù)載來決定,因?yàn)槊總€(gè)器件的總線接口都有一定的等效電容.而線路中電容會(huì)影響總線傳輸速度。當(dāng)電容過大時(shí),有可能造成傳輸錯(cuò)誤。由于其負(fù)載能力為400pF,因此可以估算出總線允許長度和所接器件數(shù)量。
總線上的器件由一個(gè)主器件和其他從器件組成。主器件用于啟動(dòng)總線傳送數(shù)據(jù),并產(chǎn)生時(shí)鐘以開放傳送的器件,此時(shí)任何被尋址的器件均被認(rèn)為是從器件.在總線上主和從、發(fā)和收的關(guān)系不是恒定的,而取決于此時(shí)數(shù)據(jù)傳送方向。如果主器件要發(fā)送數(shù)據(jù)給從器件,則主器件首先尋址從器件,然后主動(dòng)發(fā)送數(shù)據(jù)至從器件,最后由主器件終止數(shù)據(jù)傳送;如果主器件要接收從器件的數(shù)據(jù),首先由主器件尋址從器件.然后主器件接收從器件發(fā)送的數(shù)據(jù),最后由主器件終止接收過程。在這種情況下,主器件負(fù)責(zé)產(chǎn)生定時(shí)時(shí)鐘和終止數(shù)據(jù)傳送。
三、傳輸協(xié)議
位傳輸
數(shù)據(jù)位傳輸:SCL為高電平時(shí),SDA線若保持穩(wěn)定,那么SDA上是在傳輸數(shù)據(jù);若SDA發(fā)生跳變,則用來表示一個(gè)會(huì)話的開始或結(jié)束。數(shù)據(jù)改變:SCL為低電平時(shí),SDA線才能改變傳輸?shù)臄?shù)據(jù)位,具體如下圖所示。
開始和結(jié)束信號(hào)
開始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。結(jié)束信號(hào):SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。其具體如下圖所示。
應(yīng)答信號(hào)
主設(shè)備每發(fā)送完8bit數(shù)據(jù)后等待從設(shè)備的ACK,即在第9個(gè)clk,讀取到SDA低電平為有效;主設(shè)備把clk拉低,并將sda換成輸入模式(上拉電阻,默認(rèn)高電平)讀取第9位,clk再次拉高,讀取從設(shè)備發(fā)來的ACK。這里又分兩種情況:
1.寫操作:主設(shè)備把clk拉高,等待讀取ACK,從設(shè)備發(fā)現(xiàn)clk拉高后,就把sda拉低,告訴主設(shè)備,成功接收到8位數(shù)據(jù)。
2.讀操作:主設(shè)備發(fā)送芯片地址和寄存器地址,這兩個(gè)字節(jié)的ACK都是由從設(shè)備來拉低,同寫操作; 從設(shè)備開始向從設(shè)備發(fā)送數(shù)據(jù),clk為低時(shí),sda變化,主設(shè)備clk拉高時(shí)讀取sda, ACK由主設(shè)備拉低; 當(dāng)從設(shè)備發(fā)送完最后一個(gè)字節(jié)后,主設(shè)備強(qiáng)制把ACK拉高,通知從設(shè)備不要需要再發(fā)了, 從設(shè)備發(fā)現(xiàn)這個(gè)ACK沒有被拉低,認(rèn)為主設(shè)備接收錯(cuò)誤,也就結(jié)束發(fā)送了,當(dāng)然從設(shè)備自己也知道這是最后一個(gè)字節(jié)。
? 標(biāo)準(zhǔn)寫流程
a) 主器件產(chǎn)生開始信號(hào)
b) 主器件發(fā)送從器件地址(7bit)和讀寫操作位0(1bit),改SDA為輸入,等待ACK
c) 從器件發(fā)送ACK
d) 主器件發(fā)送從器件寄存器地址(8bit),改SDA為輸入,等待ACK
e) 從器件發(fā)送ACK
f) 主器件發(fā)送數(shù)據(jù)字節(jié)(8bit),即要寫入寄存器中的數(shù)據(jù),改SDA為輸入,等待ACK
g) 從器件發(fā)送ACK
h) 上述第f步至第g步可以重復(fù)多次,即可以按順序?qū)懚鄠€(gè)寄存器
i) 主器件產(chǎn)生停止信號(hào),結(jié)束數(shù)據(jù)傳輸。
? 標(biāo)準(zhǔn)讀流程
a) 主器件產(chǎn)生開始信號(hào)
b) 主器件發(fā)送從器件地址(7bit)和讀寫操作位0(1bit),改SDA為輸入,等待ACK
c) 從器件發(fā)送ACK
d) 主器件發(fā)送從器件寄存器地址(8bit),改SDA為輸入,等待ACK
e) 從器件發(fā)送ACK
f) 主器件產(chǎn)生開始信號(hào)
g) 主器件發(fā)送從器件地址(7bit)和讀寫操作位1(1bit),改SDA為輸入,等待ACK
h) 從器件發(fā)送ACK
i) 從器件發(fā)生數(shù)據(jù)字節(jié)(8bit),即寄存器中的值
j) 主器件發(fā)送ACK
k) 上述第i步至第j步可以重復(fù)多次,即可以按順序讀多個(gè)寄存器
l) 主器件產(chǎn)生停止信號(hào),結(jié)束數(shù)據(jù)傳輸。