I2C總線的基本操作
1. 起始條件
始條件表示一系列操作的開始。圖1表示起始條件以及隨后數(shù)據(jù)傳輸?shù)拈_始操作。在I2C總線的空閑狀態(tài)下,SDA及SCL通過上拉電阻都為高電平。在這樣的狀態(tài)下,如果SCL仍保持高電平,而SDA變?yōu)榈碗娖?則成為開始指令。
圖1 I2C總線的起始條件
由于該狀態(tài)并不出現(xiàn)于地址及數(shù)據(jù)的發(fā)送與接收過程中,因此,即使在途中發(fā)生異常,只要檢測出該狀態(tài),初始化內(nèi)部的狀態(tài)機(jī),就可以使其恢復(fù)。
2. 結(jié)束條件
在一系列操作的最后是結(jié)束條件。結(jié)束條件如圖2所示。當(dāng)SOL為高電平時,一旦SDA由低電平變化為高電平,即成為結(jié)束條件,主機(jī)與器件之間的通信將停止,器件恢復(fù)為空閑狀態(tài)。進(jìn)行寫操作時的結(jié)束狀態(tài)是開始進(jìn)行EEPROM內(nèi)部單元寫操作的指示標(biāo)志。
圖2 I2C總線的結(jié)束條件
結(jié)束前所傳輸?shù)臄?shù)據(jù)是ACK/NoACK的狀態(tài)位,如果是ACK,則該狀態(tài)位為低電平。但如果發(fā)生某種錯誤時,則表示為NoACK的高電平。讀操作時的最后字節(jié)是主機(jī)向器件返回NoˉACK信息,所以SDA為高電平。這樣就不能形成結(jié)束條件所需要的SDA的上升沿,因此在結(jié)束之前需要加入啞元“0”數(shù)據(jù)位作為解決辦法。
在最終數(shù)據(jù)的ACK NoACK之后,主機(jī)通過下述的流程,形成結(jié)束條件,如下所述:
①SCL變?yōu)榈碗娖剑?/P>
②SDA變?yōu)榈碗娖剑?/P>
③SOL變?yōu)楦唠娖剑òl(fā)送啞元數(shù)據(jù));
④SDA變?yōu)楦唠娖剑ńY(jié)束條件)。
3. 數(shù)據(jù)傳輸
數(shù)據(jù)傳輸?shù)牧鞒倘鐖D3所示。除去開始與結(jié)束條件,在傳輸包含地址指定等數(shù)據(jù)時,能夠使SDA發(fā)生變化的條件只能是在SOL為低電平時。因此,總線操作以如下的步驟進(jìn)行:
①SCL變?yōu)榈碗娖剑?/P>
②為SDA設(shè)置數(shù)據(jù)(主機(jī)或者器件);
③SCL變?yōu)楦唠娖健?/P>
進(jìn)行數(shù)據(jù)讀操作時,主機(jī)在SOL恢復(fù)為高電平之前讀取數(shù)據(jù)。
圖3 I2C總線的數(shù)據(jù)傳輸
評論