蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛

正文:

首先将SS 原理介绍中的图片拿过来,将图片印在脑海里。

对于DeviceA 和 DeviceB来说,初始化代码都一样,而后面部分是一个while循环,一直执行测距任务。

DeviceA(ex_06a_ss_twr_init ) 部分代码

 tx_poll_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, );
dwt_writetxfctrl(sizeof(tx_poll_msg), ); /* Start transmission, indicating that a response is expected so that reception is enabled automatically after the frame is sent and the delay
* set by dwt_setrxaftertxdelay() has elapsed. */
dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED); /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
{ };

上述过程主要完成任务:发送数据以及打开接收器等待数据

DWM1000 发送数据通常只需要调用三个函数即可: dwt_writetxdata  dwt_writetxfctrl  dwt_starttx

dwt_writetxdata 指定发送什么数据,上述代码发送的数据是  tx_poll_msg,另外两个参数分别是发送数据长度,以及要将数据放到DWM1000 发送缓存的offset(默认设置为0即可)

dwt_writetxfctrl   发送控制参数设定,这个基本也是不需要修改,第一个参数是发送数据长度,第二个参数告诉DWM1000 从发送缓存那个offset 开始发送(也就是说,并不是放到发送缓存中的数据就会被发送出去)

dwt_starttx:启动发送,一共参数,可以按位控制,上述代码中第一个控制是否里面发送或者是延时发送,第二个控制是否在一定时间后打开接收器。

注意:在调试过程中,如果需要发送数据后再接收一个数据,通常需要使用DWT_RESPONSE_EXPECTED,而且要考虑POLL_TX_TO_RESP_RX_DLY_UUS,这个参数在dwt_setrxaftertxdelay中设定。

DWM1000 有很多事件,也有对应的标志flag,例如发送数据,对应的发送成功标志,接收数据,有对应的接收成功标志,当然也有fail的标志,具体可以参见《dw1000_user_manual.pdf》的 Register file: 0x0F – System Event Status Register。

事件flag 有很多,我们在基础实验中基本只会遇到上述代码中的 SYS_STATUS_TXFRS /SYS_STATUS_RXFCG/SYS_STATUS_ALL_RX_ERR,分表表示发送成功标志、接收成功标志以及接收错误,其中接收错误标志其实代码中是很多flag 的或,例如数据帧错误,timeout 等。所有flag 都是写1 清0.

完成上述代码分析,再看剩余两行代码

 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
/* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
3 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
4 { };

第一行是在发送之前,将可能的发送完成标志位清除,后面的while 循环是等待flag 置起来,也就是在等待DeviceB发送来的无线数据(并不是无限期等待,等待时间timeout 上面的代码直接设置过了)。

上述代码分析完成了DeviceA 在A点的任务。

DeviceB 代码分析

DeviceB的代码在ex_06b_ss_twr_resp目录,同样有dwm1000初始化,这个所有dwm1000 基础工程都一样,剩余部分也是一个while1 大循环。现在拿出部分代码,分析DeviceB在B点的动作。

         /* Activate reception immediately. */
dwt_rxenable(); /* Poll for reception of a frame or error/timeout. See NOTE 6 below. */
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
{ }; if (status_reg & SYS_STATUS_RXFCG)
{
uint32 frame_len; /* Clear good RX frame event in the DW1000 status register. */
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG); /* A frame has been received, read it into the local buffer. */
frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
if (frame_len <= RX_BUFFER_LEN)
{
dwt_readrxdata(rx_buffer, frame_len, );
} /* Check that the frame is a poll sent by "SS TWR initiator" example.
* As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
rx_buffer[ALL_MSG_SN_IDX] = ;
if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == )
{
uint32 resp_tx_time; /* Retrieve poll reception timestamp. */
poll_rx_ts = get_rx_timestamp_u64();

上面代码摘自ex_06b_ss_twr_resp while 大循环部分代码

首先是 dwt_rxenable(0), 这个作用是强制打开接收器,参数为timeout,设置为0,意思就是一直打开。 后面的while在Device 中已经看到,是等待接收数据,如果接收成功,SYS_STATUS_RXFCG 被置为1。 可以看到除了判断SYS_STATUS_RXFCG 还判断了SYS_STATUS_ALL_RX_ERR,这个是所有RX 可能出现ERROR 合集事件,我们期望的结果是SYS_STATUS_RXFCG ,弱实际中由于干扰接收到错误的信息SYS_STATUS_ALL_RX_ERR 会被置起来,也会退出while 等待,会接着执行后面的else,else的任务是清除SYS_STATUS_ALL_RX_ERR ,然后重新回到大while 循环等待接收数据。

