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空間的主要功能了。準備立個牌坊,寫一個類似功能的網站。並且把進度放到這裏來。 初步計劃