i2c信號的ACK與NACK

 http://blog.csdn.net/luckywang1103/article/details/17549739


我們平時在調試I2C的時候可能很少去關注NACK信號,只知道如果Master發送數據,MSB先發,LSB後發,連續發送一個字節(8個bit),之後Slave會回覆一個ACK信號,但是有時I2C slave可能會發出NACK信號,下面讓我們來看看NACK信號存在的情況。

1、從spec下摘取一段:


2、翻譯:

        每個字節後會跟隨一個ACK信號。ACK bit使得接收者通知發送者已經成功接收數據並準備接收下一個數據。所有的時鐘脈衝包括ACK信號對應的時鐘脈衝都是由master產生的。

        ACK信號:發送者在ACK時鐘脈衝期間釋放SDA線,接收者可以將SDA拉低並在時鐘信號爲高時保持低電平。

        NACK信號:當在第9個時鐘脈衝的時候SDA線保持高電平,就被定義爲NACK信號。Master要麼產生STOP條件來放棄這次傳輸,或者重複START條件來發起一個新的開始。


3、實例:

可以看到如下波形,Master發送01101100(0x6c,MSB先發),在第9個時鐘的時候SDA爲高電平,表示Slave發送了NACK信號,之後整個I2C通信就結束了。這是一次失敗的I2C通信,原因可能是I2C設備那邊出的問題,或者訪問I2C設備的地址與I2C設備實際的地址不對應,導致沒接收到Master的數據從而返回NACK。


下面我拿一個OV8825 Sensor的I2C來說明,

OV8825的Slave Write Address爲0x6c,OV8825的ID register Address爲0x300a,0x300b,ID register裏面存的Value是0x88,0x25

正常的I2C波形如下:

1)設定I2C寫的地址:01101100(0x6c)  00110000(0x30) 00001010(0x0a)

Slave Write Address:0x6c,ID register address:0x300a


2)設定I2C讀的地址:01101101(0x6d)  10001000(0x88)

Slave Read Address:0x6d,ID register value:0x88


20150716看到這裏有點奇怪,i2c write是以ack+stop結束通信,而i2c read是以nack+stop結束通信的,原因如下:

i2c write的時候,master在寫完最後一個字節之後slave會回ACK,然後master發送stop信號結束通信

i2c read的時候,master在接收完slave發送的最後一個字節之後會回NAK,因爲這個時候master已經接收到足夠的字節,NAK告訴slave不要在發送數據了。


3)設定I2C寫的地址:01101100(0x6c)  00110000(0x30) 00001011(0x0b)

Slave Write Address:0x6c,ID register address:0x300b


4)設定I2C讀的地址:01101101(0x6d)  00100101(0x25)

Slave Read Address:0x6d,ID register value:0x25

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章