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主機(發送數據 - 輪詢方式)實例源代碼工程:

https://yunpan.cn/cMKS6muF6643V??訪問密碼

?

STM32F10x_硬件I2C從機(接收數據 - 中斷方式)實例源代碼工程:

https://yunpan.cn/cMKSMCkcn8tKv??訪問密碼

?

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通信中,起始條件由硬件判斷完成,我們檢測的就需要這幾步就能完成基本的接收數據功能。

?

?

Ⅵ、說明

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

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

?

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

?

Ⅶ、最后

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

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

?

轉載于:https://www.cnblogs.com/strongerHuang/p/5787392.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaFX 2:創建登錄表單

在本教程中,我將使用JavaFX 2和CSS設計漂亮的Login Form 。 它是經典的登錄表單,帶有用戶名和密碼以及登錄按鈕。 為了遵循本教程,我強烈建議您查看以下這些教程: Eclipse IDE中的JavaFX 2入門 JavaFX 2:HBox JavaFX…

c html導出成word,html轉word-html如何轉換成WORD

1、打開HTML文件,點擊菜單欄文件→使用MicrosoftOfficeWord編輯,之后系統會自動打開Word并顯示HTML文件的內容,這是保存即可。2、如果找不到“使用MicrosoftOfficeWord編輯”的話,點擊菜單欄工具→Internet選項→程序→HTML編輯器…

怎么解決tomcat占用8080端口問題

怎么解決tomcat占用8080端口問題 相信很多朋友都遇到過這樣的問題吧,tomcat死機了,重啟eclipse之后,發現Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be running in…

ADO Recordset 對象鏈接

http://baike.baidu.com/link?url4Xdc46R8M5uj-BbOGaH761N5oDEYlGQJFeR2WbPwx1iQBusAUKU3qbWcHZCMmayatj9nzxPW7HdPToL6roD3Y_ 轉載于:https://www.cnblogs.com/loanhicks/p/5788451.html

mvc4 html.beginform,MVC4 Html.BeginForm在Internet Explorer中提交按鈕 9不工

我已經寫在ASP.NET MVC4 /剃刀的形式。 該表格后很完善在Firefox和Chrome,但由于某種原因在Internet Explorer 10和11,“提交”按鈕沒有反應。 (Internet Explorer 9的作品也不錯)。這是我的看法形式的樣子:using (Html.BeginForm("MyAc…

頁面傳值的方法 和JSON與字符串和對象之間的轉換

json數據解析 就是將json轉換為數組或對象 json數據序列化 就是將數組或對象轉化為json轉載于:https://www.cnblogs.com/yaomengli/p/6678709.html

JasperReports JSF插件用例系列

這是文章系列的切入點,在該系列文章中,我將嘗試介紹JasperReport JSF Plugin的一些用例, JasperReport JSF Plugin是一種工具,旨在輕松地將為JasperReports設計的業務報告集成到JSF應用程序中。 該系列中描述的所有示例都可以從Ja…

回歸分析

一元線性回歸模型: 一元線性回歸分析的主要任務是: 解得: 三、檢驗、預測與控制: 1)F檢驗法: 2)t檢驗法 3)r檢驗法 3預測: 四、可線性化的一元非線性回歸(曲線…

與傳統的計算機硬件系統相比,計算機一級名詞解釋

目前微型機中普遍采用的字符編碼是ASCII碼。它是用7位二進制數對127個字符進行編碼,其中前32個是一些不可打印的控制符號。多媒體系統由主機硬件系統、多媒體數字化外部設備和多媒體軟件三部分組成。機器語言和匯編語言都是"低級"的語言,而高級…

ubuntu安裝jdk1.8

sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installer 轉載于:https://www.cnblogs.com/czwangzheng/p/5793488.html

【java】對象變成垃圾被垃圾回收器gc收回前執行的操作:Object類的protected void finalize() throws Throwable...

1 package 對象被回收前執行的操作;2 class A{3 Override4 protected void finalize() throws Throwable {5 System.out.println("在對象變成垃圾被gc收回前執行的操作。");6 }7 }8 public class Test_finalize {9 public static void main(…

服務器 風扇測試軟件,圖解服務器風扇安裝的正確方法

一般不是太垃圾的機箱總有兩個地方可以裝風扇,前面的一般在硬盤托架處,后面的一般在電源下面,鍵盤口上方。有的機箱出廠就已經裝好1~2個風扇了。圖中越紅的區域溫度相對越高。應該什么樣的風道合理呢?1、前后都裝機箱風扇的情況應…

處理Weblogic卡住的線程

定義或卡線是什么? 如果線程 在設定 的時間 內連續工作(非空閑),則WebLogic Server會將其診斷為阻塞 。 您可以通過更改在診斷出線程被阻塞之前的時間長度( Stuck Thread Max Time ),以及通過更…

控件自定義左鍵點擊消息相應函數的問題(請懂的人來解答一下)

【問題描述】 自定義CTouchInputEdit類,繼承自CEdit。 實現一個新的功能,當點擊edit控件的時候,彈出一個輸入框。 下面的代碼片段1,當點擊控件之后,會彈出輸入框,退出輸入框以后,在窗體的任何位…

電話圈(floyd)

題意: 如果兩個人相互打電話,則說他們在同一個電話圈里。例如,a打給b,b打給c,c打給d,d打給a,則這4個人在同一個圈里;如果e打給f但f不打給e,則不能推出e和f在同一個電話圈…

計算機二級網址打不開,大神為你解決win7系統打不開二級網頁鏈接的操作教程...

許多win7系統電腦的時候,常常會遇到win7系統打不開二級網頁鏈接的情況,比如近日有用戶到本站反映說win7系統打不開二級網頁鏈接的問題,但是卻不知道要怎么解決win7系統打不開二級網頁鏈接,我們依照首先我們打開IE瀏覽器,然后點擊上…

3步實現Jetty和Eclipse集成

本教程將引導您逐步了解如何集成Jetty和Eclipse,以及如何在Eclipse中的Jetty服務器上運行Web應用程序。 腳步: 安裝Jetty Eclipse插件 建立網路應用程式 運行網絡應用 1 –安裝Jetty Eclipse插件 將服務器添加到“服務器”視圖時,將不會…

【Linux開發】如何更改linux文件的擁有者及用戶組(chown和chgrp)

本文整理自: http://blog.163.com/yanenshun126/blog/static/128388169201203011157308/http://ydlmlh.iteye.com/blog/1435157一、基本知識在Linux中,創建一個文件時,該文件的擁有者都是創建該文件的用戶。該文件用戶可以修改該文件的擁有者…

使用Akka處理1000萬條消息

Akka演員承諾并發。 有什么更好的模擬方式,看看使用商品硬件和軟件處理1000萬條消息需要花費多少時間,而無需進行任何低級調整。我用Java編寫了整個1000萬條消息的處理過程,整個結果令我驚訝。 當我在具有Intel i5 – 4核,4 Gb RA…

PHP中unset,array_splice刪除數組中元素的區別

php中刪除數組元素是非常的簡單的,但有時刪除數組需要對索引進行一些排序要求我們會使用到相關的函數,這里我們來介紹使用unset,array_splice刪除數組中的元素區別吧 如果要在某個數組中刪除一個元素,可以直接用的unset,但是數組的…