1. 程式人生 > >STM32F10x_硬體I2C主從通訊(輪詢傳送,中斷接收)

STM32F10x_硬體I2C主從通訊(輪詢傳送,中斷接收)

Ⅰ、寫在前面

關注我分享文章的朋友應該知道我在前面講述過(軟體、硬體)I2C主機控制從機EEPROM的例子。在I2C通訊主機控制程式是比較常見的一種,可以說在實際專案中,很多應用都會使用到I2C通訊。但在實際專案中作為I2C從機的應用相對要少的多,本文主要講述關於【STM32F10x_硬體I2C主從通訊】中STM32作為從機的例子。

在學習本問內容之前,如果對I2C協議還不太瞭解的朋友請先去了解一下I2C協議,或看我之前關於I2C通訊的文章(我微信公眾號和部落格都有)。

關於STM32硬體I2C作為從機的文章網上很少(我在寫本文之前也在百度、谷歌等網站上搜索瞭解過),我猜測大概的原因主要是兩點:1.使用該功能的人比較少; 2.說STM32硬體I2C存在BUG。

“使用該功能的人比較少”這個可以理解。其實我不能理解的是,普遍說這個有BUG的現象。我只覺得,你選擇了使用這個晶片來作為開發,你選擇之前應該是認可它的,什麼東西都不可能盡善盡美,一點小的瑕疵,只要可以避免就行。就像Windos系統一樣,偶爾宕機、藍屏,但是你還是依然會選擇使用它。

關於STM32硬體I2C自身BUG也不否認,但官方給出瞭解決的辦法,作為程式設計師,解決一項BUG,也是對自身能力的一種提升。所以,遇到困難,勇於面對才是正確的做法。

例項實驗:

本文提供兩個例項:一個主機發送(硬體I2C輪詢傳送資料)、一個從機接收並列印接收資料(硬體I2C中斷接收資料)。

主機間隔500ms傳送

10位元組,從機接收10位元組檢測到I2C停止,將收到的資料通過串列埠打印出來。【傳送的資料及長度可修改,從機自動檢測停止條件,也就是可以檢測得到主機發送了多少位元組資料】


關於本文的更多詳情請往下看。

Ⅱ、例項工程下載

筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的程式碼,對初學者一看就明白,以簡單明瞭的工程供大家學習。

筆者提供的例項工程都是在板子上經過多次測試並沒有問題才上傳至360雲盤,歡迎下載測試、參照學習。

提供下載的軟體工程是基於KeilMDK-ARMV5版本、STM32F103ZE晶片,但F1其他型號也適用(適用F1其他型號: 關注微信,回覆“修改型號”)。

STM32F10x_硬體I2C主機(傳送資料- 輪詢方式)例項原始碼工程:

STM32F10x_硬體I2C從機(接收資料- 中斷方式)例項原始碼工程:

STM32F1資料:

Ⅲ、關於I2C協議

這裡再次提示一下I2C協議重要的幾點:

1.開始和停止條件

SCL時鐘電平為高

SDA資料線由高 -> 低 為匯流排開始條件

SDA資料線由低 -> 高 為匯流排結束條件

IO模擬I2C時注意:開始之後將SCL變為低電平,防止誤操作SDA使其通訊停止

時序圖


2.資料位傳輸

SCL時鐘電平為低, 可以改換SDA資料線的電平,在SCL上升沿的過程將SDA資料傳送出去。

IO模擬I2C時切記請先將SCL變為低電平,再改變SDA電平狀態

時序圖


3.資料傳輸

I2C 是以位元組(8位)的方式進行傳輸,總線上每傳輸完1位元組之後會有一個應答訊號,主器件(主機)需要產生對應的一個額外時鐘。

傳輸格式:8位資料 + 1位應答

資料傳輸必須帶響應,相關的響應時鐘脈衝由主機產生,在響應的時鐘脈衝期間,傳送器釋放 SDA 線(高)。

在響應的時鐘脈衝期間 接收器必須將 SDA 線拉低,使它在這個時鐘脈衝的高電平期間保持穩定的低電平。

應答位的產生及接收

1.在(主機)寫資料的時候是從機應答(給主機),主機檢測;

2.在(主機)讀資料的時候是主機應答(給從機),從機檢測;

這裡可以藉助I2C讀寫函式一起理解

1.時序圖(主機寫,從機應答,主機讀取應答)


2.時序圖(主機讀,主機產生應答)


更多關於I2C協議的文件可以網上查詢,也可以參看我下面下載連結的文件(周立功翻譯的版本):https://yunpan.cn/cMJxKJzpWFtHE  訪問密碼 82f3

Ⅳ、硬體I2C主機發送資料

硬體I2C主機的配置其實很簡單,和前面讀寫EEPROM的(主機)配置一樣。

這裡就不再描述。主要講述一下主機發送資料這一塊的程式碼。

我封裝的傳送資料函式:

I2C_Master_BufferWrite(uint8_t* pBuffer, uint32_t NumByteToWrite, uint8_t SlaveAddress)

主要就是3個引數:資料BUF、資料長度、從裝置地址


看過我前面主機讀寫EEPEOM程式碼的人應該很清楚,這裡很相似。讀寫EEPROM比這裡多了一個步驟,那就是多了寫資料地址的步驟。

必須要有的三大步驟:

1.開始

2.裝置地址/

3.停止

主程式間隔500ms呼叫一次該函式,傳送一串(我們定義10位元組),從機也是間隔500ms收到一串資料並打印出來。

Ⅴ、硬體I2C從機中斷接收資料

硬體I2C的從機接收資料一般分為三類:中斷接收、DMA接收和輪詢接收

在實際專案中中斷接收DMA接收比較常見,因為不用佔據CPU資源,有資料來了才響應接收【需要CPU具有硬體I2C功能】。

輪詢接收資料很佔用CPU資源,一般是CPU沒有硬體I2C資源,處理的資料不多的情況下。

硬體I2C從機配置I2C這一塊比較簡單,和上面主機類似,請參看原始碼或參考我之前文章的講述。

提醒:配置中注意關於I2C事件中斷這一塊(請看原始碼)。

中斷接收函式原始碼如下


位於stm32f10x_it.c檔案下。

進入I2C事件中斷,判斷是I2C從機事件,此時,作為從機接收資料需要檢測三個標示:

1.檢測主機已發生地址(ADDR = 1);

2.檢測有接收資料(RXNE = 1);

3.檢測到停止條件(STOPF =1)。

硬體I2C通訊中,起始條件由硬體判斷完成,我們檢測的就需要這幾步就能完成基本的接收資料功能。

Ⅵ、說明

理解本文之前請先理解I2C協議

更多關於硬體I2C主從通訊的例子(如:DMA傳送、DMA接收等)就不再單獨寫文章講述了,可以在微信公眾號聯絡我。

以上總結僅供參考,若有不對之處,敬請諒解。

Ⅶ、最後

更多精彩文章我將第一時間在微信公眾號裡面分享,對本文有什麼疑問可微信留言。

本著免費分享的原則,方便大家手機學習知識,定期在微信平臺分享技術知識。如果你覺得分享的內容對你有用,又想了解更多相關的文章,請用微信搜尋“EmbeddDeveloper” 或者掃描下面二維碼、關注,將有更多精彩內容等著你。