STM32學(xué)習(xí)筆記 | I2C通信容易出錯的情況
I2C:全稱為Inter-Integrated Circuit(內(nèi)部集成電路),是一種串行通訊總線,常用于嵌入式電子產(chǎn)品中。
I2C是飛利浦公司在1980年為了讓各種低速設(shè)備(飛利浦芯片)連接起來而研發(fā)的一種通信總線。目前,I2C依然是最常見的通信總線之一,現(xiàn)在絕大部分MCU都內(nèi)部集成了I2C控制器,STM32也不例外,至少有一個I2C控制器,有的型號甚至多達(dá)6個。
嵌入式專欄
1
STM32 I2C基礎(chǔ)內(nèi)容
I2C總線協(xié)議有多個版本,有的STM32遵循的是第2版本,有的是第3版本。所以,不同型號的 STM32 中I2C 可能存在一些差異,但基本功能相似。
1. 主從模式特性
主模式特性:
-
時鐘生成
-
起始位和停止位生成
從模式特性:
- 可編程 I2C地址檢測
- 雙尋址模式,可對 2 個從地址應(yīng)答
- 停止位檢測
2. 通信速度 標(biāo)準(zhǔn)速度:高達(dá) 100 kHz 快速速度:高達(dá) 400 kHz 超快速度:高達(dá) 1 MHz(第3版)
3.尋址模式
- 7 位尋址模式
- 10 位雙尋址模式
- 廣播呼叫地址
4.收發(fā)模式
- 從發(fā)送器
- 從接收器
- 主發(fā)送器
- 主接收器
這些都是STM32 I2C 的基礎(chǔ)功能,更多內(nèi)容請查閱芯片對應(yīng)的參考手冊。
嵌入式專欄
2
I2C 總線協(xié)議
I2C總線就兩根線:SCL時鐘信號,SDA數(shù)據(jù)信號。其中SCL由主機產(chǎn)生,SDA由主機或者從機產(chǎn)生。
I2C是同步串行通信,同一時間SDA只能由一個設(shè)備發(fā)送信號,也就是說它屬于半雙工通信。
I2C 總線協(xié)議可參考總線(SDA和SCL)的時序進(jìn)行理解:
通常包含:起始位、數(shù)據(jù)/地址、ACK、結(jié)束位。
1. 開始和停止 在時鐘線保持高的情況下, SDA數(shù)據(jù)線由高 -> 低:為總線開始條件; 在時鐘線保持高的情況下 ,SDA數(shù)據(jù)線由低 -> 高:為總線結(jié)束條件;
2. 地址 I2C地址分7位和10位。
7位地址:
10位地址:
3. 應(yīng)答(ACK) 應(yīng)答(ACK)和非應(yīng)答(NACK)發(fā)生在每個字節(jié)之后,是由接收方向發(fā)送方發(fā)出確認(rèn)信號,表明數(shù)據(jù)已成功接收,并且可以繼續(xù)發(fā)送下一字節(jié)數(shù)據(jù)。
I2C 總線協(xié)議更多內(nèi)容可參看:
https://zh.wikipedia.org/wiki/I2C https://www.nxp.com/docs/en/user-guide/UM10204.pdf
嵌入式專欄
3
STM32 I2C常見問題I2C 總線通信,通常不會像CAN、USB這類總線添加一些復(fù)雜的(軟件)通信協(xié)議。I2C 雖然硬件和協(xié)議簡單,但在實際應(yīng)用中還是經(jīng)常出現(xiàn)各種問題。下面就來分析一下常見的問題。
問題一:IO模式不對
有些工程師對用于I2C 總線的GPIO不了解,寫驅(qū)動代碼時把總線(SDA、SCL)配置成推挽輸出模式,導(dǎo)致應(yīng)用上的異常。
I2C 總線是一種特殊的總線,因為多器件需共用總線,加上數(shù)據(jù)線需支持雙向通信。SDA要求開漏輸出模式。由于開漏無法直接輸出“高”時,需外加上拉電阻配合。
解決辦法:STM32的IO有8種應(yīng)用模式,如果你通過軟件模擬I2C,并將SDA配置為開漏輸出模式,配合上拉電阻。這往往適用于主模式器件。如果使用硬件I2C,則需要配置成開漏復(fù)用功能。建議使用STM32CubeMX工具配置底層初始化代碼。
問題二:總線電壓不匹配
I2C 總線電壓通常為3.3V或5V。有的I2C C總線上掛的設(shè)備比較多,有可能存在特殊電壓,比如2.5V,或者3.3V不兼容5V,就容易引起信號辨識錯誤導(dǎo)致總線通信失敗的情況。
解決辦法:如果存在電壓不匹配的情況,需要從硬件方面來解決,比如:通過專業(yè)轉(zhuǎn)換模塊。
問題三:軟件檢測死機
I2C 總線一般通過ACK信號來判斷總線的情況,STM32實現(xiàn)I2C 收發(fā)、檢測等操作是由內(nèi)部控制器自動完成。
然而由于一些外部因素,比如干擾信號、電壓不匹配等,容易引起總線上的信號不正常,從而導(dǎo)致檢測失敗,通信失敗。
解決辦法:解決這種因異常引起的死機,除了從硬件方面做調(diào)整外,也可以從軟件入手,常見的做法是添加超時處理機制,不要讓程序一直死等檢測應(yīng)答信號。
比方當(dāng)發(fā)送超時情形時,可以嘗試復(fù)位STM32 I2C外設(shè)或相關(guān)設(shè)備。
復(fù)盤一下
▼I2C 基礎(chǔ)內(nèi)容:主從模式特性、通信速度、尋址模式、收發(fā)模式; ▼I2C 總線協(xié)議:起始位、數(shù)據(jù)/地址、ACK、結(jié)束位; ▼I2C 常見問題:IO模式不對、總線電壓不匹配、軟件檢測死機------------ END ------------
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!