太亏了,调试这玩意儿不写点啥记录下来简直亏成翔啊,原本DWM1000的官方例程就是基于STM32的,网上更是清一色的用32来控制DWM1000,本菜鸡要用的微控制器是KEA128,不是STM32,光是移植问题就足够原地爆炸了,何况之后还有双向收发测距…不说了,进入正题。
首先,经过一段时间的浸淫,总算对官方的例程有所了解,还被自愿地学了一波32(宝宝心里苦啊)硬件方面队友是根据datasheet的接线图画的原理图,这里把两张图都贴出来,连接上应该是没问题的:


接下来就是代码了,这里先贴出main函数的前一部分:

以上是STM32例程的初始化部分。第一句,peripherals_init(); STM32系统初始化,不用移植;第二句,lcd_display_str(APP_NAME); LCD显示字符串,不用移植;第三句,reset_DW1000(); DW1000复位函数,进去一看,是STM32的GPIO引脚配置:

简单来说就是先把DW1000的复位引脚设置为推挽输出然后拉低,再把它设置成模拟输入,延时2ms,那么,对应的KEA128程序如下:

回到main函数的第四句,spi_set_rate_low(); SPI配置为低速模式,为啥呢?有注释:

为了让DW1000初始化,必须将它的时钟暂时设置为晶振频率,初始化之后就可以将SPI配置成高速模式以获得更好的性能。是了,spi_set_rate_low(); 到 spi_set_rate_high(); 干的就是这个。接下来的问题是,对32来说SPI速度是多少才算是低速?

大概就是二分频四分频之类的,网上有人提到过:

而例程中STM32使用SPI2来控制LCD,用来和DW1000通信的是SPI1:

以72MHz来算,那么SPI1接口时钟32分频就是 72M / 32 = 2.25M,本菜鸡直接配置成3MHz,然后DW1000初始化部分去掉LCD的部分,剩下的直接Copy:

还差最后一步,底层函数重写。STM32和KEA128的SPI底层函数是不同的,要想顺利完成移植,底层移植才是真正的核心。重要,而且极易猝死…接下来又是愉快的挖STM32底层环节,个人解读SPI写函数如下:


SPI读也是类似的,唯一不同的就是两个for循环体:

因为KEA128只有一个SPI0通道,这个UWB测距本身也因为要做成模块的原因而只有DW1000一个从设备,所以KEA128为默认主机,SPI的片选CS硬件拉低,再去掉保留中断状态这一环节,移植到KEA128这边的时候就变成了下面这样:


好,移植暂时告一段落,现在测试KEA128和PC能否正常通信:
首先将之前的spi_init()函数与后面的DW1000初始化注释,然后UART0初始化,接收中断使能:

编写接收中断函数,收到信号后回复字符‘K’表示应答:

测试情况如下:

KEA128正常工作,且与PC间通信正常。接下来测试KEA128与DW1000间能否正常通信:

哦嚯,果然还是猝死了orz…
正常正常,一次就成功那就不是菜鸡了,接下来开始找原因。直接将dwt_readdevid()放到while(1)中,利用逻辑分析仪读取SPI四个引脚的状态:

附上官方给出的dwt_readdevid()函数说明:

再对比一下数据手册里的相关说明:

从收发格式上看MOSI线是没啥问题的,但是手册里还有一个简单的模型:

所以这个CSn是怎么回事啊喂!!??
之前使用的是KEA128自带的SPI模块,此次移植也是直接用KEA的库,底层函数这边没太注意,现在这节奏,不得不再去挖一波KEA的底层QAQ
先看看spi的初始化函数,然后在下面这一块发现了CSn之外的问题:

