51uwb.cn

标题: 有关Jlink调试时读取SPI数据失败问题 [打印本页]

作者: maybe0524    时间: 2020-4-13 18:00
标题: 有关Jlink调试时读取SPI数据失败问题
本帖最后由 maybe0524 于 2020-4-15 10:30 编辑

遇到一个现象,Jlink调试的时候,SPI读DWM1000的ID号全部是FF,多尝试软硬复位现象仍是这样。
完全断电,然后上电才能读取OK。
我想问下在实际项目里边,会遇到这样的现象吗?这会影响到我的选择,是不是要额外添加一个开关,用于异常时断电。

Normal case:
DEBUG [00000284]: dmw use for TAG
DEBUG [00000288]: device_id: 0xdeca0130(=? 0xdeca0130).


作者: 蓝点无限    时间: 2020-4-13 19:00
init pass了,读取是0XFFFFFFF?
如果是0xFFFFFF,继续后面执行,是否可以测距或者定位?
作者: maybe0524    时间: 2020-4-13 22:01
本帖最后由 maybe0524 于 2020-4-14 11:13 编辑

如果是0xffffffff,继续后面执行,会直接跑进段错误的while (1)循环里边去了哦。晚点我可以把堆栈的信息贴上来。

Update:

看这个堆栈,貌似跟线程调度有关系,但如果我在判断ID不对的时候,不让程序往下运行,那么就不会出现段错误吧。
不知道读取不到ID号跟调度之间有什么关系。
源码:https://github.com/maybe524/AIBR ... V1.1_16MHz_V1.3.git
分支:AIBRAIN_RTOS

作者: maybe0524    时间: 2020-4-14 11:17
蓝点无限 发表于 2020-4-13 19:00
init pass了,读取是0XFFFFFFF?
如果是0xFFFFFF,继续后面执行,是否可以测距或者定位?

已经回复你了
作者: 蓝点无限    时间: 2020-4-14 11:41
maybe0524 发表于 2020-4-14 11:17
已经回复你了

把硬件模块后面的版本号给我发下
作者: maybe0524    时间: 2020-4-14 11:46
蓝点无限 发表于 2020-4-14 11:41
把硬件模块后面的版本号给我发下

板子后边的版本拍照

作者: tuzhuke    时间: 2020-4-14 20:55
maybe0524 发表于 2020-4-14 11:46
板子后边的版本拍照

我检查了你提供的硬件和软件,主要怀疑是DWM1000 复位问题,
1 检查连线,发现配置正确

  1. #ifdef STM32F10X_HD
  2.         #define DW1000_RSTn                                        GPIO_Pin_0
  3.         #define DW1000_RSTn_GPIO                        GPIOA
  4. #else
  5.         #define DW1000_RSTn                                        <font color="#ff0000">GPIO_Pin_12</font>
  6.         #define DW1000_RSTn_GPIO                        <font color="#ff0000">GPIOB</font>
  7. #endif
复制代码
如果你对代码进行移植,建议修改成如下方式
  1. #define DW1000_RSTn                                        GPIO_Pin_12
  2. #define DW1000_RSTn_GPIO                        GPIOB
复制代码

2  检查reset时序
  1. void reset_DW1000(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;

  4.     // Enable GPIO used for DW1000 reset
  5.     GPIO_InitStructure.GPIO_Pin = DW1000_RSTn;
  6.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.     GPIO_Init(DW1000_RSTn_GPIO, &GPIO_InitStructure);

  9.     //drive the RSTn pin low
  10.     GPIO_ResetBits(DW1000_RSTn_GPIO, DW1000_RSTn);

  11.     //put the pin back to tri-state ... as input
  12.     GPIO_InitStructure.GPIO_Pin = DW1000_RSTn;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(DW1000_RSTn_GPIO, &GPIO_InitStructure);

  16.     deca_sleep(2);
  17. }
复制代码
尝试修改为如下:
  1. void reset_DW1000(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;

  4. // Enable GPIO used for DW1000 reset
  5. GPIO_InitStructure.GPIO_Pin = DW1000_RSTn;
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8. GPIO_Init(DW1000_RSTn_GPIO, &GPIO_InitStructure);
  9. <font color="#ff0000">GPIO_SetBits(DW1000_RSTn_GPIO, DW1000_RSTn);</font>
复制代码
3 在初始化DW1000前,使用软件方式对DW1000 进行reset
  1. <font color="#ff0000">    reset_DW1000();  </font>
  2.     spi_set_rate_low();
  3.     //dwt_configuresleepcnt(50);

  4.     if(dwt_initialise(DWT_LOADUCODE) == -1)
  5.     {
复制代码







作者: maybe0524    时间: 2020-4-15 10:29
tuzhuke 发表于 2020-4-14 20:55
我检查了你提供的硬件和软件,主要怀疑是DWM1000 复位问题,
1 检查连线,发现配置正确

多谢回复。我看我这部分的代码没做改动呀。使用默认的就如同你全部说的一样了。
作者: 蓝点无限    时间: 2020-4-15 13:55
maybe0524 发表于 2020-4-15 10:29
多谢回复。我看我这部分的代码没做改动呀。使用默认的就如同你全部说的一样了。

上面提到的代码和你现在用的不一样,你自己对比下
作者: maybe0524    时间: 2020-4-15 15:19
蓝点无限 发表于 2020-4-15 13:55
上面提到的代码和你现在用的不一样,你自己对比下

看到了,话说这回复里边的编码风格,看得眼花呀。就看见一个不一样的地方:
1、这个是一样的
2、GPIO_ResetBits(DW1000_RSTn_GPIO, DW1000_RSTn);
       改成:
       GPIO_SetBits(DW1000_RSTn_GPIO, DW1000_RSTn);
3、这个是一样的
作者: 蓝点无限    时间: 2020-4-15 15:41
maybe0524 发表于 2020-4-15 15:19
看到了,话说这回复里边的编码风格,看得眼花呀。就看见一个不一样的地方:
1、这个是一样的
2、GPIO_R ...

第二点,是拉低一段时间再拉高
作者: maybe0524    时间: 2020-4-15 16:01
蓝点无限 发表于 2020-4-15 15:41
第二点,是拉低一段时间再拉高

我验证一段时间看看




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3