stm32的iic不穩定這種說法源於舊版的函數庫,由於iic本身是飛利浦發明的,飛利浦拆分出來的nxp具有絕對的專利優勢,為了規避這種專利問題,st對iic通訊有別出一格的設計,但舊版的函數庫無法很好地處理這種設計,導致多中斷的時候容易出問題。但新版的hal庫基本解決這種問題,可以放心使用。
沒有不穩定這個說法,只是硬件I2C通信困難,因為STM32沒有I2C協議的專利,一些技術細節與官方的I2C協議有所出入,因此做得很難用的樣子,以防被對手控告侵權。
這個硬件的IIC是沒有問題的,只是ST的標准庫去操作IIC有bug導致不穩定
原來使用過硬件的IIC,非常不穩定,而且讀取數據也有亂碼,網上反饋是硬件的bug
這個是STM32的一bai個bug。它只在特定的一小段時間內讀外設的ACK信號,一旦錯過了ack信號,后面所有的shu時序都亂了。ST建議所有涉及I2C的程序都采用DMA方式。
加點針對性的bai的代碼就可以了
1.比如為了防止錯過Ack信號的讀取,可以加入循環發送並讀Ack的步驟,也可以直接關中斷,如果有資源用DMA最好了,收發數據以及標志位的相關處理和判斷都自動處理。
2.還有就是調試過程中,如果斷點設在等待Ack前,會清除Ack信號
ADDR: Address sent (master mode)/matched (slave mode)
This bit is cleared by software reading SR1 register followed reading SR2
Ack信號會在讀SR1和SR2后被清除。調試器會讀取SR1和SR2,所以設斷點在等待Ack前會導致程序檢測不到Ack信號
一:不要用庫,每一段START->ACK盡量寫短,寫簡潔!
二:降低I2C速度!我測試在10KHZ時很穩定,20KHZ非常少,不穩定,50KHZ幾乎不穩定
REF
https://zhuanlan.zhihu.com/p/338377414
https://www.icxbk.com/ask/detail/14916.html
https://blog.csdn.net/whw8007/article/details/9162779