【esp32 專案】使用I2C第一篇——I2C的科普

FBshark發表於2024-06-10

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僅用兩條線在裝置間通訊:

image.png

SCL -- 時鐘訊號

SDA -- 資料訊號

I2C主機與從機之間共享時鐘訊號,時鐘始終由主機控制,匯流排下面可以掛多個裝置,是一種同步,多主,多從,半雙工的通訊協議,下面我們簡單介紹一下通訊原理:

image.png

預設情況下,兩條線都被上拉,SCL=1,SDA=1。

啟動與停止訊號:

通訊開始,要先發開啟動訊號,結束的時候,要傳送結束訊號。

開始訊號由主裝置發出啟動,具體為在SCL高電平期間,SDA從高電平切換到低電平;

停止訊號由主裝置發出結束,具體為在SCL高電平期間,SDA從低電平切換到高電平;

image.png

當然,在傳輸過程中,有時候需要更改資料方向,重新傳輸等,我們沒必要發停止訊號,直接重新發啟動訊號啟動即可。

image.png

地址位元組

我們的匯流排上可能掛很多從裝置,在我們主裝置傳送了啟動訊號之後,匯流排上的從裝置就都被“喚醒”了,等著主裝置傳送地址寵幸。所以這裡有一個從機地址的概念,從機地址以8位位元組傳送的,MSB在前,最後一位表示接下來讀或寫,所以高7位構成了從機地址,也可以看出,同一個匯流排上,可以定址128個從裝置。

一旦從裝置的地址匹配,就繼續讀取最後一位,低電平代表寫入,高電平代表讀取。其它從裝置就忽略後面的資料。

ACK與NACK

在每個位元組傳輸之後,接收裝置傳送一個應答訊號,確認或者不確認,接收裝置透過在SCL高電平期間,將SDA拉低生成一個確認訊號ACK,拉高生成一個不確認訊號NACK,這裡ACK主要用於表示位元組正確傳輸了,NACK表示資料傳輸有錯誤,需要從新傳送。應答訊號主裝置,從裝置都可以產生,比如,主裝置從從裝置讀取最後一個位元組的資料後,就要傳送NACK結束傳輸。

image.png

資料訊號

資料以8位位元組格式傳輸,高位元組在前,傳輸的位元組數量沒有限制,但是每個位元組後面必須要有一個資料接收方產生的應答訊號。傳輸過程中,SCL為低的時候,SDA資料可以改變,SCL為高的時候,SDA的資料必須穩定。

image.png

命令位元組

當寫入或讀取從裝置中特定暫存器時,主機首先要向已定址的從機寫入暫存器地址,其實也是一個資料位元組,我們這裡稱之為命令位元組。

寫入裝置

主裝置在發出啟動訊號之後,緊著著傳送要操作從裝置的地址,最後一位為低電平表示接下來寫入資料,然後在時鐘訊號下一位一位的寫入資料,在從裝置發出ACK應答之後,傳送結束訊號結束通訊。

image.png

讀取資料

主裝置在發出啟動訊號之後,緊著著傳送要操作從裝置的地址,最後一位為高電平表示接下來讀取資料,然後接管SDA資料線並在時鐘的控制下向主裝置傳送資料,主裝置同樣要在每個位元組接收完畢的時候傳送ACK響應,當主裝置不想接收的時候,就在最後一個位元組接收後傳送NACK響應,然後恢復對匯流排的控制併傳送結束訊號。

SCL的控制權始終在主機這裡。

image.png

當然,實際還要很多組合傳輸協議,這裡由於篇幅問題就不展開說了,基本上大同小異,我們根據不同裝置的資料手冊來傳輸就可以啦。I2C還有很多特性,快速命令,仲裁,多主控等等,普通的應用接觸不到,感興趣的小夥伴自行研究下。

相關文章