在談IIC前,我們先將IIC的通信分為三步,準備、通信、結束階段
1. 通信準備IIC通信至少要兩條通道,一條時鐘線SCL,一條數據線SDA,而這兩條線可以連接很多的設備。雖然IIC連接著很多的設備,但是在IIC沒有與各個設備通信時,IIC均處于休眠狀態,這時候就需要通過主機來喚醒設備了。 我們首先看時序圖,怎么開始IIC的動作,及怎么結束II: 然后再看代碼(somenop()為延時函數,延時時間主要是看單片的時鐘周期,我所使用的單片機芯片是IAP15F2K6102) void somenop(void) { uchar t; _nop_(); _nop_(); t = 12; while(--t); }
void IIC_Start(void) { SDA = 1;SCL = 1; somenop(); SDA = 0; somenop(); SCL = 0; }
void IIC_Stop(void) { SDA = 0; SCL = 1; somenop(); SDA = 1; somenop(); }
當我們啟動IIC后,下一步就是尋找設備了,于是我們發送一個地址,像PCF8591,喚醒它的地址就是0x90(二進制數1001 0000),喚醒AT24C02的地址則是0xa0(二進制數1010 0000)這時候需要設備給一個響應來說明設備收到消息了,然后由單片機接受即可,所以設備與單片機達成通信的條件了,然后兩邊建立了通信通道后,單片機就開始選用所需設備的功能端口地址了。 如:選擇PCF8591的A0、A1、A2、A3通道的話,就可以分別發送0x00、0x01、0x10、0x11;選擇AT24C02的A0、A1、A2通道的話,就可以分別發送對應地址(因為AT24C02還帶有讀/寫地址,該地址是在最后一位,這里就不詳細談了)。 在IIC開始,選擇設備地址以及,選擇使用那個通道以及選擇讀數據還是寫數據后,通信準備階段完成。
2. 開始通信首先我們要知道IIC是半雙工通信,同一時刻只有一個設備發送數據個另一個設備,兩個設備開始通信時,主機一直控制SCL時鐘線并由它來產生出時鐘信號(也就是脈沖信號),然后,兩設備通過SDA線發送數據來互相通信。 當主機接受從機數據時(也就是主機讀取從機數據),時鐘信號的電平為低的時間內,從機通過數據線發出高低電平的信號;當時鐘信號為高電平期時,主機讀取讀取信號,此時數據線的電平不能改變。發送八位數據后,主機會收到從機的應答,也就是第九個脈沖的時候是應答時間,從機將SDA數據線置為低電平,此時被主機檢測到。于是一個數據就傳輸成功了,主機收到的數據是一個二進制,數據如果為00101101,轉換十六進制是0x2D,然后多做幾個這樣的步驟,數據就讀取到了。 同理從機接受主機的數據時(主機寫數據給從機),時鐘信號還是主機產生的,然后數據是由從機發給主機,發送8位數據后,主機發給從機應答信號,此時一個數據也就成功發送了。
3. 結束通信主機再數據發送完后(即應答時間內)給從機一個非應答信號(主機將SDA電平拉高)后解釋IIC,這時候IIC通信告一段落了,最后也就完成了一次通信,數據傳輸進行完畢。
4. 注意點
IIC開始、結束及SCL的時鐘周期是必須合適的,一般都大于5us就可以了(這個時間也可能和設備有關)。時間太短會導致數據傳輸有問題,或者從機來不急應答;時間太長的話……可能數據傳輸太慢吧(知識盲區了)。
以上就是我對IIC的理解了,這也僅僅是我個人的理解,避免不了錯誤之處,也希望諸位指正。(2020年7月30日寫)
|