stm32硬體i2c到底是不是個坑

時間 2021-08-30 10:36:00

1樓:匿名使用者

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

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+中斷的方式,否則一定會出現問題,只是測試時間長短問題。

2樓:洪興靚坤

1、硬體i2c的clk在50khz及以下的情況下工作,不會出現任何情況下的卡住。

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確實是個坑,可以正常工作的環境要求十分苛刻。

stm32中硬體iic執行時候,老是停在下面這裡,是主模式選擇失敗,我選擇的是 i2c_mode_i2c ,有關係麼

3樓:匿名使用者

不用搞這個了stm32的iic通訊有個bug。

因為ack訊號時間很短暫,一旦錯過了這個短暫的ack訊號,stm32就掛了。

想用iic的話,就用軟體模擬吧。

4樓:知識哥哥

stm32f103的硬體i2c著實不好用,但cortex-m0核心的f051對硬體i2c做了很大程度修改,比m3的要好用。

stm32學習困惑,stm32 學習困惑 30

正點原子的iap例程,應該能幫到你一點。stm32的內部快閃記憶體 flash 地址起始於0x08000000,一般情況下,程式檔案就從此地 址開始寫入。此外stm32是基於cortex m3核心的微控制器,其內部通過一張 中斷向量表 來響應中斷,程式啟動後,將首先從 中斷向量表 取出復位中斷向量執...

對於stm32為什麼,對於STM32,為什麼 GPIOA CRH 0X0F0FFFFF 的意思是PA13,15設定成輸入,線上等

認真看下手冊,下面是我引用的一段,應該能助你理解了 埠低配置暫存器暫存器的復位值為0x4444 4444,復位值其實就是配置埠為浮空輸 入模式。stm32的crl控制著每個io埠 a g 的低8位的模式。每 個io埠的位占用crl的4個位,高兩位為cnf,低兩位為mode。這裡我們可以記住幾個 常用...

stm32復位問題,STM32微控制器的復位問題

stm32復位腳有內部上拉電阻,執行是沒什麼問題,只是沒辦法手動復位而且上電覆位不可靠,最好接個104左右的電容到復位腳,確保上電時可靠復位。 這個疏忽不應該,但也可以理解。軟體復位是指程式執行過程中,通過向控制暫存器寫入特定資料,實現復位。現在你沒有硬體復位電路,程式啟動都成問題,怎麼實行軟體復位...