《STM32從零開始學習歷程》@EnzoReventon
STM32的I2C特性及架構
- 軟體模擬協議:直接控制GPIO引腳電平產生通訊時序時,需要由CPU控制每個時刻的引腳狀態,如果通訊資料量大,主從機數量多時這種通訊協議會對CPU產生較大的負載,
- 硬體協議:STM32 的I2C 片上外設專門負責實作I2C 通訊協議,只要配置好該外設,它就會自動根據協議要求產生通訊信號,收發資料并快取起來,CPU 只要檢測該外設的狀態和訪問資料暫存器,就能完成資料收發,這種由硬體外設處理I2C 協議的方式減輕了CPU 的作業,且使軟體設計更加簡單,
- STM32 的I2C 外設可用作通訊的主機及從機,支持100Kbit/s 和400Kbit/s 的速率,支持7 位、10位設備地址,支持DMA 資料傳輸,并具有資料校驗功能,
1.STM32的I2C架構圖:

- 通訊引腳:SDA,SCL,SMBA,連接到內部的電路邏輯中,SMBA有些功能與I2C共用,可以不必深究,用到的時候再去了解,
- 時鐘控制邏輯:噪聲濾波器,時鐘控制,時鐘控制暫存器(CCR),用來連接SCL,產生各種時鐘邏輯,
- 資料控制邏輯:噪聲濾波器,資料控制,資料移位暫存器,資料暫存器,比較器,PEC暫存器,自身地址暫存器,雙地址暫存器,PEC計算,用來存盤接收資料,
- 整體控制邏輯:控制暫存器(CR1和CR2),狀態暫存器(SR1和SR2),控制邏輯,中斷,DMA,ACK,
2.STM32的I2C通訊引腳:
STM32F407ZGT6共有3個I2C通訊介面,

| 引腳 | I2C1 | I2C2 | I2C3 |
|---|---|---|---|
| SCL | PB6/PB10 | PF1/PB10 | PA8 |
| SDA | PB7/PB9 | PF0/PB11 | PC9 |
3.STM32的I2C時鐘控制邏輯:
SCL線的時鐘信號,由I2C介面根據時鐘控制暫存器(CCR)控制,控制的引數主要為時鐘頻率,
- 可選擇I2C 通訊的“標準/快速”模式,這兩個模式分別I2C 對應100/400Kbit/s 的通訊速率,
- 在快速模式下可選擇SCL 時鐘的占空比,可選Tlow/Thigh=2 或Tlow/Thigh=16/9 模式,我們知道I2C 協議在SCL 高電平時對SDA 信號采樣,SCL 低電平時SDA 準備下一個資料,修改SCL 的高低電平比會影響資料采樣,但其實這兩個模式的比例差別并不大,若不是要求非常嚴格,這里隨便選就可以了,

T = Tl + Th
0: Tl / Th = 2
Tl = 2/3 T
Th = 1/3 T
1: Tl / Th = 16/9
Th = 9/25 T
Tl = 16/25 T
- CCR 暫存器中還有一個12 位的配置因子CCR,它與I2C 外設的輸入時鐘源共同作用,產生SCL 時鐘,STM32 的I2C 外設都掛載在APB1 總線上,使用APB1 的時鐘源PCLK1,SCL信號線的輸出時鐘公式如下:
標準模式:

快速模式:

