IIC,兩根線(xiàn),SCL時(shí)鐘線(xiàn),SDA數據線(xiàn)。
一個(gè)主機master,一個(gè)或多個(gè)從機slave。
主機通常就是MCU,從機會(huì )有一個(gè)地址,這個(gè)地址通常前4位是器件本身固定的,5-7位可以硬件選擇,最后一位通常是WP位,一般此位低電平表示正常讀寫(xiě),此位高電平表示讀保護,只能讀。如常用的EEPROM 24C02,地址高四位是1010,5-7位硬件連接決定,即是將其A0-A2引腳接地為000,這樣設備地址是0xA0或者0xA1(讀)。
IIC的指令:
默認下(無(wú)數據傳輸):SCL=1,SDA=1;
Start:當SCL=1時(shí),SDA由1向0跳變;
Stop:當SCL=1時(shí),SDA由0向1跳變;
數據位:當SCL由0向1跳變時(shí),由發(fā)送方控制SDA,此時(shí)SDA為有效數據,不可改變SDA;當SCL保持為0時(shí),SDA上的數據可改變。也就是說(shuō),不管是主機發(fā)從機,還是從機發(fā)主機,只要想發(fā)送或者讀取數據,必須有一個(gè)scl上升的過(guò)程,此時(shí)SDA數據有效,數據來(lái)自于發(fā)送方。
地址位:定義同數據位,但只由Master發(fā)給Slave;
應答位(ACK):發(fā)送SDA=0,可以是主機主動(dòng)發(fā)送,也可以是從機發(fā)送主機接收。
否應答位(NACK):發(fā)送SDA=1,可以是主機主動(dòng)發(fā)送,也可以是從機發(fā)送主機接收。
注意:
1,SCL一直由Master控制。
2,Start和Stop,只能由Master發(fā)出。
3,地址的8位傳送完畢后,成功配置地址的Slave設備必須發(fā)送“ACK”。否則否則一定時(shí)間之后Master視為超時(shí),將放棄數據傳送,發(fā)送“Stop”。
4,當寫(xiě)數據的時(shí)候,Master每發(fā)送完8個(gè)數據位,Slave設備如果還有空間接受下一個(gè)字節應該回答“ACK”,Slave設備如果沒(méi)有空間接受更多的字節應該回答“NACK”,Master當收到“NACK”或者一定時(shí)間之后沒(méi)收到任何數據將視為超時(shí),此時(shí)Master放棄數據傳送,發(fā)送“Stop”。
5,當讀數據的時(shí)候,Slave設備每發(fā)送完8個(gè)數據位,如果Master希望繼續讀下一個(gè)字節,Master應該回答“ACK”以提示Slave準備下一個(gè)數據,如果Master不希望讀取更多字節,Master應該回答“NACK”以提示Slave設備準備接收Stop信號。
6,當Master速度過(guò)快Slave端來(lái)不及處理時(shí),Slave設備可以拉低SCL不放(SCL=0將發(fā)生“線(xiàn)與”)以阻止Master發(fā)送更多的數據。此時(shí)Master將視情況減慢或結束數據傳送。
在實(shí)際應用中,并沒(méi)有強制規定數據接收方必須對于發(fā)送的8位數據做出回應,尤其是在Master和Slave端都是用GPIO軟件模擬的方法來(lái)實(shí)現的情況下,編程者可以事先約定數據傳送的長(cháng)度,slave不檢查NACK,有時(shí)可以起到減少系統開(kāi)銷(xiāo)的效果。但是如果slave方是硬件i2c要求一定要標準的NACK,master方是GPIO軟件模擬i2c并沒(méi)有正確的發(fā)送NACK,就會(huì )出現“slave收不到stop”導致i2c掛死。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。