STM32的I2C框圖詳解及通訊過程


  STM32 的I2C 特性及架構

  如果我們直接控制STM32 的兩個GPIO 引腳,分別用作SCL 及SDA,按照上述信號的時序要求,直接像控制LED 燈那樣控制引腳的輸出(若是接收數據時則讀取SDA 電平),就可以實現I2C 通訊。同樣,假如我們按照USART 的要求去控制引腳,也能實現USART通訊。所以只要遵守協議,就是標准的通訊,不管您如何實現它,不管是ST 生產的控制器還是ATMEL 生產的存儲器, 都能按通訊標准交互。

  由於直接控制GPIO 引腳電平產生通訊時序時,需要由CPU 控制每個時刻的引腳狀態,所以稱之為“軟件模擬協議”方式。

  相對地,還有“硬件協議”方式,STM32 的I2C 片上外設專門負責實現I2C 通訊協議,只要配置好該外設,它就會自動根據協議要求產生通訊信號,收發數據並緩存起來,CPU只要檢測該外設的狀態和訪問數據寄存器,就能完成數據收發。這種由硬件外設處理I2C協議的方式減輕了CPU 的工作,且使軟件設計更加簡單。

  STM32 的I2C 外設簡介

  STM32 的I2C 外設可用作通訊的主機及從機,支持100Kbit/s 和400Kbit/s 的速率,支持7 位、10 位設備地址,支持DMA 數據傳輸,並具有數據校驗功能。它的I2C 外設還支持SMBus2.0 協議,SMBus 協議與I2C 類似,主要應用於筆記本電腦的電池管理中。

  STM32 的I2C 架構剖析

  圖 24-9 I2C 架構圖

  

 

  通訊引腳

  I2C 的所有硬件架構都是根據圖中左側SCL 線和SDA 線展開的(其中的SMBA 線用於SMBUS 的警告信號,I2C 通訊沒有使用)。STM32 芯片有多個I2C 外設,它們的I2C 通訊信號引出到不同的GPIO 引腳上,使用時必須配置到這些指定的引腳,見表 24-1。關於GPIO引腳的復用功能,以規格書為准。

  

 

  時鍾控制邏輯

  SCL 線的時鍾信號,由I2C 接口根據時鍾控制寄存器(CCR)控制,控制的參數主要為時鍾頻率。配置I2C 的CCR 寄存器可修改通訊速率相關的參數:

  可選擇I2C 通訊的“標准/快速”模式,這兩個模式分別I2C 對應100/400Kbit/s 的通訊速率。

  在快速模式下可選擇SCL 時鍾的占空比,可選Tlow/Thigh=2 或Tlow/Thigh=16/9模式,我們知道I2C 協議在SCL 高電平時對SDA 信號采樣,SCL 低電平時SDA准備下一個數據,修改SCL 的高低電平比會影響數據采樣,但其實這兩個模式的比例差別並不大,若不是要求非常嚴格,這里隨便選就可以了。

  CCR 寄存器中還有一個12 位的配置因子CCR,它與I2C 外設的輸入時鍾源共同作用,產生SCL 時鍾,STM32 的I2C 外設都掛載在APB1 總線上,使用APB1 的時鍾源PCLK1,SCL 信號線的輸出時鍾公式如下:

  

 

  計算結果得出CCR 為30,向該寄存器位寫入此值則可以控制IIC 的通訊速率為400KHz,其實即使配置出來的SCL 時鍾不完全等於標准的400KHz,IIC 通訊的正確性也不會受到影響,因為所有數據通訊都是由SCL 協調的,只要它的時鍾頻率不遠高於標准即可。

  數據控制邏輯

  I2C 的SDA 信號主要連接到數據移位寄存器上,數據移位寄存器的數據來源及目標是數據寄存器(DR)、地址寄存器(OAR)、PEC 寄存器以及SDA 數據線。當向外發送數據的時候,數據移位寄存器以“數據寄存器”為數據源,把數據一位一位地通過SDA 信號線發送出去;當從外部接收數據的時候,數據移位寄存器把SDA 信號線采樣到的數據一位一位地存儲到“數據寄存器”中。若使能了數據校驗,接收到的數據會經過PCE 計算器運算,運算結果存儲在“PEC 寄存器”中。當STM32 的I2C 工作在從機模式的時候,接收到設備地址信號時,數據移位寄存器會把接收到的地址與STM32 的自身的“I2C 地址寄存器”的值作比較,以便響應主機的尋址。STM32 的自身I2C 地址可通過修改“自身地址寄存器”修改,支持同時使用兩個I2C 設備地址,兩個地址分別存儲在OAR1 和OAR2 中。

  整體控制邏輯

  整體控制邏輯負責協調整個I2C 外設,控制邏輯的工作模式根據我們配置的“控制寄存器(CR1/CR2)”的參數而改變。在外設工作時,控制邏輯會根據外設的工作狀態修改“狀態寄存器(SR1 和SR2)”,我們只要讀取這些寄存器相關的寄存器位,就可以了解I2C的工作狀態。除此之外,控制邏輯還根據要求,負責控制產生I2C 中斷信號、DMA請求及各種I2C 的通訊信號(起始、停止、響應信號等)。

  通訊過程

  使用I2C 外設通訊時,在通訊的不同階段它會對“狀態寄存器(SR1 及SR2)”的不同數據位寫入參數,我們通過讀取這些寄存器標志來了解通訊狀態。

  主發送器

  見圖 24-10。圖中的是“主發送器”流程,即作為I2C 通訊的主機端時,向外發送數據時的過程。

  圖 24-10 主發送器通訊過程

  

 

  主發送器發送流程及事件說明如下:

  (1) 控制產生起始信號(S),當發生起始信號后,它產生事件“EV5”,並會對SR1 寄存器的“SB”位置1,表示起始信號已經發送;

  (2) 緊接着發送設備地址並等待應答信號,若有從機應答,則產生事件“EV6”及“EV8”,這時SR1 寄存器的“ADDR”位及“TXE”位被置1,ADDR 為1 表示地址已經發送,TXE 為1 表示數據寄存器為空;

  (3) 以上步驟正常執行並對ADDR 位清零后,我們往I2C 的“數據寄存器DR”寫入要發送的數據,這時TXE 位會被重置0,表示數據寄存器非空,I2C 外設通過SDA 信號線一位位把數據發送出去后,又會產生“EV8”事件,即TXE 位被置1,重復這個過程,就可以發送多個字節數據了;

  (4) 當我們發送數據完成后,控制I2C 設備產生一個停止信號(P),這個時候會產生EV8_2 事件,SR1 的TXE 位及BTF 位都被置1,表示通訊結束。

  假如我們使能了I2C 中斷,以上所有事件產生時,都會產生I2C 中斷信號,進入同一個中斷服務函數,到I2C 中斷服務程序后,再通過檢查寄存器位來判斷是哪一個事件。

  主接收器

  再來分析主接收器過程,即作為I2C 通訊的主機端時,從外部接收數據的過程,見圖24-11。

  圖 24-11 主接收器過程

  

 

  主接收器接收流程及事件說明如下:

  (1) 同主發送流程,起始信號(S)是由主機端產生的,控制發生起始信號后,它產生事件“EV5”,並會對SR1 寄存器的“SB”位置1,表示起始信號已經發送;

  (2) 緊接着發送設備地址並等待應答信號,若有從機應答,則產生事件“EV6”這時SR1 寄存器的“ADDR”位被置1,表示地址已經發送。

  (3) 從機端接收到地址后,開始向主機端發送數據。當主機接收到這些數據后,會產生“EV7”事件,SR1 寄存器的RXNE 被置1,表示接收數據寄存器非空,我們讀取該寄存器后,可對數據寄存器清空,以便接收下一次數據。此時我們可以控制I2C 發送應答信號(ACK)或非應答信號(NACK),若應答,則重復以上步驟接收數據,若非應答,則停止傳輸;

  (4) 發送非應答信號后,產生停止信號(P),結束傳輸。

  在發送和接收過程中,有的事件不只是標志了我們上面提到的狀態位,還可能同時標志主機狀態之類的狀態位,而且讀了之后還需要清除標志位,比較復雜。我們可使用STM32 標准庫函數來直接檢測這些事件的復合標志,降低編程難度。

 

視頻資料

(stm32直流電機驅動)
http://www.makeru.com.cn/live/1392_1218.html?s=45051

PWM脈寬調制技術
http://www.makeru.com.cn/live/4034_2146.html?s=45051
基於STM32講解串口操作
http://www.makeru.com.cn/live/1758_490.html?s=45051

( ADC讀取光照傳感器)
http://www.makeru.com.cn/live/1392_1004.html?s=45051


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM