嵌入式系統低速接口-SPI(完結)
對一款國產的3D霍爾傳感器的SPI封裝.上
這篇文章完成我們的封裝,以及在STM32F4的板子上面測試。
一次費我這么多引腳,我吐了??磥淼蒙螴IC,然后就是板子的引腳選擇注意在cubuMX里面和實際的板子絲印多次比對,一個中斷腳改了兩次,氣死我了。
BUTT_OUT 管腳用于檢測磁鐵與芯片之間的按鍵功能,并且也可以配置為 Trigger 模式,觸發單次測量。
INT:主機向芯片發送持續感應模式或單次測量命令,芯片完成一次對應測量項的測量后,INT 腳會置 1,并且在芯片發送讀取命令,讀回測量數據以前,都保持為 1。主機向芯片發送喚醒睡眠模式命令后,當芯片周圍測量項的變化量超出寄存器中設定的變化閾值時,INT 腳會置 1,并且在芯片發送讀取命令,讀回測量數據以前,都保持為 1。
芯片開啟喚醒睡眠模式后,當芯片周圍的某一測量項強度發生變化,且當前強度與基準值的差值,超出閾值寄存器中設定值時,芯片 INT 腳會拉高。在主機通過測量數據回讀幀(data Read Frame),一次性將測量數據讀回后,INT 腳拉低,否則保持為高電平。芯片 INT 腳不會主動拉低,即某一時刻被測量項的強度與基準值差值,超出設定閾值,INT 腳拉高后,如果下一時刻,被測量項的強度減弱,此時差值低于設定閾值,但主機沒有讀回測量數據,INT 腳并不會主動拉低。
除了重置芯片,其他命令發送完后芯片均會返回芯片運行狀態(status)說明。
重置
定義registerName變量,用于保存寄存器地址。
定義一個comWR數組,用于保存寫入命令的數據。
將要寫入的寄存器地址Register,左移2位后賦值給registerName。這里的左移2位很可能是因為寄存器地址需要以字(Word)對齊。
組裝寫入命令數據:
comWR[0]寫入命令字WRITE_REGISTER
comWR[1]寫入要寫入數據的高8位
comWR[2]寫入要寫入數據的低8位
comWR[3]寫入目標寄存器地址registerName
這樣就組裝好了一個完整的寄存器寫入命令。
所以這段代碼的主要作用就是根據傳入的寄存器地址Register和要寫入的數據writeData,規范地組裝成一個寄存器寫命令,保存在comWR數組中。
再來一段延時的代碼
定義一個uint8_t類型的循環變量i。
for循環從0循環到4,共執行5次。
每次循環中調用__NOP()空操作。實際上是一個微秒級的延時函數
事實上,在HAL庫里面是有一個延時的函數的
獲取當前的系統tick計數作為起始tick值。
將需要延時的ms數保存在wait變量中。
如果延時小于HAL_MAX_DELAY,添加一個系統tick頻率uwTickFreq,這個操作是為了保證至少延時1個tick。
循環查詢當前tick和起始tick之差,直到大于或等于需要延時的tick數wait。
這樣就可以實現精確的ms級延時等待。
整體來說,這是一種常見且高效的延時實現方法,通過查詢系統tick計數器來判斷延時時間,避免了空輪詢耗時。
但是自帶的延時函數是ms的,我們需要ns的,所以上面就又寫了一個。
主機向芯片發送喚醒睡眠模式命令(0x28)
這個是設置的命令
芯片上電后,進行內部初始化,當電源穩定后讀取OTP的值到對應的寄存器中,上電后4ms內完成OTP的讀取,在上電后4ms內不允許進行通信,當初始化完成后芯片進入空閑狀態,允許通信測量。
這里就這樣寫就行
這個就是一個中斷的接口
數據OK了以后,就設置為了,這個是引腳中斷。
讀取到這值以后
這個就是
定義counter變量,初始化為1,用于保存需讀取的數據計數。
定義com變量,用于保存讀取命令,其中包含了軸信息axis。
進入for循環,循環4次,對應4個軸(XYZ)。
每次循環:
根據axis的最低位值,如果為1則計數加2,如果為0則計數不變。
然后右移axis的位,判斷下一位。
這樣通過位運算判斷axis的每一位,根據每個軸是否啟用來累加計數。
最后counter保存總的需讀取數據計數。
接著把中斷號碼來還原,等著下次繼續
用于解析傳感器讀取回來的數據,并計算出三軸xyz的數據。
主要邏輯是:
從DataReadFrame數組取出兩兩字節的數據,分別對應溫度t和三軸xyz。
對xyz各軸數據,通過位運算(左移8位)和按位或運算來組合兩個字節的數據。
例如x軸,高字節DataReadFrame[3]左移8位,低字節DataReadFrame[4]不變,最后進行按位或,就可以組合成16位有符號整數數據。
溫度t也是同樣的處理過程。
開始選擇SPI
對著數據手冊好好看
CS引腳
這個就是中斷了
TRIG
記得打開中斷開關
為了好計算,時鐘都是1Mhz
第一次通過
error: call to undeclared library function 'printf' with type 'int (const char *, ...)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
這個是忘了加頭文件,以及如果用microLIB就要加stdio
這個是因為,你在文件層面的添加是無用的,記得在這里添加
OK
確定無誤
上傳成功
這里就是調試,但是我沒有磁鐵不知道是不是沒有感應到信號
調試頁面
審核編輯:湯梓紅
-
接口
+關注
關注
33文章
8526瀏覽量
150862 -
封裝
+關注
關注
126文章
7794瀏覽量
142741 -
SPI
+關注
關注
17文章
1701瀏覽量
91345 -
霍爾傳感
+關注
關注
0文章
40瀏覽量
10003
原文標題:對一款國產的3D霍爾傳感器的SPI封裝.中
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論