1. 程式人生 > >STM32 硬體I2C 到底是不是個坑?

STM32 硬體I2C 到底是不是個坑?

/**

******************************************************************************

* @author    Maoxiao Hu

* @version   V1.0.0

* @date       May-2015

******************************************************************************

* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >

******************************************************************************

**/

除錯STM32的硬體I2C已經有很長一段時間了,幾乎搜遍了所有資料,對於其到底能不能正常工作,今天做一個徹底的研究。

下面是我在測試中得到的幾個結論:

1、硬體I2C的CLK在50kHz及以下的情況下工作,不會出現任何情況下的卡住。(本人測試時間為20h)

2、硬體I2C的CLK在常用的100kHz和400KHz下工作,99%的概率下會在1小時之內卡住,甚至只有幾十秒。

3、硬體I2C的CLK在任何頻率下工作,在讀取或者傳送資料時,都絕對不允許其它中斷事件打斷它的工作,否則一定會卡住,只是時間問題。

綜上,硬體I2C的穩定工作情況是:工作在50kHz及以下,並且保證無其它任何中斷打斷它的工作。這樣只適用於某些對速率要求不高的場所,比如EEPROM的讀取等,而對於高速器件例如某些型號的AD晶片,就不能用了。

如果你一定需要高速率(400KHz),那麼推薦大家使用STM32的替代方案GD32(兆易創新),它與STM32完全相容但是解決了STM32的硬體I2C bug,經過本人實際測試,在400KHz的情況下工作,48小時無任何錯誤發生。但是仍需注意的是不能有外部中斷打斷I2C的工作。

對於ST公司推薦的將I2C工作在DMA和最高優先順序的中斷,我只能說大家可以根據自己的情況使用,因為如果你使用了ucos ii或者其它實時作業系統,那麼這種設定最高優先順序的方式是絕對不推薦的。如果你是裸機程式,並且任務數量不多,可以考慮這種DMA+中斷的方式,否則一定會出現問題,只是測試時間長短問題。

最後需要說明的是:

(1)以上只是考慮了最純粹的硬體I2C程式碼,對於某些使用了軟體彌補的方法,例如在經常卡住的部分設定超時退出,不在本文的討論範圍內,因為這樣已經破壞了正常的I2C協議。

(2)由於使用STM32的較高境界是使用中斷排程任務而不是死等迴圈,而硬體I2C對於中斷打斷十分忌諱,所以隨著你的程式設計和對作業系統理解水平的提高,你會越來越感覺STM32硬體I2C是個坑。

所以,STM32的硬體I2C確實是個坑,可以正常工作的環境要求十分苛刻,所以本人現在已轉而使用GD32晶片。

相關推薦

STM32 硬體I2C 到底是

