基于DWM1000的UWB测距调试(一)
太虧了,調(diào)試這玩意兒不寫點啥記錄下來簡直虧成翔啊,原本DWM1000的官方例程就是基于STM32的,網(wǎng)上更是清一色的用32來控制DWM1000,本菜雞要用的微控制器是KEA128,不是STM32,光是移植問題就足夠原地爆炸了,何況之后還有雙向收發(fā)測距…不說了,進入正題。
 首先,經(jīng)過一段時間的浸淫,總算對官方的例程有所了解,還被自愿地學了一波32(寶寶心里苦啊)硬件方面隊友是根據(jù)datasheet的接線圖畫的原理圖,這里把兩張圖都貼出來,連接上應該是沒問題的:
 
 
 接下來就是代碼了,這里先貼出main函數(shù)的前一部分:
 
以上是STM32例程的初始化部分。第一句,peripherals_init(); STM32系統(tǒng)初始化,不用移植;第二句,lcd_display_str(APP_NAME); LCD顯示字符串,不用移植;第三句,reset_DW1000(); DW1000復位函數(shù),進去一看,是STM32的GPIO引腳配置:
 
簡單來說就是先把DW1000的復位引腳設置為推挽輸出然后拉低,再把它設置成模擬輸入,延時2ms,那么,對應的KEA128程序如下:
 
回到main函數(shù)的第四句,spi_set_rate_low(); SPI配置為低速模式,為啥呢?有注釋:
 
為了讓DW1000初始化,必須將它的時鐘暫時設置為晶振頻率,初始化之后就可以將SPI配置成高速模式以獲得更好的性能。是了,spi_set_rate_low(); 到 spi_set_rate_high(); 干的就是這個。接下來的問題是,對32來說SPI速度是多少才算是低速?
 
 
大概就是二分頻四分頻之類的,網(wǎng)上有人提到過:
 
而例程中STM32使用SPI2來控制LCD,用來和DW1000通信的是SPI1:
 
以72MHz來算,那么SPI1接口時鐘32分頻就是 72M / 32 = 2.25M,本菜雞直接配置成3MHz,然后DW1000初始化部分去掉LCD的部分,剩下的直接Copy:
 
還差最后一步,底層函數(shù)重寫。STM32和KEA128的SPI底層函數(shù)是不同的,要想順利完成移植,底層移植才是真正的核心。重要,而且極易猝死…接下來又是愉快的挖STM32底層環(huán)節(jié),個人解讀SPI寫函數(shù)如下:
 
 
 SPI讀也是類似的,唯一不同的就是兩個for循環(huán)體:
 
因為KEA128只有一個SPI0通道,這個UWB測距本身也因為要做成模塊的原因而只有DW1000一個從設備,所以KEA128為默認主機,SPI的片選CS硬件拉低,再去掉保留中斷狀態(tài)這一環(huán)節(jié),移植到KEA128這邊的時候就變成了下面這樣:
 
 
 好,移植暫時告一段落,現(xiàn)在測試KEA128和PC能否正常通信:
 首先將之前的spi_init()函數(shù)與后面的DW1000初始化注釋,然后UART0初始化,接收中斷使能:
 
 編寫接收中斷函數(shù),收到信號后回復字符‘K’表示應答:
 
 測試情況如下:
 
KEA128正常工作,且與PC間通信正常。接下來測試KEA128與DW1000間能否正常通信:
 
 哦嚯,果然還是猝死了orz…
 正常正常,一次就成功那就不是菜雞了,接下來開始找原因。直接將dwt_readdevid()放到while(1)中,利用邏輯分析儀讀取SPI四個引腳的狀態(tài):
 
 附上官方給出的dwt_readdevid()函數(shù)說明:
 
 再對比一下數(shù)據(jù)手冊里的相關說明:
 
 從收發(fā)格式上看MOSI線是沒啥問題的,但是手冊里還有一個簡單的模型:
 
 所以這個CSn是怎么回事啊喂!!??
 之前使用的是KEA128自帶的SPI模塊,此次移植也是直接用KEA的庫,底層函數(shù)這邊沒太注意,現(xiàn)在這節(jié)奏,不得不再去挖一波KEA的底層QAQ
 先看看spi的初始化函數(shù),然后在下面這一塊發(fā)現(xiàn)了CSn之外的問題:
CPHA位被置1了…底層啊orz…默默地把它注釋掉,再看邏輯分析儀:
 
 不是全部為FF了,DWM1000和KEA能進行通信了,但是后四次的數(shù)據(jù)傳輸讀到的值全是7F,還是不對,得先讓CSn的變化和官方給出的示意圖相同才知道到底是啥情況。
 目前的片選很煩,每傳完一個字節(jié)就自己拉高,設備ID有32位四個字節(jié)啊,這樣根本沒辦法正常傳輸嘛,行,不要這個片選了,直接用gpio控制,簡單粗暴。修改SPI初始化函數(shù)如下:
直接把片選腳單獨拉出來控制,這樣的話之前的兩個底層函數(shù)的首尾就都需要分別加上gpio_set(B0,0);和gpio_set(B0,1);來表示片選信號。
 修改完畢后,也不看波形了,直接利用uart把讀到ID的發(fā)回來:
 
 和庫里的設備ID對上了,ojbk,至此DWM1000初始化成功,后續(xù)開始Double-sidedTwo-way Ranging的移植。
總結
以上是生活随笔為你收集整理的基于DWM1000的UWB测距调试(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Docker删除容器命令
- 下一篇: 华硕电脑安装键盘灯驱动步骤
