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

2022-03-29 11:06:45 字數 2129 閱讀 9565

* @author    maoxiao hu

* @version   v1.0.0

* @date       may-2015

除錯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晶元。

* @author    maoxiao hu

* @version   v1.0.0

* @date       may-2015

除錯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

i2c的兩個引腳 scl引腳和sda引腳 需要既能輸出又能輸入,為了避免複雜的配置操作需要把該引腳配置為開漏輸出模式,該模式的說明如下圖所示 當微控制器的sda引腳配置為低電平時,sda線被拉低 當微控制器的sda引腳配置為高電平時,引腳埠為高阻態,sda線通過上拉電阻被vcc拉高。因此一定要注意在...

STM32之I2C 學習筆記

1 i2c是兩線式序列匯流排,由資料線sda和時鐘scl構成的序列匯流排,可傳送和接收資料。在cpu與被控ic之間 ic與ic之間進行雙向傳送,高速iic匯流排一般可達400kbps以上。2 iic是半雙工通訊方式,也就是說它既可以接收也可以傳送,但是由於它只有一根資料線,所以接收和傳送不能同時進行...

STM32之I2C模組除錯總結

前一段時間對stm32的i2c模組進行了除錯,今天做乙個總結。關於i2c協議的知識,這裡就不再贅述,網上有很多介紹i2c協議的文章。目前實現i2c協議的方式有兩種,一是採用gpio口來模擬i2c協議,另外一種是使用stm32自帶的i2c模組。雖說使用gpio口模擬i2c協議較為複雜,需要詳細了解i2...