軟件模擬協議:使用CPU直接控制通訊引腳(GPIO)的電平,產生出符合通訊協議標准的邏輯。
硬件實現協議:由STM32的I2C片上外設專門負責實現I2C通訊協議,只要配置好該外設,它就會自動根據協議要求產生通訊信號,收發數據並緩存起來,CPU只要檢測該外設的狀態和訪問數據寄存器,就能完成數據收發。這種由硬件外設處理I2C協議的方式減輕了CPU的工作,且使軟件設計更加簡單。
STM32的I2C外設可用作通訊的主機及從機,支持100Kbit/s和400Kbit/s的速率,支持7位、10位設備地址,支持DMA數據傳輸,並具有數據校驗功能。
STM32框架結構
1.通訊引腳
STM32芯片有多個I2C外設,它們的I2C通訊信號引出到不同的GPIO引腳上,使用時必須配置到這些指定的引腳,以《STM32F10x規格書》為准。
2.時鍾控制邏輯
SCL線的時鍾信號,由I 2C接口根據時鍾控制寄存器(CCR)控制,控制的參數主要為時鍾頻率。
• 可選擇I2C通訊的“標准/快速”模式,這兩個模式分別I2C對應 100/400Kbit/s的通訊速率。
• 在快速模式下可選擇SCL時鍾的占空比,可選Tlow/Thigh=2或 Tlow/Thigh=16/9模式。
• CCR寄存器中12位的配置因子CCR,它與I2C外設的輸入時鍾源共同作用,產生SCL時鍾。STM32的I2C外設輸入時鍾源為PCLK1。
計算時鍾頻率:
標准模式: Thigh=CCR*TPCKL1 Tlow = CCR*TPCLK1
快速模式中Tlow/Thigh=2時: Thigh = CCR*TPCKL1 Tlow = 2*CCR*TPCKL1
快速模式中Tlow/Thigh=16/9時: Thigh = 9*CCR*TPCKL1 Tlow = 16*CCR*TPCKL1
例如,我們的PCLK1=36MHz,想要配置400Kbit/s的速率,計算方式如下:
PCLK時鍾周期: TPCLK1 = 1/36000000
目標SCL時鍾周期: TSCL = 1/400000
SCL時鍾周期內的高電平時間: THIGH = TSCL/3
SCL時鍾周期內的低電平時間: TLOW = 2*TSCL/3
計算CCR的值: CCR = THIGH/TPCLK1 = 30
計算出來的CCR值寫入到寄存器即可。
3.數據控制邏輯
I2C的SDA信號主要連接到數據移位寄存器上,數據移位寄存器的數據來源及目標是數據寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA數據線。
• 當向外發送數據的時候,數據移位寄存器以“數據寄存器”為數據源,把數據一位一位地通過SDA信號線發送出去;
• 當從外部接收數據的時候,數據移位寄存器把SDA信號線采樣到的數據一位一位地存儲到“數據寄存器”中。
4.整體控制邏輯
整體控制邏輯負責協調整個I2C外設,控制邏輯的工作模式根據我們配置的“控制寄存器(CR1/CR2)”的參數而改變。
在外設工作時,控制邏輯會根據外設的工作狀態修改“狀態寄存器(SR1 和SR2)”,只要讀取這些寄存器相關的寄存器位,就可以了解I2C的工作狀態。