Ⅰ、寫在前面
關注我分享文章的朋友應該知道我在前面講述過(軟件、硬件)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云盤,歡迎下載測試、參照學習。
提供下載的軟件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型號也適用(適用F1其他型號: 關注微信,回復“修改型號”)。
STM32F10x_硬件I2C主機(發送數據 - 輪詢方式)實例源代碼工程:
https://yunpan.cn/cMKS6muF6643V訪問密碼 8e16
STM32F10x_硬件I2C從機(接收數據 - 中斷方式)實例源代碼工程:
https://yunpan.cn/cMKSMCkcn8tKv訪問密碼 f3ad
STM32F1資料:
https://yunpan.cn/crBUdUGdYKam2訪問密碼 ca90
Ⅲ、關于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的(主機)配置一樣。
可參考我之前的文章:STM32F10x_模擬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這一塊比較簡單,和上面主機類似,請參看源代碼或參考我之前文章的講述。
可參考我之前的文章:STM32F10x_模擬I2C讀寫EEPROM
提醒:配置中注意關于I2C事件中斷這一塊(請看源代碼)。
中斷接收函數源代碼如下:
位于stm32f10x_it.c文件下。
進入I2C事件中斷,判斷是I2C從機事件,此時,作為從機接收數據需要檢測三個標示:
1.檢測主機已發生地址(ADDR = 1);
2.檢測有接收數據(RXNE = 1);
3.檢測到停止條件(STOPF =1)。
硬件I2C通信中,起始條件由硬件判斷完成,我們檢測的就需要這幾步就能完成基本的接收數據功能。
-
STM32F10x
+關注
關注
1文章
81瀏覽量
20708 -
I2C
+關注
關注
28文章
1495瀏覽量
124241 -
主從通信
+關注
關注
0文章
7瀏覽量
3552
發布評論請先 登錄
相關推薦
評論