历史上的今天
返回首页

历史上的今天

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

正在发生

2021年07月28日 | 使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信

2021-07-28 来源:eefocus

本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础。

1. 准备工作

硬件准备

  • 开发板

首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):

  • DW1000模块

这里我连接到DW1000官方评估板上,直接与DW1000芯片通信:

  • 连接方法

首先查看DW1000官方评估板预留的外接控制器SPI接口(J6接口)的引脚说明:

外部供电接口(J7)的引脚说明:

① 首先将DW1000官方评估板上的S1、S2拨码开关全部拨为OFF,这样配置之后才可以外接控制器。

② 按照下图选择端子,配置为外部供电方式:

③ 在本文的测试需要中,将这些接口中的SPI相关接口(CSn、SCK、MISO、MOSI)连接到小熊派的SPI接口即可,但是为了以后移植驱动方便,将WAKEUP、IRQ接口也连接到小熊派的普通GPIO即可。

④ 将板子上J7处的供电引脚连接到小熊派的5V供电处。

整体连接完成后如图:

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

  • 准备一个串口调试助手,这里我使用的是Serial Port Utility;

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:
mark

搜索并选中芯片STM32L431RCT6:
mark

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;

  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

mark

配置DW1000控制GPIO

按照之前所述,DW1000模块需要额外配置的GPIO有两个:

以太网模块引脚名GPIO作用
WAKEUPPA8DW1000唤醒引脚
IRQPC9中断引脚

唤醒引脚配置为输出模式即可:

中断引脚需要接收来自DW1000的中断,所以需要配置EXTI外部中断引脚:

配置SPI1接口

本实验中,我将DW1000模块接到了SPI1接口,引脚对应表如下:

需要注意,SPI片选引脚不通过硬件SPI外设来控制,而是配置为普通GPIO,手动控制。

以太网模块引脚MCU引脚
MISOPA6(SPI1_MISO)
MOSIPA12(SPI1_MOSI)
SCSPA4(SPI1_NSS)
SCLKPA1(SPI1_SCK)

配置SPI接口的时候有三个需要注意的点:

① 分频系数;
② CPOL:CLK空闲时候的电平为高电平或者低电平;
③ CPHA:在第1个时钟边缘采样,还是在第2个时钟边缘采样;

接下来开始配置SPI1外设,首先配置SPI1外设的模式和引脚:

因为选择了不使用硬件SPI外设控制片选引脚,所以需要手动配置片选引脚PA4:

DW1000手册中给出的SPI总线时钟为稳定后20Mhz,否则3Mhz,本文中配置为3Mhz以下;

对于SPI工作模式,DW1000四种模式都支持,默认为模式0,选择CPOL空闲时为LOW的模式,CPHA手册中给出为第一个时钟沿;

综上所述,时序参数配置如下:

配置串口

开发板板载了一个CH340z换串口,连接到USART1。

接下来开始配置USART1:

配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:
mark

生成工程设置

代码生成设置

最后设置生成独立的初始化文件:

生成代码

点击GENERATE CODE即可生成MDK-V5工程:
mark

3. 重定向printf函数到USART1

参考:【STM32Cube_09】重定向printf函数到串口输出的多种方法。


4. DW1000测试函数

要测试DW1000是否正常工作,只需要测试是否可以通过SPI总线读取器件ID即可。


在main.c中添加头文件:


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include

/* USER CODE END Includes */


添加测试函数:


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

uint32_t dw1000_read_device_id(void)

{

HAL_StatusTypeDef status;

uint8_t header = 0x00;

uint32_t device_id;


HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

status = HAL_SPI_Transmit(&hspi1,&header, 1, 1000);

if (status != HAL_OK) {

printf("send header fail, err is %drn", status);

return 0;

}

status = HAL_SPI_Receive(&hspi1, (uint8_t *)&device_id, 4, 500);

if (status != HAL_OK) {

printf("read device id fail, err is %drn", status);

return 0;

}

return device_id;

}


/* USER CODE END 0 */


接着在main函数中定义测试变量:


/* USER CODE BEGIN 1 */

uint32_t device_id;

/* USER CODE END 1 */


在main函数中调用测试函数:


/* USER CODE BEGIN 2 */

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


device_id = dw1000_read_device_id();

if (device_id != 0) {

printf("device id is 0x%8xrn", device_id);

} else {

printf("device id read failrn");

}

 /* USER CODE END 2 */


编译,下载到开发板中,运行,在串口助手查看读取结果,若能正常读取到器件ID(0xDECA0130)则证明可以正常与DW1000通信:


至此,DW1000测试完成,下节将移植DW1000官方驱动。

推荐阅读

史海拾趣

Chenmoun Enterprise Ltd公司的发展小趣事

作为一个有社会责任感的企业,Chenmoun Enterprise Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的环境污染和资源浪费。同时,公司还积极参与公益事业,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象,也增强了公司的社会影响力。

以上这些故事虽然基于虚构,但它们展示了一个电子企业可能经历的发展路径和关键成功因素。这些因素包括技术创新、全球化战略、品质控制、研发投入和社会责任等。当然,每个企业的具体情况和发展道路都会有所不同,但这些故事可以作为参考,帮助您理解电子行业企业的发展历程。

HANBIT Electronics公司的发展小趣事

Chenmoun Enterprise Ltd成立之初,专注于研发和生产电子产品的基础元件。随着技术的不断发展,公司敏锐地把握了市场趋势,开始研发具有创新性的芯片技术。通过不懈的努力,Chenmoun成功推出了性能卓越、成本更低的芯片产品,迅速占据了市场份额,并逐渐在电子行业内崭露头角。

