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