stm32 I2C架构
STM32的 I2C 片上外設專門負責實現 I2C 通訊協議, 只要配置好該外設,它就會自動根據協議要求產生通訊信號,收發數據并緩存起來,CPU 只要檢測該外設的狀態和訪問數據寄存器,就能完成數據收發。架構圖如下所示。
通訊引腳:STM32 芯片有多個 I2C 外設,外設的 I2C 通訊信號引出到不同的 GPIO 引腳上,使用I2C時須配置這些指定的引腳。
時鐘控制邏輯:SCL 線的時鐘信號,由 I2C 接口根據時鐘控制寄存器(CCR)控制,控制的參數主要為時鐘頻率。配置 I2C 的 CCR 寄存器可修改通訊速率相關的參數。STM32 的 I2C 外設都掛載在 APB1 總線上,使用 APB1 的時鐘源 PCLK1。
SCL 時鐘周期內的高電平時間為Thigh,低電平時間為Tlow,那么在標準模式下(I2C 通訊的“標準/快速”模式,這兩個模式分別 I2C 對應 100/400Kbit/s 的 通訊速率),Thigh=CCR * TPCLK1;Tlow=CCR * TPCLK1(快速模式下Thigh=CCR * TPCLK1;Tlow=2 * CCR * TPCLK1)。由此可知CCR對通信速率的影響。例子如下。
數據邏輯控制:I2C 的 SDA 信號主要連接到數據移位寄存器上。
數據寄存器(DR):當向外發送數據的時候,數據移位寄存器以數據寄存器(DR)為數據源,把數據一位一位地通過SDA信號線發送出去;從外部接收數據的時候,數據移位寄存器把 SDA 信號線采樣到的數據一位一位地存儲到數據寄存器(DR)中。
PEC寄存器:若使能了數據校驗,接收到的數據會經過 PCE 計算器運算,運算結果存儲在PEC寄存器中。
自身地址寄存器(OAR1、OAR2):I2C設備工作在從機模式的時候,接收到設備地址信號時,數據移位寄存器會把接收到的地址與從機自身的I2C地址寄存器的值作比較,以便響應主機的尋址。STM32 的自身 I2C 地址可通過修改自身地址寄存器(OAR1、OAR2)修改,支持同時使用兩個 I2C 設備地址。(STM32 的 I2C 外設可同時使用兩個地址,即同時對兩個地址作出響應)
整體控制邏輯:負責協調整個 I2C 外設。控制邏輯負責控制產生 I2C 中斷信號、DMA 請求及各種 I2C 的通訊信號(起始、停止、響應信號等)。
控制寄存器(CR1/CR2):控制邏輯的工作模式根據控制寄存器(CR1/CR2)的參數而改變。
狀態寄存器(SR1 和 SR2):外設工作時,控制邏輯會根據外設的工作狀態修改狀態寄存器(SR1 和 SR2)。只要讀取這些寄存器相關的寄存器位,就可以了解 I2C 的工作狀態。
通信過程:使用 I2C 外設通訊時,在通訊的不同階段會對狀態寄存器(SR1 及 SR2)的不同數據位寫入參數,我們通過讀取這些寄存器標志來了解通訊狀態。
主發送器流程:作為 I2C 通訊的主機端時,向外發送數據時的過程。
事件EV5:主發送器產生起始信號(S),當發生起始信號后,產生事件EV5,并會對 SR1 寄存器的“SB”位置 1,表示起始信號已經發送。
事件EV6、EV8:緊接著主發送器發送設備地址并等待應答信號,若有從機應答,則產生事件“EV6”及 “EV8”,這時 SR1 寄存器的“ADDR”位及“TXE”位被置 1,ADDR 為 1 表示地址已經發送,TXE 為 1 表示數據寄存器為空。
事件EV8:以上步驟正常執行并對 ADDR 位清零后,往 I2C 的數據寄存器(DR)寫入要發送的數據,這時 TXE 位會被重置 0,表示數據寄存器非空,I2C 外設通過 SDA 信號線一位位把數據發送出去后,又會產生事件EV8,即 TXE 位被置 1, 重復這個過程,就可以發送多個字節數據了。
事件EV8_2:當發送數據完成后,控制 I2C 設備產生一個停止信號§,這個時候會產生 EV8_2 事件,SR1 的 TXE 位及 BTF 位都被置 1,表示通訊結束。
假如使能了 I2C 中斷,以上所有事件產生時,都會產生 I2C 中斷信號,進入同一 個中斷服務函數,到 I2C 中斷服務程序后,再通過檢查寄存器位來判斷是哪一個事件。
主接收器過程:作為 I2C 通訊的主機端時,從外部接收數據的過程。
和發送過程區別在于:
EV7事件:從機端接收到地址后,開始向主機端發送數據。當主機接收到這些數據后,會產生EV7事件,SR1 寄存器的 RXNE 被置 1,表示接收數據寄存器非空,讀取該寄存器后,可對數據寄存器清空,以便接收下一次數據。此時可以控 制 I2C 發送應答信號(ACK)或非應答信號(NACK),若應答,則重復以上步驟接收 數據,若非應答,則停止傳輸;
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的stm32 I2C架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux mysql.plugin_L
- 下一篇: matlab guide 自定义右键菜单