https://www.eepw.com.cn/zhuanlan/315431.html
天我們來玩兒I2C。
I2C概述
I2C全稱是Inter-Integrated Circuit,是飛利浦半導體公司(06年遷移到NXP了)在1982年發明的,是使用非常廣泛的一種通訊協議,很多感測器、儲存晶片、OLED等,都是在使用I2C。標準輸出模式下能達到100kbps的傳輸速率,快速模式下能達到400kbps的傳輸速率,高速模式下能達到3.4Mbps,超高速下最快能達到5Mbps。
與UART一樣,IIC僅用兩條線在裝置間通訊:
SCL -- 時鐘訊號
SDA -- 資料訊號
I2C主機與從機之間共享時鐘訊號,時鐘始終由主機控制,匯流排下面可以掛多個裝置,是一種同步,多主,多從,半雙工的通訊協議,下面我們簡單介紹一下通訊原理:
預設情況下,兩條線都被上拉,SCL=1,SDA=1。
啟動與停止訊號:
通訊開始,要先發開啟動訊號,結束的時候,要傳送結束訊號。
開始訊號由主裝置發出啟動,具體為在SCL高電平期間,SDA從高電平切換到低電平;
停止訊號由主裝置發出結束,具體為在SCL高電平期間,SDA從低電平切換到高電平;
當然,在傳輸過程中,有時候需要更改資料方向,重新傳輸等,我們沒必要發停止訊號,直接重新發啟動訊號啟動即可。
地址位元組
我們的匯流排上可能掛很多從裝置,在我們主裝置傳送了啟動訊號之後,匯流排上的從裝置就都被“喚醒”了,等著主裝置傳送地址寵幸。所以這裡有一個從機地址的概念,從機地址以8位位元組傳送的,MSB在前,最後一位表示接下來讀或寫,所以高7位構成了從機地址,也可以看出,同一個匯流排上,可以定址128個從裝置。
一旦從裝置的地址匹配,就繼續讀取最後一位,低電平代表寫入,高電平代表讀取。其它從裝置就忽略後面的資料。
ACK與NACK
在每個位元組傳輸之後,接收裝置傳送一個應答訊號,確認或者不確認,接收裝置透過在SCL高電平期間,將SDA拉低生成一個確認訊號ACK,拉高生成一個不確認訊號NACK,這裡ACK主要用於表示位元組正確傳輸了,NACK表示資料傳輸有錯誤,需要從新傳送。應答訊號主裝置,從裝置都可以產生,比如,主裝置從從裝置讀取最後一個位元組的資料後,就要傳送NACK結束傳輸。
資料訊號
資料以8位位元組格式傳輸,高位元組在前,傳輸的位元組數量沒有限制,但是每個位元組後面必須要有一個資料接收方產生的應答訊號。傳輸過程中,SCL為低的時候,SDA資料可以改變,SCL為高的時候,SDA的資料必須穩定。
命令位元組
當寫入或讀取從裝置中特定暫存器時,主機首先要向已定址的從機寫入暫存器地址,其實也是一個資料位元組,我們這裡稱之為命令位元組。
寫入裝置
主裝置在發出啟動訊號之後,緊著著傳送要操作從裝置的地址,最後一位為低電平表示接下來寫入資料,然後在時鐘訊號下一位一位的寫入資料,在從裝置發出ACK應答之後,傳送結束訊號結束通訊。
讀取資料
主裝置在發出啟動訊號之後,緊著著傳送要操作從裝置的地址,最後一位為高電平表示接下來讀取資料,然後接管SDA資料線並在時鐘的控制下向主裝置傳送資料,主裝置同樣要在每個位元組接收完畢的時候傳送ACK響應,當主裝置不想接收的時候,就在最後一個位元組接收後傳送NACK響應,然後恢復對匯流排的控制併傳送結束訊號。
SCL的控制權始終在主機這裡。
當然,實際還要很多組合傳輸協議,這裡由於篇幅問題就不展開說了,基本上大同小異,我們根據不同裝置的資料手冊來傳輸就可以啦。I2C還有很多特性,快速命令,仲裁,多主控等等,普通的應用接觸不到,感興趣的小夥伴自行研究下。