天天看點

再探索IIC應答信号和非應答信号

1,SCL一直由Master控制,SDA依照資料傳送的方向,讀資料時由Slave控制SDA,寫資料時由Master控制SDA。當8位資料傳送完畢之後,應答位或者否應答位的SDA控制權與資料位傳送時相反。

2,開始位“Start”和停止位“Stop”,隻能由Master來發出。

3,位址的8位傳送完畢後,成功配置位址的Slave裝置必須發送“ACK”。否則否則一定時間之後Master視為逾時,将放棄資料傳送,發送“Stop”。

**4,當寫資料的時候,Master每發送完8個資料位,Slave裝置如果還有空間接受下一個位元組應該回答“ACK”,Slave裝置如果沒有空間接受更多的位元組應該回答“NACK”,Master當收到“NACK”或者一定時間之後沒收到任何資料将視為逾時,此時Master放棄資料傳送,發送“Stop”。

5,當讀資料的時候,Slave裝置每發送完8個資料位,如果Master希望繼續讀下一個位元組,Master應該回答“ACK”以提示Slave準備下一個資料,如果Master不希望讀取更多位元組,Master應該回答“NACK”以提示Slave裝置準備接收Stop信号。**

6,當Master速度過快Slave端來不及處理時,Slave裝置可以拉低SCL不放(SCL=0将發生“線與”)以阻止Master發送更多的資料。此時Master将視情況減慢或結束資料傳送。

在實際應用中,并沒有強制規定資料接收方必須對于發送的8位資料做出回應,尤其是在Master和Slave端都是用GPIO軟體模拟的方法來實作的情況下,程式設計者可以事先約定資料傳送的長度,slave不檢查NACK,有時可以起到減少系統開銷的效果。但是如果slave方是硬體i2c要求一定要标準的NACK,master方是GPIO軟體模拟i2c并沒有正确的發送NACK,就會出現“slave收不到stop”導緻i2c挂死。

在此我隻發表對I2C确認信号(即所謂應答信号)的看法,至于它的一整套時序就不多羅嗦了。

1) MASTER向SLAVE發送資料:

MASTER沒向SLAVE端發送8位資料後,就會将SDA置1,等待SLAVE端的确認;SLAVE端如果正确接受到資料,就會自動将SDA置0。我們程式員所能做的隻能是檢測确認信号,即每發送完8位資料後就檢測一次SDA的狀态,如果是0,則讓程式繼續往下執行,如果是1則強迫MASTER将剛才的8位資料再發送一遍;當然,如果SDA一直是1,也就是SLAVE一直未能正确接受到資料,我們也不能一直讓MASTER反複發送,要做TIMEOUT處理,以防系統當機!

2) MASTER從SLAVE讀取資料:

MASTER從SLAVE端讀取資料,情況與發送資料有所差別,在讀到最後8位資料時,要将SDA置1,也就是做UNACK動作,讓系統知道讀取資料到此結束;這個置1動作由程式員來做,而不是MASTER本身,因為資料讀到哪裡結束,隻有我們程式員知道!

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