I2C組成及工作原理
I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機(jī)系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。
I2C總線只有兩根雙向信號(hào)線臣嚣。一根是數(shù)據(jù)線SDA颅停,另一根是時(shí)鐘線SCL。
I2C總線通過(guò)上拉電阻接正電源具温。當(dāng)總線空閑時(shí)蚕涤,兩根線均為高電平。連到總線上的任一器件輸出的低電平铣猩,都將使總線的信號(hào)變低揖铜,即各器件的SDA及SCL都是線“與”關(guān)系。
每個(gè)接到I2C總線上的器件都有唯一的地址达皿。主機(jī)與其它器件間的數(shù)據(jù)傳送可以是由主機(jī)發(fā)送數(shù)據(jù)到其它器件天吓,這時(shí)主機(jī)即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器峦椰。 在多主機(jī)系統(tǒng)中龄寞,可能同時(shí)有幾個(gè)主機(jī)企圖啟動(dòng)總線傳送數(shù)據(jù)。為了避免混亂汤功, I2C總線要通過(guò)總線仲裁物邑,以決定由哪一臺(tái)主機(jī)控制總線。
I2C總線數(shù)據(jù)傳送
一冤竹、數(shù)據(jù)位的有效性規(guī)定
I2C總線進(jìn)行數(shù)據(jù)傳送時(shí)拂封,時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定鹦蠕,只有在時(shí)鐘線上的信號(hào)為低電平期間冒签,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。
二钟病、起始和終止信號(hào)
SCL線為高電平期間萧恕,SDA線由高電平向低電平的變化表示起始信號(hào)刚梭;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)票唆。
起始和終止信號(hào)都是由主機(jī)發(fā)出的朴读,在起始信號(hào)產(chǎn)生后,總線就處于被占用的狀態(tài)走趋;在終止信號(hào)產(chǎn)生后衅金,總線就處于空閑狀態(tài)。
連接到I2C總線上的器件簿煌,若具有I2C總線的硬件接口氮唯,則很容易檢測(cè)到起始和終止信號(hào)。
接收器件收到一個(gè)完整的數(shù)據(jù)字節(jié)后姨伟,有可能需要完成一些其它工作惩琉,如處理內(nèi)部中斷服務(wù)等,可能無(wú)法立刻接收下一個(gè)字節(jié)夺荒,這時(shí)接收器件可以將SCL線拉成低電平瞒渠,從而使主機(jī)處于等待狀態(tài)。直到接收器件準(zhǔn)備好接收下一個(gè)字節(jié)時(shí)技扼,再釋放SCL線使之為高電平伍玖,從而使數(shù)據(jù)傳送可以繼續(xù)進(jìn)行。
由于某種原因從機(jī)不對(duì)主機(jī)尋址信號(hào)應(yīng)答時(shí)(如從機(jī)正在進(jìn)行實(shí)時(shí)性的處理工作而無(wú)法接收總線上的數(shù)據(jù))淮摔,它必須將數(shù)據(jù)線置于高電平私沮,而由主機(jī)產(chǎn)生一個(gè)終止信號(hào)以結(jié)束總線的數(shù)據(jù)傳送始赎。
如果從機(jī)對(duì)主機(jī)進(jìn)行了應(yīng)答和橙,但在數(shù)據(jù)傳送一段時(shí)間后無(wú)法繼續(xù)接收更多的數(shù)據(jù)時(shí),從機(jī)可以通過(guò)對(duì)無(wú)法接收的第一個(gè)數(shù)據(jù)字節(jié)的“非應(yīng)答”通知主機(jī)造垛,主機(jī)則應(yīng)發(fā)出終止信號(hào)以結(jié)束數(shù)據(jù)的繼續(xù)傳送魔招。
當(dāng)主機(jī)接收數(shù)據(jù)時(shí),它收到最后一個(gè)數(shù)據(jù)字節(jié)后五辽,必須向從機(jī)發(fā)出一個(gè)結(jié)束傳送的信號(hào)办斑。這個(gè)信號(hào)是由對(duì)從機(jī)的“非應(yīng)答”來(lái)實(shí)現(xiàn)的。然后杆逗,從機(jī)釋放SDA線乡翅,以允許主機(jī)產(chǎn)生終止信號(hào)。
I2C 數(shù)據(jù)幀格式
I2C總線上傳送的數(shù)據(jù)信號(hào)是廣義的罪郊,既包括地址信號(hào)蠕蚜,又包括真正的數(shù)據(jù)信號(hào)。
在起始信號(hào)后必須傳送一個(gè)從機(jī)的地址(7位)悔橄,第8位是數(shù)據(jù)的傳送方向位(R/T)靶累,用“0”表示主機(jī)發(fā)送數(shù)據(jù)(T)腺毫,“1”表示主機(jī)接收數(shù)據(jù)(R)。每次數(shù)據(jù)傳送總是由主機(jī)產(chǎn)生的終止信號(hào)結(jié)束挣柬。但是潮酒,若主機(jī)希望繼續(xù)占用總線進(jìn)行新的數(shù)據(jù)傳送,則可以不產(chǎn)生終止信號(hào)邪蛔,馬上再次發(fā)出起始信號(hào)對(duì)另一從機(jī)進(jìn)行尋址急黎。
在總線的一次數(shù)據(jù)傳送過(guò)程中,可以有以下幾種組合方式:
a侧到、主機(jī)向從機(jī)發(fā)送數(shù)據(jù)叁熔,數(shù)據(jù)傳送方向在整個(gè)傳送過(guò)程中不變
注:有陰影部分表示數(shù)據(jù)由主機(jī)向從機(jī)傳送,無(wú)陰影部分則表示數(shù)據(jù)由從機(jī)向主機(jī)傳送床牧。
A表示應(yīng)答荣回, A非表示非應(yīng)答(高電平)。S表示起始信號(hào)戈咳,P表示終止信號(hào)心软。
b、主機(jī)在第一個(gè)字節(jié)后著蛙,立即從從機(jī)讀數(shù)據(jù)
c删铃、在傳送過(guò)程中,當(dāng)需要改變傳送方向時(shí)踏堡,起始信號(hào)和從機(jī)地址都被重復(fù)產(chǎn)生一次猎唁,但兩次讀/寫方向位正好反相。
I2C總線尋址
I2C總線協(xié)議有明確的規(guī)定:采用7位的尋址字節(jié)(尋址字節(jié)是起始信號(hào)后的第一個(gè)字節(jié))顷蟆。
(1)尋址字節(jié)的位定義
D7~D1位組成從機(jī)的地址诫隅。D0位是數(shù)據(jù)傳送方向位,為“0”時(shí)表示主機(jī)向從機(jī)寫數(shù)據(jù)帐偎,為“1”時(shí)表示主機(jī)由從機(jī)讀數(shù)據(jù)逐纬。
主機(jī)發(fā)送地址時(shí),總線上的每個(gè)從機(jī)都將這7位地址碼與自己的地址進(jìn)行比較削樊,如果相同豁生,則認(rèn)為自己正被主機(jī)尋址,根據(jù)R/T位將自己確定為發(fā)送器或接收器漫贞。
從機(jī)的地址由固定部分和可編程部分組成甸箱。在一個(gè)系統(tǒng)中可能希望接入多個(gè)相同的從機(jī),從機(jī)地址中可編程部分決定了可接入總線該類器件的最大數(shù)目迅脐。如一個(gè)從機(jī)的7位尋址位有4位是固定位芍殖,3位是可編程位,這時(shí)僅能尋址8個(gè)同樣的器件仪际,即可以有8個(gè)同樣的器件接入到該I2C總線系統(tǒng)中围小。
典型信號(hào)模擬
為了保證數(shù)據(jù)傳送的可靠性昵骤,標(biāo)準(zhǔn)的I2C總線的數(shù)據(jù)傳送有嚴(yán)格的時(shí)序要求。I2C總線的起始信號(hào)肯适、終止信號(hào)变秦、發(fā)送“0”及發(fā)送“1”的模擬時(shí)序 :
(1)起始信號(hào)
Void I2CStart(void)
{ SDA = 1;
SomeNop( );
SCL = 1;
SomeNop( );
SDA = 0;
SomeNop( );
}
(2)終止信號(hào)
void I2cStop(void)
{
SDA = 0;
SomeNop( );
SCL = 1;
SomeNop( );
SDA = 1;
SomeNop( );
}
與EEPROM通信過(guò)程
寫入過(guò)程:
AT24C系列E2PROM芯片地址的固定部分為1010,A2框舔、A1蹦玫、A0引腳接高、低電平后得到確定的3位編碼刘绣。形成的7位編碼即為該器件的地址碼樱溉。
單片機(jī)進(jìn)行寫操作時(shí),首先發(fā)送該器件的7位地址碼和寫方向位“0”(共8位纬凤,即一個(gè)字節(jié))福贞,發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后停士,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為相應(yīng)挖帘,單片機(jī)收到應(yīng)答后就可以傳送數(shù)據(jù)了。
傳送數(shù)據(jù)時(shí)恋技,單片機(jī)首先發(fā)送一個(gè)字節(jié)的地址作為寫入器件的存儲(chǔ)區(qū)的首地址拇舀,收到存儲(chǔ)器器件的應(yīng)答后,單片機(jī)就逐個(gè)發(fā)送各數(shù)據(jù)字節(jié)蜻底,但每發(fā)送一個(gè)字節(jié)后都要等待應(yīng)答骄崩。
AT24C系列器件片內(nèi)地址在接收到每一個(gè)數(shù)據(jù)字節(jié)地址后自動(dòng)加1,在芯片的“一次裝載字節(jié)數(shù)”(不同芯片字節(jié)數(shù)不同)限度內(nèi)薄辅,只需輸入首地址要拂。裝載字節(jié)數(shù)超過(guò)芯片的“一次裝載字節(jié)數(shù)”時(shí),數(shù)據(jù)地址將“上卷”长搀,前面的數(shù)據(jù)將被覆蓋宇弛。
當(dāng)要寫入的數(shù)據(jù)傳送完后鸡典,單片機(jī)應(yīng)發(fā)出終止信號(hào)以結(jié)束寫入操作源请。寫入n個(gè)字節(jié)的數(shù)據(jù)格式 :
讀出過(guò)程
單片機(jī)先發(fā)送該器件的7位地址碼和寫方向位“0”(“偽寫”),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)彻况。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后谁尸,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為回應(yīng)。
然后纽甘,再發(fā)一個(gè)字節(jié)的要讀出器件的存儲(chǔ)區(qū)的首地址良蛮,收到應(yīng)答后,單片機(jī)要重復(fù)一次起始信號(hào)并發(fā)出器件地址和讀方向位(“1”)悍赢,收到器件應(yīng)答后就可以讀出數(shù)據(jù)字節(jié)决瞳,每讀出一個(gè)字節(jié)货徙,單片機(jī)都要回復(fù)應(yīng)答信號(hào)。當(dāng)最后一個(gè)字節(jié)數(shù)據(jù)讀完后皮胡,單片機(jī)應(yīng)返回以“非應(yīng)答”(高電平)痴颊,并發(fā)出終止信號(hào)以結(jié)束讀出操作。
數(shù)據(jù)的寫操作:圖中演示了I2C連續(xù)寫數(shù)據(jù),兩個(gè)字節(jié)的連續(xù)寫入,更多字節(jié)同樣
數(shù)據(jù)的讀操作:在上圖中屡贺,可以認(rèn)為寫入了設(shè)備地址及寄存器地址蠢棱,再次重啟總線后,發(fā)送讀命令甩栈,連續(xù)讀取兩個(gè)字節(jié)泻仙,發(fā)送NACK,發(fā)送停止信號(hào);