Arima Lasers Corp公司的发展小趣事

随着企业规模的扩大和影响力的提升,Arima Lasers Corp开始关注社会责任和可持续发展问题。公司积极参与公益事业,支持环保项目和社会福利事业。同时,公司也致力于推动绿色生产和循环经济,通过技术创新和节能减排等措施,降低生产过程中的环境影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上五个故事是基于一般电子行业发展规律而虚构的,并非针对“Arima Lasers Corp”这一具体公司的真实描述。在实际情况中,每个公司的发展都有其独特的历程和故事,需要具体根据公司的历史、文化和业务情况进行了解和分析。

Advantech公司的发展小趣事

随着产品线的丰富和技术的成熟,Arima Lasers Corp开始积极寻求市场拓展的机会。公司首先与一些知名的电子设备制造商建立了合作关系,为其提供定制的激光解决方案。这些合作不仅帮助公司扩大了市场份额,也提升了品牌知名度。随后,Arima Lasers Corp进一步拓展了国际市场,与海外企业开展技术交流和贸易往来,推动了公司的全球化发展。

FORYARD公司的发展小趣事

在20世纪80年代初,FORYARD公司由一群电子工程师在硅谷创立。起初,公司专注于研发高性能的半导体芯片,但面临激烈的市场竞争和技术壁垒。为了突破重围,FORYARD决定聚焦于低功耗、高集成度的微控制器(MCU)领域。经过数年的潜心研发,公司成功推出了一款具有革命性创新的MCU产品,凭借其出色的性能和价格优势,迅速在智能家居和可穿戴设备市场占据一席之地。这一成功不仅为公司赢得了市场认可,也为后续的技术创新和业务拓展奠定了坚实基础。

Anatech Electronics Inc公司的发展小趣事

随着业务的不断扩展,FORYARD意识到全球化布局的重要性。1995年,公司决定在中国设立研发中心和生产基地,以利用当地丰富的人才资源和成本优势。这一战略决策极大地提升了FORYARD的产能和研发效率,同时也使其能够更好地服务全球客户。此后,FORYARD还陆续在欧洲、亚洲等地建立了多个分支机构,形成了覆盖全球的研发、生产和销售网络。通过全球化布局,FORYARD不仅增强了自身的市场竞争力,还促进了全球电子产业的交流与合作。

问答坊 | AI 解惑

Intel被迫放宽上网本分辨率规格限制:允许采用1366x768规格

据台湾 PC 业者表示,尽管 Intel 仍无意放宽上网本的 10 寸LCD屏幕尺寸门坎,但却容许采用较高分辨率的面板规格,因此各家厂商将会在短期内推出分辨率更高的上网本产品,无疑令上网本的实用性大大提升。 据了解, Intel 容许业者采用更高的分辨率 ...…

查看全部问答>

贴片三极管上的印字,与真实型号对照表

贴片三极管上的印字,与真实型号对照表…

查看全部问答>

FAN-OUT 警告怎样用编程的方法避免?

如果大家使用Quartus 软件编译VHDL语言或VERILOG语言,使用LEVEL 3 告警层级,将会产生很多FAN-OUT告警,怎样处理。特别是用编程方法,怎样避免?…

查看全部问答>

汇编问题~

MACRO         MOV_PC_LR                 [ THUMBCODE             bx lr         &n ...…

查看全部问答>

国内首个中文“开放源码硬件社区”诞生

开放源码软件Linux是大家广为熟知的,但你听说过“开放源码硬件”吗?中国电子学会和FPGA领域的老大美国赛灵思公司 (Xilinx)联手,最近将“开放源码硬件”这一理念创新地引入了刚刚揭开帷幕的“Xilinx杯中国高校开放源码硬件创新大赛”中,推出了国 ...…

查看全部问答>

highlight:c#中调用EVC开发的.dll问题

http://group.eeworld.net/aawolf_mobile/topic/2aa41dba-eefc-4bc4-8232-ed1191c645b0.aspx 我遇的问题和帖子里面的一样。问题在:CommSend这边没有反应了。代码如下: (原帖问题解决了但没有给出解决方法。请各路高手帮忙) //////////// ...…

查看全部问答>

【MSP430共享】用VB实现PC机与MSP430单片机串行通信的研究

摘 要: 串行通信已经成为计算机与其他设备进行数据交换的最广泛的途径之一。本文主要论述了P C机与 MS P 4 3 0单片机之间实现串行通信的硬 件设计; 以及如何利用MS P 4 3 0的串口通信模块和VB提供的串行通讯控件 MS C o mm来实现 P C机与 Ms P 4 ...…

查看全部问答>

为什么我这个程序下到板子里 会出现跑了一会儿就停止了或者距离远一些也停止了呢?

为什么我这个程序下到板子里 会出现跑了一会儿就停止了或者距离远一些也停止了呢?#include <stm32f10x_lib.h>#include \"sys.h\"#include \"usart.h\"  #include \"delay.h\" #include \"led.h\" #include \"key.h\"  ...…

查看全部问答>

USB的smsc3320的VBUS

在用SMSC3320做Device时,总线供电,线上VBUS=5V,结果一1K电阻,在3320的VBUS输入端测得电压1.5V,是否正常?我用的是Device模式,是否可以不要VBUS? 另外,3320的VDD33输出为0,VBAT=5V,是不是内部LDO损坏? 我在DP脚外界1.5k电阻与3.3V想拉 ...…

查看全部问答>

贴一个12F683AD采集的例程,双通道。

//******************************** #include         \"Use.h\" #include        \"Ver.H\" #include #define MAX_REF                (5000)  &nb ...…

查看全部问答>