历史上的今天
返回首页

历史上的今天

今天是:2025年07月28日(星期一)

正在发生

2021年07月28日 | DW1000开发笔记(四)DW1000使用轮询方式发送数据

2021-07-28 来源:eefocus

一、移植官方示例

1. 复制官方示例文件

将官方驱动库中example下的第一个示例移植过来:

复制到之前移植的STM32CubeMX生成的工程文件中,并重命名文件为simple_tx_example.c:

将其添加到MDK工程中:

2. 修改官方示例文件

① 修改替换头文件:

② 修改函数名,修改打印和延时函数:

添加两处打印信息:

修改完成。


3. 调用示例代码

修改main.c,移除我们之前自己添加的所有测试代码。


接着先引入外部定义:


/* USER CODE BEGIN PFP */

extern int example_application_entry(void);

/* USER CODE END PFP */


然后在main函数中调用:


/* USER CODE BEGIN 2 */

printf("DW1000 UWB ic port on BearPi board By Mculover666rn");


example_application_entry();

 

/* USER CODE END 2 */


需要注意:


① 此函数需要在GPIO、USART、SPI外设初始化完成之后调用;

② 此函数中已经包含while(1)循环,所以此函数之后的代码无效。


4. 移植结果

编译、下载程序,在串口助手中查看打印日志:


示例程序移植成功。


二、示例程序分析

1. 轮询方式发送流程

2. 写入数据到缓冲区API

DW1000配置API的定义在deca_device_api.h中,实现在deca_device.c中,其原型如下:


int dwt_writetxdata(uint16 txFrameLength, uint8 *txFrameBytes, uint16 txBufferOffset) ;


该函数将用户提供的待发送数据写入DW1000发送缓冲区。


入参有三个,意义如下表:

参数意义
txFrameLength发送数据帧的总大小,包括两个字节的CRC校验数据,最大1023,标准PHR模式允许最多127字节
txFrameBytes指向用户待发送数据
txBufferOffset指定DW1000 发送缓冲区中开始写入数据的偏移量

返回值也有两个:

返回值意义
DWT_SUCCESS写入成功
DWT_ERROR写入错误

在本示例中,发送的帧是802.15.4e标准闪烁,包含12个字节:

static uint8 tx_msg[] = {0xC5, 0, 'D', 'E', 'C', 'A', 'W', 'A', 'V', 'E', 0, 0};

  • 第0个字节:帧类型(0xc5表示闪烁)

  • 第1个字节:帧序列号,随着每次的新帧递增;

  • 第2-9个字节:Device ID(实际产品中应该唯一);

  • 第10-11个字节:CRC校验值,由DW1000自动设置;

3. 配置发送帧控制寄存器API

该API的定义在deca_device_api.h中,实现在deca_device.c中,其原型如下:

void dwt_writetxfctrl(uint16 txFrameLength, uint16 txBufferOffset, int ranging)


该函数用来在发送之前配置发送帧控制寄存器。

入参有三个,意义如下表:

参数意义
txFrameLength发送数据帧的总大小,包括两个字节的CRC校验数据,最大1023,标准PHR模式允许最多127字节
txBufferOffset指定DW1000 发送缓冲区中开始写入数据的偏移量
ranging如果这是一个范围帧,为1,否则为0

4. 立即开始发送数据API

该API的定义在deca_device_api.h中,实现在deca_device.c中,其原型如下:

int dwt_starttx(uint8 mode)


该函数用来立即开始一次发送。

入参只有一个,意义如下表:

意义
0立即发送,不期待回应
1延迟发送,不期待回应
2立即发送,期待回应(所以在发送完成之后自动打开接收器)
3延迟发送,期待回应(所以在发送完成之后自动打开接收器)

这些值都有对应的宏定义:

// Defined constants for "mode" bitmask parameter passed into dwt_starttx() function.

#define DWT_START_TX_IMMEDIATE      0

#define DWT_START_TX_DELAYED        1

#define DWT_RESPONSE_EXPECTED       2


返回值也有两个:

返回值意义
DWT_SUCCESS发送成功
DWT_ERROR发送错误(如果延迟时间已过,则延迟发送失败)

5. 查询中断标志寄存器

while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))  { };


dwt_read32bitreg用来读取DW1000中一个32位的寄存器,SYS_STATUS_ID表示系统状态寄存器(System event Status Register)的ID:


#define SYS_STATUS_ID           0x0F            /* System event Status Register */


SYS_STATUS_TXFRS表示该寄存器中的TXFRS位,该位在发送完成后会被设置为1:


#define SYS_STATUS_TXFRS        0x00000080UL    /* Transmit Frame Sent: This is set when the transmitter has completed the sending of a frame */


查询到被设置之后,意味着发送完成,使用下面的这行代码向该位写1,则将该位清零,以便下次发送,另外,当下次发送使能后,该位会被自动清空:

dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);


至此,DW1000发送示例代码移植、学习完成。


推荐阅读

史海拾趣

FINECHIPS公司的发展小趣事

FINECHIPS公司自成立以来,始终将技术创新视为企业发展的核心驱动力。公司投入大量资源于研发部门,专注于集成电路(IC)和电子元器件的技术创新。在某一关键时期,FINECHIPS成功研发出一款高性能、低功耗的模拟开关芯片,该芯片凭借其卓越的性能迅速获得市场认可,不仅在国内市场占据一席之地,还成功打入国际市场,为公司带来了显著的品牌影响力和市场份额增长。

