IIC總線(xiàn)協(xié)議
處理器和芯片間的通信可以形象的比喻成兩個(gè)人講話(huà):1、你說(shuō)的別人得能聽(tīng)懂:雙方約定信號的協(xié)議。2、你的語(yǔ)速別人得能接受:雙方滿(mǎn)足時(shí)序要求。
本文引用地址:http://dyxdggzs.com/article/201612/329864.htm看IIC協(xié)議先:兩條線(xiàn)可以?huà)於鄠€(gè)設備。IIC設備(稍微有點(diǎn)智能的)里有個(gè)固化的地址。只有在兩條線(xiàn)上傳輸的值等于我(IIC設備)的地址時(shí),我才作出響應。
開(kāi)始信號:處理器讓SCL時(shí)鐘保持高電平,然后讓SDA數據信號由高變低就表示一個(gè)開(kāi)始信號。同時(shí)IIC總線(xiàn)上的設備檢測到這個(gè)開(kāi)始信號它就知道處理器要發(fā)送數據了。
停止信號:處理器讓SCL時(shí)鐘保持高電平,然后讓SDA數據信號由低變高就表示一個(gè)停止信號。同時(shí)IIC總線(xiàn)上的設備檢測到這個(gè)停止信號它就知道處理器已經(jīng)結束了數據傳輸,我們就可以各忙各個(gè)的了,如休眠等。
再看數據怎么傳:SDA上傳輸的數據必須在SCL為高電平期間保持穩定:因為外接IIC設備在SCL為高電平的期間采集數據方知SDA是高或低電平。SDA上的數據只能在SCL為低電平期間翻轉變化。
響應信號(ACK):處理器把數據發(fā)給外接IIC設備,如何知道IIC設備數據已經(jīng)收到呢?就需要外接IIC設備回應一個(gè)信號給處理器。處理器發(fā)完8bit數據后就不再驅動(dòng)總線(xiàn)了(SDA引腳變輸入),而SDA和SDL硬件設計時(shí)都有上拉電阻,所以這時(shí)候SDA變成高電平。那么在第8個(gè)數據位,如果外接IIC設備能收到信號的話(huà)接著(zhù)在第9個(gè)周期把SDA拉低,那么處理器檢測到SDA拉低就能知道外接IIC設備數據已經(jīng)收到。
IIC數據從最高位開(kāi)始傳輸。
再進(jìn)一步說(shuō):IIC總線(xiàn)是允許掛載多個(gè)設備的,如何訪(fǎng)問(wèn)其中一個(gè)設備而不影響其他設備呢?
用7bit表示從地址,那么可以?huà)燧d的從設備數是2的7次方128個(gè)。處理器想寫(xiě)的話(huà):先發(fā)送起始位,再發(fā)一個(gè)8bit數據:前7bit表示從地址,第8bit表示讀或者寫(xiě)。0write是處理器往IIC從設備發(fā),1read是IIC從設備往處理器發(fā)。第9個(gè)時(shí)鐘周期回復響應信號。
下面就以AT24Cxx為例詳細說(shuō)明一下:
首先發(fā)出一個(gè)start信號,從設備地址,R/W(0,寫(xiě)),回應ACK表示有這個(gè)從設備存在。這時(shí)候是處理器從指定的從設備讀數據的從設備里8bit存儲地址的指定。所以這里R/W是0為寫(xiě)。ACK回應有這個(gè)設備的話(huà),處理器把要訪(fǎng)問(wèn)的從設備里的8bit存儲地址寫(xiě)好。ACK對方回應。繼續一個(gè)start信號+從設備地址,最低位是高電平表示讀數據,回應ACK表示有這個(gè)從設備存在。在讀數據的時(shí)候,每發(fā)出一個(gè)時(shí)鐘,處理器會(huì )SDA上的數據存起來(lái)。那么發(fā)出8個(gè)時(shí)鐘后處理器就能得到8位的數據。這時(shí)候若想連續讀就不斷回應ACK信號否則就發(fā)出停止信號。
讀的過(guò)程:start信號,從設備地址,寫(xiě),待讀取存儲地址,再一個(gè)start信號,從設備地址,讀,8個(gè)時(shí)鐘,從設備就把對應的數據反饋給處理器。
start信號,哪一個(gè)設備地址,寫(xiě),緊跟連續兩個(gè)字節的數據:要寫(xiě)的地址,對方收到8bit地址后回應ACK,再8bit數據發(fā)給從設備,對方收到8bit數據后回應ACK,處理器寫(xiě)完后發(fā)送停止信號。
評論