本文主要介紹I2C總線的讀寫操作流程。
I2C總線的操作包括讀和寫,具體的操作流程如下:
1、主機(jī)發(fā)送數(shù)據(jù)(I2C寫)流程
I2C主機(jī)給從機(jī)寫數(shù)據(jù)的操作流程如下:
Master發(fā)起START;
Master發(fā)送I2C ADDR(7bit)和W操作0(1bit),等待ACK;
Slave發(fā)送ACK(ACK=0);
Master發(fā)送reg addr(8bit),等待ACK(該地址為雙方約定的需要寫入數(shù)據(jù)的首地址,實(shí)際使用中隨機(jī)寫入時(shí)可以沒有該地址數(shù)據(jù));
Slave發(fā)送ACK;
Master收到Slave的ACK信號(hào)后開始發(fā)送第一個(gè)字節(jié)的數(shù)據(jù)(8bit),等待ACK;
Slave收到數(shù)據(jù)后發(fā)送ACK;
Master收到ACK后再發(fā)送下一個(gè)數(shù)據(jù);
當(dāng)Master發(fā)送完最后一個(gè)字節(jié)數(shù)據(jù)并收到Slave的ACK后,發(fā)起STOP。
★主機(jī)通過發(fā)送地址碼與對(duì)應(yīng)的從機(jī)建立了通信關(guān)系,而掛接在總線上的其它從機(jī)雖然同時(shí)也收到了地址碼,但因?yàn)榕c其自身的地址不相符合,因此提前退出與主機(jī)的通信;
★主機(jī)的一次發(fā)送通信,其發(fā)送的數(shù)據(jù)數(shù)量不受限制。主機(jī)是通過STOP信號(hào)通知發(fā)送的結(jié)束,從機(jī)收到STOP信號(hào)后退出本次通信;
★主機(jī)的每一次發(fā)送后都是通過從機(jī)的ACK信號(hào)了解從機(jī)的接收狀況,如果應(yīng)答錯(cuò)誤則重發(fā)(一般重發(fā)次數(shù)可以設(shè)置,但次數(shù)太多會(huì)影響效率);
★實(shí)際測試時(shí),ACK信號(hào)會(huì)有一個(gè)毛刺,是因?yàn)閿?shù)據(jù)和ACK是不同的角色發(fā)出的(當(dāng)主機(jī)發(fā)送數(shù)據(jù)時(shí),從機(jī)返回ACK;當(dāng)從機(jī)發(fā)送數(shù)據(jù)時(shí),主機(jī)返回ACK),這樣ACK正好是方向切換的時(shí)候,毛刺的大小取決于主從之間的切換速度。
2、主機(jī)接收數(shù)據(jù)(I2C讀)流程
I2C主機(jī)讀取從機(jī)數(shù)據(jù)的操作流程如下:
Master發(fā)送START;
Master發(fā)送I2C ADDR(7bit)和R操作1(1bit),等待ACK;
Slave發(fā)送ACK;
Master發(fā)送reg addr(8bit),等待ACK;
Slave發(fā)送ACK;
Master發(fā)起START;
Master發(fā)送I2C addr(7bit)和r操作1(1bit),等待ACK;
Slave發(fā)送ACK;
Slave發(fā)送ACK后,緊接著向Master發(fā)送數(shù)據(jù);
Master收到數(shù)據(jù)后發(fā)送ACK;
Slave接收到ACK后再向Master發(fā)送下一個(gè)數(shù)據(jù);
當(dāng)Master完成接收數(shù)據(jù)后,向Slave發(fā)送一個(gè)非應(yīng)答信號(hào)(NAK=1),從機(jī)收到非應(yīng)答信號(hào)后停止發(fā)送數(shù)據(jù);
Master發(fā)送非應(yīng)答信號(hào)后,再發(fā)送一個(gè)STOP信號(hào)。
★主機(jī)所接收數(shù)據(jù)的數(shù)量是由主機(jī)自身決定,當(dāng)發(fā)送“非應(yīng)答信號(hào)/A”時(shí)從機(jī)便結(jié)束傳送并釋放總線(非應(yīng)答信號(hào)的兩個(gè)作用:前一個(gè)數(shù)據(jù)接收成功,從機(jī)不再發(fā)送數(shù)據(jù))。當(dāng)從機(jī)收到NAK信號(hào)后如果沒有停止信號(hào),則從機(jī)會(huì)重發(fā)上一字節(jié)數(shù)據(jù)。
3、讀寫指定地址的方式
I2C讀寫指定地址有以下幾種方式:
在從器件地址后面直接跟需要讀寫的寄存器首地址,然后直接跟數(shù)據(jù),最后通過停止信號(hào)結(jié)束此次讀寫。
主從器件約定讀寫指令,在從器件地址后面直接跟讀寫指令,然后再跟需要讀寫的寄存器首地址,然后直接跟數(shù)據(jù)。
在發(fā)送完從器件地址后直接跟需要讀寫的寄存器地址,然后再通過重復(fù)開始信號(hào)(后跟從機(jī)地址)進(jìn)行讀寫操作(數(shù)據(jù)直接寫入或者讀取相應(yīng)的寄存器)。
★所有讀寫操作,都不會(huì)限定數(shù)據(jù)的長度,讀寫數(shù)據(jù)的長度由主機(jī)決定。不需要讀寫數(shù)據(jù)了就發(fā)送STOP信號(hào)。
4、復(fù)合傳輸實(shí)現(xiàn)方式
在傳輸過程中改變方向,開始條件和從機(jī)地址都要重復(fù),而讀寫bit要取反。如果主機(jī)發(fā)送一個(gè)重復(fù)的開始條件,那么它在這之前要發(fā)送一個(gè)NAK。
★復(fù)合模式可以在比如控制串行寄存器時(shí)用到。在第一個(gè)數(shù)據(jù)字節(jié)時(shí)一定要寫寄存器內(nèi)部的地址。開始條件和從地址重復(fù)后,數(shù)據(jù)就開始傳輸了。
★自動(dòng)增加或減少之前訪問的寄存器地址都由設(shè)備的設(shè)計(jì)者決定。
★兼容I2C總線的設(shè)備在接收到開始條件或重復(fù)開始條件時(shí)都一定要重啟它們的總線邏輯,即使開始條件都不是正確的格式,它們都期望發(fā)送從機(jī)地址。
★開始條件后馬上跟著一個(gè)終止條件是不合法的格式。
以上就是針對(duì)I2C總線的主機(jī)發(fā)送、主機(jī)接收、讀寫指定地址數(shù)據(jù)、符合傳輸方式的操作流程介紹。
-
I2C總線
+關(guān)注
關(guān)注
8文章
390瀏覽量
60916
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論