Cambridge Electronic Industries Ltd公司的发展小趣事

面对日益严峻的环境问题和社会责任,CEI积极响应可持续发展的号召。公司加大了对环保技术的研发投入,推出了多款节能、环保的电子产品。同时,CEI还关注员工福利和社会公益事业,积极参与社会捐赠和公益活动。展望未来,CEI将继续坚持技术创新和可持续发展战略,为电子行业的繁荣和发展做出更大的贡献。

通过以上五个故事,我们可以看到Cambridge Electronic Industries Ltd公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和可持续发展等方面的努力,逐渐成为了电子行业的佼佼者。

Hifn Inc公司的发展小趣事

CEI的发展历程中,技术创新一直是其核心竞争力。公司不断投入研发资源,探索新的电子技术和应用领域。在某一时期,CEI成功研发出了一款具有革命性的电子产品,该产品在性能、稳定性和成本方面均达到了行业领先水平。这一产品的推出,不仅为CEI带来了可观的经济效益,更重要的是,它为公司树立了技术创新和产品质量的标杆,进一步巩固了CEI在电子行业中的地位。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

为了适应全球电子市场的快速发展,AIE公司积极实施全球化战略。公司在多个国家和地区设立了分支机构或办事处,以便更好地服务当地客户。同时,AIE还积极参加国际电子展会和论坛,与全球各地的合作伙伴和客户建立了广泛的联系。这些举措不仅拓展了AIE的市场份额,也提升了公司的国际影响力。

安碁科技(AKER)公司的发展小趣事

在电子行业快速发展的背景下,安碁科技始终坚持持续创新和客户导向的经营理念。公司不断投入研发资源,推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。同时,安碁科技也注重与客户的沟通和合作,深入了解客户的需求和反馈,不断优化产品和服务。这种以客户为中心的经营模式,使得安碁科技在市场上赢得了良好的声誉和口碑。

这五个故事只是安碁科技发展历程中的一部分,但它们充分展示了公司在电子行业中的崛起和发展。安碁科技凭借其卓越的技术实力、品质管理和创新能力,在激烈的市场竞争中脱颖而出,成为行业的佼佼者。未来,随着电子行业的不断发展和变化,安碁科技将继续保持创新和进取的精神,为客户和市场带来更多优质的产品和服务。

Gumstix公司的发展小趣事
检查压敏元件是否老化或受到污染,必要时更换新的压敏元件。同时,也可以考虑调整电路参数以提高灵敏度。

问答坊 | AI 解惑

新手一定要看的学习笔记 -ARM开发

以下问题常被问到,我就想到哪说到哪吧。   一 首先说说ARM的发展     可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位。 广义的嵌入式无非几种:传统的什么51、AVR、PIC称做嵌入式微控制器 ...…

查看全部问答>

一次维修TCD的经历(转)

自从转职做仪器维修应用以来,有很多的第一次:第一次参观GC生产车间;第一次安装调试;第一次培训客户操作;第一次更换GC电路板;第一次更换电机;第一次......今天把自己一次更换TCD热导元件的经历发布出来,和版友交流! 1.首先是检测TCD的损 ...…

查看全部问答>

想用S3C2440+GPS模块实现简单的GPS功能

各位老大,我的ARM开发板是FL2440,系统是WINCE 5.0,本人想DIY个车载GPS,学习学习,想问问各位老大,常用的GPS模块有哪些?电子地图是自己绘制,还是利用其他公司提供的地图。有没有免费的可用电子地图?用mapinfo可以吗? 只要能实现简单的功能就 ...…

查看全部问答>

驱动入门级的问题,麻烦高人指点下,谢谢。

NTSTATUS HelloDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp) {         NTSTATUS ntStatus = STATUS_SUCCESS;         PIO_STACK_LOCATION IrpStack = NULL;       &nbs ...…

查看全部问答>

关于访问外部RAM的数据问题

TAB:DB 00H,01H,02H,03H 我怎么更改TAB中第二块的值? 用MOVX吗?…

查看全部问答>

100~200价位的GSM+GPRS模块哪个性能比较稳定?广和通的怎样?

RT,现在要把以前用单片机430做的远程医疗产品移植到ARM上,想找个比较稳定的gprs模块,但不知道选择哪块,比如有 SIMcom的900b, 西门子的MC52i, 华为的MG323等等,广和通的听说性能不错,就是比较新,怕不稳定,求达人建议~~…

查看全部问答>

STM8S 的ADC1 使用问题

最近几天整STM8S105 的ADC1,很是郁闷,现在说下问题所在: 通过手动启动ADC1及读ADC1都正常; 但是,现在我是想实现ADC1通过本身的中断,我在中断里去读取ADC1的值.为什么我中能第一次进中断后,就再进不了中断了. 希望大家有谁实现这功能的指教下.多 ...…

查看全部问答>

MSP430G2553

今天奋斗了一个晚上终于实现了第一个程序,跟大伙分享一下喜悦! …

查看全部问答>

求整合好的代码

请问一下,mspg2553(测温度的那个代码)的代码怎么整合到g2452(就是那个风火轮的那个代码)代码中?…

查看全部问答>

DM642 CMOS图像采集

看来坛子里搞过DM642的前辈真不少,我也是08年硕士毕设开始搞起的。 现在整理下当年的资料和调试笔记,就做了这个学习实验箱跟大家分享下经验。 想想当年走了不少弯路,光PCB打样都改了4次,焊接5~6次。还好是老板出钱 现在直接把每个模块的调试 ...…

查看全部问答>