STM32 I2C 不工作的問題

爲了方便調試, 我特意在它啓動的時候打印了一些字符, 在固件載入完畢之後拔掉下載綫, 啓動設備。
結果現在的情況是, 這些字符打印了, 但設備的 I2C 不工作。

1
2
3
4
5
6
[2022-08-16 12:07:21.006]
RX:
[2022-08-16 12:07:25.566]
RX:
[2022-08-16 12:07:29.173]
RX:埥窖_K暸乧leared.

量過, 這個時候 I2C 總綫的 SCL 和 SDA 實際上是處於高電平, 也就是空閑狀態。
但 SR2->BUSY 位是 1, 有點靈異。

img

我也去網上搜羅過很多關於 STM32 I2C 問題的解決方案, 似乎有很多人遇到過。但各種 reset 代碼都加上了, 它們都不太適用我的情況。

事出有因

文章寫到這裡, 已經是第二天了。
我突然開始好奇, 這個問題竟然會如此穩定的復現, 肯定是有哪寫炸了什麽的。

於是就打開 keil 開始單步代碼, 同時打開邏輯分析儀查看波形。
結果真就給我找到了些許端倪 (

img
img

這個地方是我正在用 axp173 給 I2C 縂綫上從設備配電。
從設備在上電的時候也會初始化 I2C, 然後把 SCL 綫短暫地拉低了 36us。

再次點擊單步之後我就發現 SR2->BUSY 就被置了 1, STM32 隨即開始智障,
什麽數據都發不出去了, 因爲它覺得自己很忙, 各種返回 HAL_BUSY。

問題也好解決, 只要先給設備上電再初始化 I2C 就行了,
或者在初始化之後重載一下 I2C。對於我種比較懶的人, 肯定選是後者了 XD

對症下藥

然後就順手給它加上了這一句代碼,
本意是清除掉 BUSY 位, 讓它能夠回到正常工作的狀態。
img

結果重新一跑, 發現這寄存器是 RO (Read Only) 的, 沒辦法手動清掉。(駡駡咧咧
不得已, 換個辦法。

我就原地重新初始化一下, 應該沒問題吧
不過看起來是修好了 XD
img

Author

TheSnowfield

Posted on

2022-08-16

Updated on

2023-10-04

Licensed under