STM32控制三軸加速度傳感器實現(xiàn)分析
1。邏輯結構
初始化各外設(RCC,GPIO,SPI,NVIC,I2C,LCD)——檢測MEMS并顯示檢測狀態(tài)——在死循環(huán)中不斷查詢加速度值并描畫。
2。硬件原理
與該程序相關的硬件連接圖:
MEMS連接圖
MEMS引出腳與MCU(左)、IO擴展(右下)連接圖
LCD連接圖
LCD引出腳與MCU(左)、IO擴展(右上)連接圖
從圖中可以看出,MEMS使用I2C接口SCL和SDA連接MCU;LCD使用SPI3接口連接MCU。兩者的其余引出腳(INT1, 2, TouchScreenXY+-)均連接到IO擴展。IO擴展部分的原理圖為:
它由兩塊touchScreen控制芯片組成,同樣掛在I2C總線上。該部分的原理還沒弄清,代碼中怎么控制這兩塊芯片的動作,MEMS INT1,2連接擴展口的意義何在,是如何作用的,有待進一步研究。
MEMS控制原理
在程序動作前,需要初始化系統(tǒng)中斷向量表(使用NVIC_SetVectorTable函數(shù)),配置系統(tǒng)時鐘、使能各外設時鐘(SystemInit,RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd)。
1。GPIO
PB6,PB7分別作為SCL和SDA。查找STM32芯片手冊的AFIO部分,
將PB6,PB7作為SCL和SDA使用不需要進行重映射,因此只需初始化其模式、速度。
2。I2C
(1)外設時鐘頻率
外設時鐘頻率fPCLK1需寫入CR2寄存器的最低六位,寫入值的單位為MHz。因此,把RCC中PCLK1的頻率值除以1000,000后,放入CR2中。
(2)CCR (clock control register)
該值控制master模式下的I2C時鐘。
I2C傳輸分為standard mode (fSCL = 100kHz) 和fast mode (fSCL = 400kHz)。fast mode分為 tlow/thigh = 2 和 tlow/thigh = 16/9 兩種。圖示如下。16/9類同。
CCR值的公式為:
standard mode:
Thigh= CCR * TPCLK1
Tlow = CCR * TPCLK1
fast mode:
比例為2:
Thigh = CCR * TPCLK1
Tlow = 2 * CCR * TPCLK1
比例為16/9:
Thigh = 9 * CCR * TPCLK1
Tlow = 16 * CCR * TPCLK1
因此,計算CCR值的方法為:
standard mode:
CCR = Thigh / TPCLK1 = 0.5 * TSCL / TPCLK1 = fPCLK1 / (2 * fSCL)
(代碼中結構體的變量I2C_ClockSpeed即為fSCL)
fast mode:
比例為2:
CCR = Thigh / TPCLK1 = (1 / 3) * TSCL / TPCLK1 = fPCLK1 / (3 * fSCL)
比例為16/9:
CCR = fPCLK1 / (25 * fSCL)
在CCR中,standard mode下最小值為0x04,fast mode下為0x01。
(3)TRISE寄存器
該值設定master模式下的最大上升時間。計算方法為允許的最大SCL上升時間除以TPCLK1,所得商值加1。
在I2C bus specification中,standard mode 下最大時間為1000ns,fast mode下為300ns。
因此,TRISE計算方法為:
standard mode:
TRISE = 1000 * (10^(-9)) / TPCLK1 + 1 = fPCLK1 + 1
fast mode:
TRISE = 300 * (10^(-9)) / TPCLK1 + 1 = 300 * fPCLK1 / 1000 + 1
3。讀取MEMS中加速度數(shù)據(jù)
實現(xiàn)過程按照LIS302DL datasheet中給的時序
大致步驟為:允許ACK,發(fā)送起始位,發(fā)送外設寫地址,發(fā)送命令數(shù)據(jù),發(fā)送起始位,發(fā)送外設讀地址,(收到外設數(shù)據(jù)),禁用ACK,發(fā)送停止位,允許ACK,從DR寄存器讀數(shù)據(jù)。
發(fā)送和接收命令或地址數(shù)據(jù)的本質是讀寫DR寄存器。
每步執(zhí)行之后需要檢查SR1和SR2相應寄存器的狀態(tài),確認該步執(zhí)行完成后才能進行下一步。
對于外設讀寫地址,LIS302DL datasheet中有說明:當SDO接地時,外設地址SAD為00111010;master要發(fā)送的地址數(shù)據(jù)位SAD+W/R,W/R位,從MEMS讀數(shù)據(jù)時為1,向MEMS寫數(shù)據(jù)時為0。
在發(fā)送外設寫地址后,對MEMS的操作為:通過I2C寫入MEMS寄存器的地址,(通過I2C寫入對該寄存器的控制字)。
在發(fā)送外設讀地址后,對MEMS的操作為:關閉ACK,發(fā)送停止位,從DR讀取數(shù)據(jù)。
程序中用到的MEMS寄存器有:0x20 CTRL_REG1,選擇電源模式,選擇加速度檢測方向
0x27 STATUS_REG,各軸數(shù)據(jù)獲取和溢出狀況
0x29, 2B, 2D OUT_X,Y,Z 各軸輸出數(shù)據(jù)。
剩余問題:在I2C驅動中,對于外設時鐘頻率的賦值,匯編代碼中,MCU寄存器中為正確的值,但單步時發(fā)現(xiàn),賦值給時鐘頻率變量的值顯示不正確,無法賦給正確的值;最后計算結果為寄存器中數(shù)據(jù)的計算,因此是正確的。
若把變量聲明為static,匯編代碼中該變量的存儲位置發(fā)生變化。需要學習code, RO data, RW data和ZI data的職能。
中斷
設定某方向的加速度閾值,當傳感器測量值超過該閾值時,傳感器輸出中斷信號。信號通過IO擴展芯片的中斷管腳與MCU的GPIO相連,進而能在傳感器超過閾值時,系統(tǒng)進入ISR。
程序初始化時需要進行的與中斷有關的設定如下,設定都是通過對寄存器的改寫實現(xiàn)的:
MEMS:
設定輸出給IO擴展芯片管腳的中斷的高/低電平有效
設定中斷為非鎖存模式。(鎖存模式即中斷信號需要在讀取某個寄存器后才能清除)
設定中斷的方向和閾值。
IO擴展芯片:
設定輸出給MCU IO口的中斷的高/低電平有效,及l(fā)evel/pulse方式
使能全局中斷功能
使能芯片GPIO的中斷功能
使能綁定某些管腳的中斷功能
清除當前中斷寄存器各位狀態(tài)
MCU:
配置與IO擴展芯片中斷管腳連接的GPIO的參數(shù)
將該GPIO與相應EXTI綁定
設定EXTI相應線的使能,上升下降沿觸發(fā)
設定NVIC優(yōu)先級和使能
中斷發(fā)生,ISR執(zhí)行完成后需要進行的釋放操作如下:
IO擴展芯片:
清除GPIO中斷的掛起狀態(tài)
清除GPIO具體管腳中斷的掛起狀態(tài)
清除邊緣檢測、上升下降沿檢測狀態(tài)
MCU:
清除相應EXTI線上的掛起狀態(tài)
評論