嵌入式系統(tǒng)低速接口-SPI
嵌入式系統(tǒng)低速接口-SPI(完結(jié))
對一款國產(chǎn)的3D霍爾傳感器的SPI封裝.上
這篇文章完成我們的封裝,以及在STM32F4的板子上面測試。
一次費我這么多引腳,我吐了??磥淼蒙螴IC,然后就是板子的引腳選擇注意在cubuMX里面和實際的板子絲印多次比對,一個中斷腳改了兩次,氣死我了。
BUTT_OUT 管腳用于檢測磁鐵與芯片之間的按鍵功能,并且也可以配置為 Trigger 模式,觸發(fā)單次測量。
INT:主機(jī)向芯片發(fā)送持續(xù)感應(yīng)模式或單次測量命令,芯片完成一次對應(yīng)測量項的測量后,INT 腳會置 1,并且在芯片發(fā)送讀取命令,讀回測量數(shù)據(jù)以前,都保持為 1。主機(jī)向芯片發(fā)送喚醒睡眠模式命令后,當(dāng)芯片周圍測量項的變化量超出寄存器中設(shè)定的變化閾值時,INT 腳會置 1,并且在芯片發(fā)送讀取命令,讀回測量數(shù)據(jù)以前,都保持為 1。
芯片開啟喚醒睡眠模式后,當(dāng)芯片周圍的某一測量項強(qiáng)度發(fā)生變化,且當(dāng)前強(qiáng)度與基準(zhǔn)值的差值,超出閾值寄存器中設(shè)定值時,芯片 INT 腳會拉高。在主機(jī)通過測量數(shù)據(jù)回讀幀(data Read Frame),一次性將測量數(shù)據(jù)讀回后,INT 腳拉低,否則保持為高電平。芯片 INT 腳不會主動拉低,即某一時刻被測量項的強(qiáng)度與基準(zhǔn)值差值,超出設(shè)定閾值,INT 腳拉高后,如果下一時刻,被測量項的強(qiáng)度減弱,此時差值低于設(shè)定閾值,但主機(jī)沒有讀回測量數(shù)據(jù),INT 腳并不會主動拉低。
除了重置芯片,其他命令發(fā)送完后芯片均會返回芯片運行狀態(tài)(status)說明。
重置
定義registerName變量,用于保存寄存器地址。
定義一個comWR數(shù)組,用于保存寫入命令的數(shù)據(jù)。
將要寫入的寄存器地址Register,左移2位后賦值給registerName。這里的左移2位很可能是因為寄存器地址需要以字(Word)對齊。
組裝寫入命令數(shù)據(jù):
comWR[0]寫入命令字WRITE_REGISTER
comWR[1]寫入要寫入數(shù)據(jù)的高8位
comWR[2]寫入要寫入數(shù)據(jù)的低8位
comWR[3]寫入目標(biāo)寄存器地址registerName
這樣就組裝好了一個完整的寄存器寫入命令。
所以這段代碼的主要作用就是根據(jù)傳入的寄存器地址Register和要寫入的數(shù)據(jù)writeData,規(guī)范地組裝成一個寄存器寫命令,保存在comWR數(shù)組中。
再來一段延時的代碼
定義一個uint8_t類型的循環(huán)變量i。
for循環(huán)從0循環(huán)到4,共執(zhí)行5次。
每次循環(huán)中調(diào)用__NOP()空操作。實際上是一個微秒級的延時函數(shù)
事實上,在HAL庫里面是有一個延時的函數(shù)的
獲取當(dāng)前的系統(tǒng)tick計數(shù)作為起始tick值。
將需要延時的ms數(shù)保存在wait變量中。
如果延時小于HAL_MAX_DELAY,添加一個系統(tǒng)tick頻率uwTickFreq,這個操作是為了保證至少延時1個tick。
循環(huán)查詢當(dāng)前tick和起始tick之差,直到大于或等于需要延時的tick數(shù)wait。
這樣就可以實現(xiàn)精確的ms級延時等待。
整體來說,這是一種常見且高效的延時實現(xiàn)方法,通過查詢系統(tǒng)tick計數(shù)器來判斷延時時間,避免了空輪詢耗時。
但是自帶的延時函數(shù)是ms的,我們需要ns的,所以上面就又寫了一個。
主機(jī)向芯片發(fā)送喚醒睡眠模式命令(0x28)
這個是設(shè)置的命令
芯片上電后,進(jìn)行內(nèi)部初始化,當(dāng)電源穩(wěn)定后讀取OTP的值到對應(yīng)的寄存器中,上電后4ms內(nèi)完成OTP的讀取,在上電后4ms內(nèi)不允許進(jìn)行通信,當(dāng)初始化完成后芯片進(jìn)入空閑狀態(tài),允許通信測量。
這里就這樣寫就行
這個就是一個中斷的接口
數(shù)據(jù)OK了以后,就設(shè)置為了,這個是引腳中斷。
讀取到這值以后
這個就是
定義counter變量,初始化為1,用于保存需讀取的數(shù)據(jù)計數(shù)。
定義com變量,用于保存讀取命令,其中包含了軸信息axis。
進(jìn)入for循環(huán),循環(huán)4次,對應(yīng)4個軸(XYZ)。
每次循環(huán):
根據(jù)axis的最低位值,如果為1則計數(shù)加2,如果為0則計數(shù)不變。
然后右移axis的位,判斷下一位。
這樣通過位運算判斷axis的每一位,根據(jù)每個軸是否啟用來累加計數(shù)。
最后counter保存總的需讀取數(shù)據(jù)計數(shù)。
接著把中斷號碼來還原,等著下次繼續(xù)
用于解析傳感器讀取回來的數(shù)據(jù),并計算出三軸xyz的數(shù)據(jù)。
主要邏輯是:
從DataReadFrame數(shù)組取出兩兩字節(jié)的數(shù)據(jù),分別對應(yīng)溫度t和三軸xyz。
對xyz各軸數(shù)據(jù),通過位運算(左移8位)和按位或運算來組合兩個字節(jié)的數(shù)據(jù)。
例如x軸,高字節(jié)DataReadFrame[3]左移8位,低字節(jié)DataReadFrame[4]不變,最后進(jìn)行按位或,就可以組合成16位有符號整數(shù)數(shù)據(jù)。
溫度t也是同樣的處理過程。
開始選擇SPI
對著數(shù)據(jù)手冊好好看
CS引腳
這個就是中斷了
TRIG
記得打開中斷開關(guān)
為了好計算,時鐘都是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
確定無誤
上傳成功
這里就是調(diào)試,但是我沒有磁鐵不知道是不是沒有感應(yīng)到信號
調(diào)試頁面
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
8959瀏覽量
153255 -
封裝
+關(guān)注
關(guān)注
128文章
8553瀏覽量
144859 -
SPI
+關(guān)注
關(guān)注
17文章
1785瀏覽量
94864 -
霍爾傳感
+關(guān)注
關(guān)注
0文章
42瀏覽量
10133
原文標(biāo)題:對一款國產(chǎn)的3D霍爾傳感器的SPI封裝.中
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
TMAG5170 3D霍爾效應(yīng)位置傳感器介紹
奧地利微電子推出3D霍爾傳感器AS5410
國內(nèi)首款!燦瑞科技發(fā)布基于3D霍爾技術(shù)的可編程3D霍爾傳感器
具有雜散磁場補(bǔ)償?shù)?b class='flag-5'>3D霍爾效應(yīng)位置傳感器

海伯森3D閃測傳感器斬獲創(chuàng)新產(chǎn)品金獎
3D霍爾效應(yīng)位置傳感器的基本原理及其應(yīng)用案例

TMAG5170D-Q1具有SPI接口的雙芯片高精度3D線性霍爾效應(yīng)傳感器數(shù)據(jù)表

TMAG5170 具有 SPI 接口的高精度 3D 線性霍爾效應(yīng)傳感器數(shù)據(jù)表

TMAG5170-Q1 具有 SPI 接口的高精度3D線性霍爾效應(yīng)傳感器數(shù)據(jù)表

適用于電器旋鈕的3D霍爾效應(yīng)傳感器

3D霍爾效應(yīng)傳感器在機(jī)器人設(shè)計中的機(jī)械優(yōu)勢

使用 TI 的霍爾效應(yīng)和線性 3D 霍爾效應(yīng)傳感器替代簧片開關(guān)應(yīng)用說明

評論