SPIN[spin]->C1 = (0| (pcs << SPI_C1_SSOE_SHIFT)          //配合C2_MODFEN位选择片选引脚的功能| SPI_C1_SPE_MASK                     //SPI 系统使能| SPI_C1_MSTR_MASK                    //SPI 模块配置为SPI 主机//| SPI_C1_SPIE_MASK                  //SPRF 或MODF 为1 时请求硬件中断//| SPI_C1_SPTIE_MASK                 //SPTEF 为1 时,请求硬件中断。//| SPI_C1_CPOL_MASK                  //0:高电平有效SPI 时钟(空闲时为低电平) 1:低电平有效SPI 时钟(空闲时为高电平)| SPI_C1_CPHA_MASK                    //0:SPSCK 上的第一个边沿出现在数据传输的第一个周期的中间 1:SPSCK 上的第一个边沿出现在数据传输的第一个周期的开始//| SPI_C1_LSBFE_MASK                 //1:SPI 串行数据传输从最低有效位开始);
SPIN[spin]->C2 = pcs << SPI_C2_MODFEN_SHIFT;            //配合C1_SSOE位选择片选引脚的功能
SPIN[spin]->BR = SPI_BR_SPR(spr) | SPI_BR_SPPR(sppr);   //设置波特率参数

CPHA位被置1了…底层啊orz…默默地把它注释掉,再看逻辑分析仪:

不是全部为FF了,DWM1000和KEA能进行通信了,但是后四次的数据传输读到的值全是7F,还是不对,得先让CSn的变化和官方给出的示意图相同才知道到底是啥情况。
目前的片选很烦,每传完一个字节就自己拉高,设备ID有32位四个字节啊,这样根本没办法正常传输嘛,行,不要这个片选了,直接用gpio控制,简单粗暴。修改SPI初始化函数如下:

  spi_init(spi0,NOT_PCS,MASTER,2.25*1000*1000);gpio_init(B0,GPO,1);

直接把片选脚单独拉出来控制,这样的话之前的两个底层函数的首尾就都需要分别加上gpio_set(B0,0);和gpio_set(B0,1);来表示片选信号。
修改完毕后,也不看波形了,直接利用uart把读到ID的发回来:

和库里的设备ID对上了,ojbk,至此DWM1000初始化成功,后续开始Double-sidedTwo-way Ranging的移植。

基于DWM1000的UWB测距调试(一)相关推荐

  1. 基于DWM1000的STM32F103C8T6的三维室内定位(一)

    自小马写了一篇 [基于DWM1000的stm32f103c8测距调试(一)] 之后,有不少的朋友联系我一起学习DWM1000的测距,一起学习进步很大.这次小马打算在尝试一下开源一下基于DWM1000的 ...

  2. UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位

    UWB定位 三基站加一个标签UWB相关资料 dwm1000模块 uwb定位 ds-twr测距 dw1000模块,双边双向测距,研创物联代码,最多支持4基站8标签测距,基站和标签.信道.速率等配置可通过 ...

  3. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  4. UWB测距原理及实现

    1.测距 距离(长度)是最常用的物理量之一,距离的测量是我们日常生活中最常见的,如日常生活工作中的物体的长度尺寸测量,人身高的测量. 长度是一维空间的度量,是点到点的距离.长度的国际单位是" ...

  5. 汽车数字钥匙设计03:UWB测距原理

    传统PEPS钥匙及蓝牙钥匙采用场景RSSI来进行定位测距,而UWB是基于时间戳来进行定位测距的. IEEE 802.15-4z-2020标准列出UWB主要有三种定位测距方式:SS-TWR.DS-TWR ...

  6. 基于matlab的dsp调试方法,基于Matlab7.0的DSP调试

    基于Matlab7.0的DSP调试 通过Matlab7.0中的CCSLink与CCS3.3软件连接,实现对DSP程序的调试. CCSLink的主要特点:在MATLAB环境下完成对DSP器件的调试.数据 ...

  7. matlab车辆测距,一种基于单目视觉的车辆测距方法

    一种基于单目视觉的车辆测距方法 [专利说明]一种基于单目视觉的车辆测距方法 所属技术领域 [0001] 本发明属于目标检测与测距领域,尤其涉及一种基于单目视觉的车辆测距方法. [背景技术] [0002 ...

  8. electron 打开调试_构建基于 iOS 模拟器的前端调试方案

    作者:imyzf 本文将为大家介绍自动化控制 iOS 模拟器的原理,为开发基于 iOS 模拟器的前端调试方案提供帮助. 我们在开发 iOS App 内的前端页面时,有一个很大的痛点,页面无法使用 Sa ...

  9. 室内定位---UWB测距及定位原理

    室内定位---UWB测距及定位原理

  10. 【毕业设计】基于单片机的红外测距系统设计与实现 - c51 物联网 stm32

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 4.1 红外测距原理 4.2 红外测距常用算法 4.3 三角法测距原理 4.4 红外测距传感器特点 5 部分实现代码 6 最后 1 简介 ...

最新文章

  1. 【 FPGA 】控制数码管动态扫描显示的小实验
  2. C/C++/Java 的基本数据类型
  3. 车载wince系统刷界面ui_2020年值得关注的10个UI设计趋势!
  4. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】
  5. oracle 查询所有组合,Oracle的组合条件查询
  6. 【Gitlab】GIT回滚master分支到指定tag版本 并提交远程仓库
  7. 通过分析双色球历史中奖数据-增加机选号码中奖概率
  8. 【jvm我能讲两小时056】说说Parallel old收集器的特点以及使用场景?
  9. Dell 3620 加装SSD遇到的磁盘100%的坑
  10. 【MacM1+PyCharm+PyQt5】记录一次Pycharm有Pyqt5环境但无代码提示的解决流程
  11. 计算机意识状态在线场所,科学网—浅谈计算机意识的有效范围 - 于金辉的博文...
  12. lambdaquerywrapper in使用样例
  13. php时间计算,计算本周一或周日,上周一或周日,下周一
  14. Vitalik:单个 Slot 实现最终确认的路径
  15. Springboot高考志愿填报信息管理系统毕业设计-附源码
  16. 基于圆展开自适应三边测量算法的室内定位
  17. 数据结构第二版(朱昌杰版)习题八答案
  18. Webug4.0-webshell爆破 ssrf
  19. Task6:文本函数查找函数
  20. SAP-SD-销售订单SO的可用性检查功能

热门文章

  1. SQLSERVER2008-数据库可疑的解决步骤
  2. i3wm 获取window class
  3. java gbk编码_java 中文转GBK码
  4. 骆驼IPTV后端源码+前端APP
  5. eeglab加载显示脑电数据,eeglab简单操作
  6. 用yolov5训练kitti数据集
  7. win10下安装Vm15添加虚拟机的总结
  8. iphone编辑过的录音怎么还原_ios录音误剪怎么恢复
  9. Zbrush学习笔记十——制作毛发、模型减面
  10. MySQL 源码下载教程