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