假如接收到数据,就会执行if 判断力的代码,首先清除接收标志SYS_STATUS_RXFCG,然后通过两个API读取数据长度以及数据

 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
if (frame_len <= RX_BUFFER_LEN)
{
dwt_readrxdata(rx_buffer, frame_len, );
}

后面的判断是判断数据类型

  if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == )

在DWM1000 基础例子中,有很多种不同的数据,数据通常包括三部分(A+B+C),A是数据头,B是实际用户希望传输的数据,C是两byte 校验码,其中A部分是Device之前相互约定,C是DWM1000 自动生成的,B根据实际应用更改。

在SS-TWR中,有两种信息,分别是 rx_poll_msg 和 tx_resp_msg ,poll_msg是DeviceA 发送给DeviceB的,而 resp_meg 是DeviceB发送给DeviceA 的,而在DS-TWR中会有更多信息,这个完全可以自由扩展。

而代码中通过if 判断,判断信息是DeviceA发送给DeviceB的poll_msg后,紧接着就读取了自己接收数据的时刻

  poll_rx_ts = get_rx_timestamp_u64();

注意:虽然 get_rx_timestamp_u64 不是标准dwt API,但是这个函数里面是直接调用API实现的,保持下来以后可以直接当API使用。

以上代码就是DeviceB 在B 时刻接收数据的代码。

DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]的更多相关文章

  1. DWM1000 测距原理简单分析 之 SS-TWR

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 超宽带测距,使用的TOF(time of fly) 的方式,也就是计算无线电磁波传输时 ...

  2. DWM1000 测距原理简单分析 之 SS-TWR代码分析1 -- [蓝点无限]

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 这一篇内容主要是通过官方源码理解SS-TWR 细节 代码下载链接:https://download.c ...

  3. 一个简单C程序的汇编代码分析

    几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 int g(int x) { ; } int f(int ...

  4. 【DWM1000】 code 解密2一 工程初始化代码分析

    instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...

  5. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  6. 简单C程序生成的汇编代码分析

    首先给出完整的C代码: int g(int x) { ; } int f(int x) { return g(x); } int main(void) { )+; } 使用命令:gcc –S –o h ...

  7. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  8. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  9. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

随机推荐

  1. 信号(1): signal

    1. 头文件#include <signal.h> 2. 功能设置某一信号的对应动作 3. 函数原型void (*signal(int signum,void(* handler)(int ...

  2. 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)

    一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源. Exit:退出某一个资源. 测试案例:开启5个线程同时对一个变量进行 ...

  3. webpack学习笔记——sourcemap(使用webpack打包的项目如何调试代码)

    [webpack]devtool里的7种SourceMap模式是什么鬼? 里面详细介绍了7种模式的区别,和建议使用. webpack sourcemap 选项多种模式的一些解释 两篇文章大同小异,第一 ...

  4. C# 执行oracle sql 语句出现中文不兼容的问题

    最近我用C#调用 操作oracle 数据库 出现了一个问题就是 我的查询语中的条件语句 含有中文 字符在C#中查询不了 ,但是在pl sql  中能够正常的查询出来. 这个原因是 C# 执行orccl ...

  5. struts2简单入门-配置文件-struts.xml

    struts.xml 作用:配置struts中的action,result,package,全局action,result,等等. 基本文件格式: <?xml version="1.0 ...

  6. docker创建Redis集群

    开始工作: yum install wegt ##安装下载工具 yum install net-tools ##安装网络工具 yum install tree ##安装tree命令(方便查看集群配置文 ...

  7. html超出显示省略号

    <span>装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花& ...

  8. easyui系列一 下拉框之组合框combobox

    一.基础组合框 示例 <select class="easyui-combobox" name="state" style="width:200 ...

  9. having的用法

    转载:http://blog.csdn.net/oathevil/article/details/5521757 where和having: “Where” 是一个约束声明,使用Where来约束来自于 ...

  10. Docker设置http代理

    在国内由于不可描述的原因无法访问Google等网站,但是作为一枚挨踢人士,无法使用Google搜索,在使用Ctrl + C技能时是抓狂的:特别是当下Docker.Kubernetes等容器技术火热的时 ...