通訊專欄 二 I2C通訊(上篇)STM32微控制器

2021-10-02 08:41:19 字數 3394 閱讀 5314

/通俗易懂,看這篇就夠了!

本文使用stm32fi03rct6型號的微控制器, 基於正點原子的函式庫進行總結講解

想來微控制器這塊兒除了usart串列埠通訊外,常見的便是i2c通訊了,因為i2c通訊 硬體連線簡單,可擴充套件性強,但是這種硬體連線的簡潔,是以協議的複雜來彌補的。i2c通訊是一種半雙工通訊,也就是可以雙向傳輸資料但不能同時進行。

stm32微控制器是可以進行硬體i2c通訊或者軟體模擬進行i2c通訊的,硬體i2c通訊只需要對i2c引腳以及通訊模式這兩個結構體進行初始化即可,但i2c硬體通訊由於硬體原因並不穩定(原子哥說的),不過在stm32f4系列有所改善,但我都沒試過(寒假在家手頭硬體條件不足)。

下面我們基於軟體i2c模擬進行說明。

1:二線傳輸:i2c通訊除了地線gnd和電源線vcc外,只需要兩條線,一條雙向序列資料線(sda),一條時鐘線(scl)。

2:無中心主機:可以多個裝置併聯到匯流排上,每乙個裝置都可以做為主機(或者從機)來傳送,接受裝置。但每一時刻只能有乙個主機。

3:軟體定址:匯流排上的每乙個裝置都有乙個唯一位址供識別,位址可以是7位或10位。

以stm32作為主裝置傳送資料為例:

步1:主機產生傳輸啟示訊號s,併聯在匯流排上的所有裝置都可以接收到

步3:主機開始向從裝置傳送資料,資料被拆分為資料報傳送,每個資料報大小為8位(也就是乙個位元組乙個位元組的打包傳送),從裝置每接收到乙個位元組,便返回乙個應答訊號,主機再繼續傳送。

步4:如此傳輸n個資料後,主裝置傳送停止訊號,資料傳輸停止

當主機讀資料時:

主機廣播完位址,接收到應答訊號後,從機開始向主機返回資料報,大小也為8位。從機每傳送乙個包,等待主機的應答訊號。如此反**送n個位元組後,當主機想要停止接收資料時,便向從機返回乙個非應答訊號,則從機停止資料傳送。

到此我們了解了i2c通訊的基本過程,但正點原子並沒有直接操縱這些過程的庫函式,所以我們需要需要更接近底層一步的時序問題;

1:空閒狀態

匯流排的sda和scl兩條訊號線同時處於高電平時,規定為匯流排的空閒狀態。空閒狀態就是沒有資料傳輸的狀態啦。我們需要在每次資料傳輸之前將匯流排置為空閒狀態

**如下圖:

圖中**為iic初始化**,先開啟時鐘,再設定引腳pc11,pc12模式。最後紅框內為將時鐘線scl和資料線sda均置高,即初始化為空閒狀態。

2:起始訊號與停止訊號

在上面的iic通訊流程分析中,我們在通訊開始時要由主機先發乙個起始訊號start,停止時要發乙個停止訊號stop:

時序圖如下:

st32的**實現:

在上面兩圖開頭的sda_out()為巨集定義;含義如下圖:

3:應答訊號

主機每接收到乙個資料報,都需要給從機返回乙個應答訊號a,應答訊號為低電平時,規定為有效應答位(ack簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(nack),一般表示接收器接收該位元組沒有成功。

但這只是在過程上是如此,在時序上是如何進行的呢?我們知道每乙個資料報都是八位,所以傳輸乙個資料報在佔據資料線sda的同時,遵循時鐘線scl的脈衝時序(也就是乙個脈衝傳送一位,傳輸乙個包需要占用8個時鐘脈衝訊號),而我們便在第九個時鐘脈衝訊號時釋放資料線sda(也就是拉低),然後空閒出來傳送應答訊號a。

不過我們只需要控制在該傳送應答訊號的第九個脈衝時序就可以了。

下面我們看**:

上圖是stm32做為主機傳送資料等待從機的應答訊號。

當stm32需要做出應答或者非應答訊號時,便比較簡單了:

在熟悉了上述過程以後,我們便可以進行寫乙個過程層面的函式,進行傳送一整個位元組或者接收一整個位元組了(當然,是原子哥寫的):

據此我們便將i2c軟體模擬的一些基本操作說完了,硬體i2c便是將上述這些我們手寫的**(原子哥手寫的)作為硬體封裝起來,我們只需要配置i2c模式結構體就可以了,就是下面這個結構體(注意啊,這個結構體是使用硬體i2c時使用的,別搞混了):

1:i2c_clockspeed設定的是i2c的傳輸速率

2:i2c_mode設定的是i2c的使用模式,有i2c模式(i2c_mode_i2c)和smbus模式(i2c_mode_smbusdevice,i2c_mode_smbushost)。

3:i2c_dutycycle設定的是i2c的時鐘線的占空比,可以設定高電平與時間之比為16:9(i2c_dutycycle_16_9)或者2:1(i2c_dutycycle_2)。

4:i2c_ownaddress1設定的為stm32自己的i2c裝置位址,每個連線在i2c匯流排上的裝置都有乙個自己的位址,作為主機也不例外。該位址可以自行設定,可以選擇7位或者10位。

5:i2c_ack設定的位i2c的應答,若為i2c_ack_enable,則允許應答;若為i2c_ack_disable,則不許應答。往往設為允許應答。

到此我們對於i2c通訊的理論知識應該有了大概的了解了,但這遠遠不夠,因為我們要對乙個外部裝置(從機)進行讀寫操作,還需要了解:

這些內容我們在**「stm32微控制器/i2c通訊(下篇)」**進行介紹。

I2C通訊技術

對於嵌入式開發的朋友來說,i2c協議實在是再熟悉不過了,有太多的器件,採用的都是通過i2c來進行相應的設定。今天,我們就隨便聊聊這個i2c協議。i2c協議中最重要的一點是i2c位址。這個位址有7位和10位兩種形式。7位能夠表示127個位址,而在實際使用中基本上不會掛載如此多的設定,所以很多裝置的位址...

I2C匯流排通訊

uart 屬於非同步通訊,比如電腦傳送給微控制器,電腦只負責把資料通過txd 傳送出來即可,接收資料是微控制器自己的事情。而 i2c 屬於同步通訊,scl 時鐘線負責收發雙方的時鐘節拍,sda 資料線負責傳輸資料。i2c 的傳送方和接收方都以 scl 這個時鐘節拍為基準進行資料的傳送和接收。i2c匯...

低速通訊介面(二)I2C

i2c引腳定義 都是雙向i o線,介面電路為開漏輸出,需通過上拉電阻接電源。當匯流排空閒時,兩根線都是高電平,連到匯流排上的任一器件輸出的低電平,都將使匯流排的訊號變低。起始訊號與終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電...