/** ****************************************************************************** * @author    Maoxiao Hu * @version   V1.0.0 * @date       May-2015

STM32硬體I2C除錯

除錯情況1 現象:主I2C傳送資料而沒有收到應答,則下一次不能正常傳送資料 背景:主I2C每次應該都能正常傳送資料 硬體:野火STM32-MINI,1主0從,SCL和SDA直接上拉 軟體:按鍵觸發中斷,主I2C傳送一次資料,中斷優先順序,按鍵最低,I2C最高,且主I2C中有TIMEOUT計時

stm32硬體I2C測試例程,親測可用

        對於stm32的硬體I2C確實有不盡人意的地方。但是還是可以實現的,畢竟使用stm32的硬體I2C確實比使用IO口來模擬簡單的多。下面的程式程式碼是使用stm32F03ZET6的I2C1(PB6,PB7)和AT24C02的EEPROM來測試的。希望對於需要的朋

STM32微控制器硬體I2C驅動程式(查詢方式)

本文章原始地址:http://feotech.com/?p=69 本程式主要用於驅動STM32微控制器晶片的硬體I2C暫存器,實現通過使用晶片自帶的I2C暫存器進行資料的傳送與接收. 本例程中採用I2C暫存器查詢的方式來實現資料傳輸,當I2C對應暫存器指定狀態時方可執行下一步操作.

STM32微控制器硬體I2C驅動程式(軟體輪詢方式)---摘自:FeoTech

感謝原作者:FeoTech   原文網址:http://feotech.com/?p=69 本程式主要用於驅動STM32微控制器晶片的硬體I2C暫存器,實現通過使用晶片自帶的I2C暫存器進行資料的傳送與接收. 本例程中採用I2C暫存器查詢的方式來實現資料傳輸,當I2C對應

訓練的神經網路工作?一文帶你跨過這37

近日,Slav Ivanov 在 Medium 上發表了一篇題為《37 Reasons why your Neural Network is not working》的文章,從四個方面(資料集、資料歸一化/增強、實現、訓練),對自己長久以來的神經網路除錯經驗做了 37 條總結,並穿插了不少出色

若干秒後操作自動關閉視窗程式的兩

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>若干秒後自動關閉視窗</title> &

mybatis if 標籤 判斷單個字元的生效,其實這是

需求: <if test="carrier != null and carrier !='' and carrier !='0'"> AND CARRIER = #{carrier} </if>要在carrier欄位不為null,'',和"0

基於 STM32硬體 I2C 讀取 MPU6050 資料

MPU6050其實就是一個 I2C 器件,裡面有很多暫存器(但是我們用到的只有幾個),我們通過讀寫暫存器來操作這個晶片。所以首要問題就是 STM32 和 MPU6050 的 I2C 通訊。1、配置 STM32 (用I2C1:PB6——SCL;PB7——SDA)      

細數PorterDuffXferMode的幾, PorterDuffXferMode正確的真正原因

菜雞wing遇敵PorterDuffXferMode,不料過於輕敵,應戰吃力。隨後與其大戰三天三夜,三百餘回合不分勝負。幸得 @咪咪控 相助,僥倖獲勝。 關鍵字:PorterDuffXferMode  錯誤 不正確  不達到預期  bug 上一篇帶來一

轉載微信硬體藍芽開發各種完全開發指南

原文地址:http://m.blog.csdn.net/article/details?id=51163000  轉載 幾個基本要用的東西: 1、微信公眾平臺 網址:https://mp.weixin.qq.com 申請微信公眾號,獲取微信測試號。 – 開始開發 –

STM32中FSMC與硬體I2C衝突

ST官網勘誤表中列到,FSMC與I2C不能同時開啟。解決的辦法可以有 1:將I2C對映到PB9,PB8. 2:使用模擬的I2C. I/O重對映步驟:(以串列埠為例) 1.開啟重對映時鐘和USART重對映後的I/O口引腳時鐘,  RCC_APB2PeriphClockCmd(

前端還原設計圖常遇到的幾

自己 而且 滾動 設備 背景 body -s 解決 back 1.問題:一張背景圖,適應大小不一的設備,而且不出現滾動條,圖片不會變形。 解決方法:body{background-size:cover}就可以搞定。 2.問題:背景圖顯示在頁面上非常大,或非常小,顯得頁面很不

【獨家】矽谷創業公司在中國常跌的五|禾賽科技CEO李一帆柏林亞太周主題演講

solution 博士 etc business big china industry 微信公眾 nsa 【獨家】矽谷創業公司在中國常跌的五個坑|禾賽科技CEO李一帆柏林亞太周主題演講 李一帆 Xtecher特稿作者 關註

python學習第三

cat 自定義函數 min 類型 一個 默認參數 變長參數 是個 分隔 ##########################python 第三章 ################################這一章呢,主要是文件的操作,還有涉及到函數的一部分. PS:整理

如何確保外包,項目爛尾,架構是核心

.cn med -name 技術 bsp title 分享 ima .com 如何確保外包不被坑,項目不爛尾,架構是核心! ——關註微信公眾號:“扣丁圈”,確保不入坑! 如何確保外包不被坑,項目不爛尾,架構是核心

Python 微信通知 先挖

source left amp nbsp https clas 信息 play isp 桑心病狂,試試把報警信息發到微信上 原文 https://segmentfault.com/a/1190000009717078 Python 微信通知 先挖個坑

saltstcak有keep_jobs必須要定期清理

saltstcak有個坑keep_jobs必須要定期清理saltstack在運行的時候會在salt下面會產生無數的job的cache,必須要定期刪除,或者是把keep_jobs的時間給寫出來,不寫的花就好像我一樣的悲劇了,他會把整個服務器的inode給占滿了,導致服務器沒法正常工作了。grep "keep_j

Java踩筆記:ObjectIOStream與IOStream的各種裝飾器(先挖,以後再來詳細填)

ted objects lose val read thread 環境 valid 序列化對象 Java的序列化和ObjectStream真是一個大坑。。 先不說多線程環境下的問題,在單線程裏,一個Socket只能保持一個ObjectOutputStream,原因好像是

,寫一個Spring+SpringMVC+Mybatis的項目

pri 自己 什麽 空間 ati 並且 servle 用戶註冊 留言板   想挖個坑督促自己練技術,有時候想到一個項目,大概想了一些要實現的功能,怎麽實現。現在覺得自己差不多能完成QQ空間的主要功能了。準備立個牌坊,寫一個類似功能的網站。並且把進度放到這裏來。   初步計劃