用處是固定時鐘輸出,
例如,我們的PCLK1=42MHz,想要配置400Kbit/s 的速率,計算方式如下:
PCLK 時鐘周期: TPCLK1 = 1/42000000
目標SCL 時鐘周期: TSCL = 1/400000
SCL 時鐘周期內的高電平時間: THIGH = TSCL/3
SCL 時鐘周期內的低電平時間: TLOW = 2*TSCL/3
計算CCR 的值: CCR = THIGH/TPCLK1 = 35
該結果剛好為整數,所以我們可直接把CCR取值為35,這樣I2C 的SCL 實際頻率即為400KHz,特別地,CCR暫存器是無法配置小數引數的,如果配置某個速率算出來CCR 的結果為小數的話,需要對結果進行取整,再配置,取整后SCL的輸出頻率會跟原目標頻率稍微不同,取整后除了通訊稍慢或稍快一點以外,不會對I2C 的標準通訊造成其它影響,
4.STM32的I2C資料控制邏輯:
- I2C的SDA信號主要連接到資料移位暫存器上,資料移位暫存器的資料來源及目標是資料暫存器(DR)、地址暫存器(OAR)、PEC暫存器以及SDA資料線,
- 當向外發送資料的時候,資料移位暫存器以“資料暫存器”為資料源,把資料一位一位地通過SDA信號線發送出去,
- 當從外部接收資料的時候,資料移位暫存器把SDA信號線采樣到的資料一位一位地存盤到“資料暫存器”中,
- 若使能了資料校驗,接收到的資料會經過PCE計算器運算,運算結果存盤在**“PEC暫存器”**中,
- 當STM32的I2C作業在從機模式的時候,接收到設備地址信號時,資料移位暫存器會把接收到的地址與STM32 的自身的“I2C地址暫存器”的值作比較,以便回應主機的尋址,
- STM32 的自身I2C地址可通過修改“自身地址暫存器”修改,支持同時使用兩個I2C設備地址,兩個地址分別存盤在OAR1和OAR2中,
5.STM32的I2C整體控制邏輯:
- 整體控制邏輯負責協調整個I2C外設,控制邏輯的作業模式根據我們配置的“控制暫存器(CR1/CR2)”的引數而改變,
- 在外設作業時,控制邏輯會根據外設的作業狀態修改“狀態暫存器(SR1和SR2)”,我們只要讀取這些暫存器相關的暫存器位,就可以了解I2C的作業狀態了,
- 除此之外,控制邏輯還根據要求,負責控制產生I2C 中斷信號、DMA請求及各種I2C的通訊信號(起始、停止、回應信號等),
6.STM32的I2C通訊程序:
6.1主發送器

- 控制產生起始信號(S),當發生起始信號后,它產生事件“EV5”,并會對SR1暫存器的“SB”位置1,表示起始信號已經發送,
- 發送設備地址并等待應答信號,若有從機應答,則產生事件“EV6”及“EV8”,這時SR1暫存器的“ADDR”位及“TXE”位被置1,ADDR 為1表示地址已經發送,TXE為1表示資料暫存器為空;
- 往I2C的“資料暫存器DR”寫入要發送的資料,這時TXE位會被重置0,表示資料暫存器非空,I2C外設通過SDA信號線一位位把資料發送出去后,又會產生“EV8”事件,即TXE位被置1,重復這個程序,可以發送多個位元組資料,

- 發送資料完成后,控制I2C設備產生一個停止信號§,這個時候會產生EV2事件,SR1的TXE位及BTF位都被置1,表示通訊結束,
6.2主接收器

- 起始信號(S) 是由主機端產生的,控制發生起始信號后,它產生事件“EV5”,并會對SR1暫存器的“SB”位置1,表示起始信號已經發送;
- 發送設備地址并等待應答信號,若有從機應答,則產生事件“EV6”這時SR1暫存器的“ADDR”位被置1,表示地址已經發送,
- 從機端接收到地址后,開始向主機端發送資料,當主機接收到這些資料后,會產生“EV7”事件,SR1暫存器的RXNE被置1,表示接收資料暫存器非空,讀取該暫存器后,可對資料暫存器清空,以便接收下一次資料,此時可以控制I2C發送應答信號(ACK)或非應答信號(NACK),若應答,則重復以上步驟接收資料,若非應答,則停止傳輸;

- 發送非應答信號后,產生停止信號§,結束傳輸,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272859.html
標籤:其他
上一篇:運維面試前準備
