<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 關(guān)于I2C的總結

關(guān)于I2C的總結

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
這兩天在看I2C,為了加深印象,把我遇到的一些問(wèn)題寫(xiě)出來(lái)吧。

本文引用地址:http://dyxdggzs.com/article/201611/322145.htm

1——————

最先遇到的問(wèn)題是AT24C02的操作時(shí)序,AT24C02內部有一個(gè)指針,指向儲存空間的某一個(gè)字節,另外AT24C系列支持頁(yè)操作,對于A(yíng)T24C02一個(gè)頁(yè)是8字節,也就是說(shuō)地址的高5位是頁(yè)地址,在同一次寫(xiě)入中,頁(yè)地址不變,低3位地址一次增加,當增加到7之后再加1就變成0了,而由于頁(yè)地址不變,相當于指針回到了頁(yè)首,如果繼續寫(xiě)那前面的內容會(huì )被覆蓋。寫(xiě)數據的時(shí)序,先是I2C的開(kāi)始信號,發(fā)送設備地址,之后寫(xiě)入希望寫(xiě)入的數據地址,然后依次寫(xiě)入數據。當然,可以只寫(xiě)一個(gè)字節的數據。

對于讀取,是不存在頁(yè)的概念的,時(shí)序是先發(fā)送啟動(dòng)信號,然后發(fā)送設備地址(注意,是寫(xiě)設備的時(shí)候的地址,也就是說(shuō)最低位是1),接著(zhù)發(fā)送數據地址,完了之后重新發(fā)送一次啟動(dòng)信號,接著(zhù)就可以讀取了,讀取完一個(gè)字節的數據后要發(fā)送一個(gè)ACK,對于最后一個(gè)字節的數據要發(fā)送一個(gè)NACK來(lái)告訴AT24C數據已經(jīng)接收完畢,之后發(fā)送結束信號斷開(kāi)連接即可。也可以只接收一個(gè)數據,這時(shí)候一個(gè)ACK都沒(méi)有,第一次接收好直接發(fā)送一個(gè)NACK。

24C02的內部有連續的子地址空間,對這些空間進(jìn)行n個(gè)字節的連續讀/寫(xiě)時(shí),都具有地址自動(dòng)加1功能。只要設定好要讀/寫(xiě)的器件內起始子地址及字節數,就能完成整個(gè)操作。
注意:對于24C02連續寫(xiě)的字節數不應超過(guò)頁(yè)容量8,一次連續寫(xiě)所形成的總線(xiàn)傳送結束后(主機發(fā)出停止信號后),24C02執行內部擦寫(xiě)過(guò)程,大約需要10ms左右,24C02不再應答主器件的任何請求。
24C02內有一個(gè)8位的地址計數器,連續讀操作時(shí),24C02每次輸出一個(gè)數據字節后,地址計數器自動(dòng)加1,當地址計數器加到255,并輸出一個(gè)字節數據后,地址計數器將翻轉到0,并繼續輸出數據字節,這樣整個(gè)存儲區域可以在一個(gè)讀操作內全部讀完。

#define SLAW 0xA0
uchar delay(uchar j)
{ uchar k,l;
for(l=0;l<=j;l++)
for(k=0;k<=250;k++);
return 0;
}
void main()
{
uchar sbuf[5]={0x00,0x12,0x55,0x30,0x12};
uchar rbuf[5];
I2C_SendStr(SLAW,0x10,tbuf,0x5);

delay(100);
I2C_RcvStr(SLAW,0x10,rbuf,0x5);

while(1);
}
}

2——————

在次我只發(fā)表對I2C確認信號的看法,至于它的一整套時(shí)序就不多羅嗦了。

1)MASTER向SLAVE發(fā)送數據:
MASTER沒(méi)向SLAVE端發(fā)送8位數據后,就會(huì )將SDA置1,等待SLAVE端的確認;SLAVE端如果正確接受到數據,就會(huì )自動(dòng)將SDA置0。我們程序員所能做的只能是檢測確認信號,即每發(fā)送完8位數據后就檢測一次SDA的狀態(tài),如果是0,則讓程序繼續往下執行,如果是1則強迫MASTER將剛才的8位數據再發(fā)送一遍;當然,如果SDA一直是1,也就是SLAVE一直未能正確接受到數據,我們也不能一直讓MASTER反復發(fā)送,要做TIMEOUT處理,以防系統死機!

2) MASTER從SLAVE讀取數據:
MASTER從SLAVE端讀取數據,情況與發(fā)送數據有所區別,在讀到最后8位數據時(shí),要將SDA置1,也就是做UNACK動(dòng)作,讓系統知道讀取數據到此結束;這個(gè)置1動(dòng)作由程序員來(lái)做,而不是MASTER本身,因為數據讀到哪里結束,只有我們程序員知道!

3) 說(shuō)明:MASTER 指主控制端,在一般系統中就是我們常說(shuō)的單片機了;SLAVE是指具備I2C協(xié)議的專(zhuān)用IC,比如ATMEL的24系列(24C16、14C32等)和PHILPS的SAA711X系列(VIDEO DECODER)。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>