51uwb.cn

标题: 移植bphero_uwb程序,基站中断接收失败 [打印本页]

作者: tracy    时间: 2020-8-15 16:28
标题: 移植bphero_uwb程序,基站中断接收失败
本帖最后由 tracy 于 2020-8-15 16:33 编辑

移植坛主基于STM32F401的tuzhuke-twr_location_v1版本程序到stm32f072芯片;现在标签端程序运行时,dw1000的接收发送指示灯都会闪烁;但是基站端只有接收指示灯闪烁;调试基站端程序发现:基站接收程序能够进接收中断回调处理函数,但是一直卡在  if (status_reg & SYS_STATUS_RXFCG)这句,接收失败。因为我的板子没有PA,移植过程中我直接把tuzhuke-twr_location_v1中的PA相关程序注释掉了,不知道有没有影响。我强制进入 if (status_reg & SYS_STATUS_RXFCG)语句,将接收到的数据打印出来,发现接收到的数据和标签发送的数据不一致。现在没有了调试思路,走投无路,来找坛主大神和坛友指导,万分感谢!

  1. int rx_main(void)
  2. {

  3.      dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);
  4.      //dwt_setrxtimeout(FINAL_RX_TIMEOUT_UUS);
  5.           //dwt_setpreambledetecttimeout(PRE_TIMEOUT);
  6.           dwt_setrxtimeout(0);
  7.     dwt_enableframefilter(DWT_FF_DATA_EN);
  8.     dwt_rxenable(0);
  9.     bphero_setcallbacks(Simple_Rx_Callback);
  10.     //KalMan_Init();

  11.     if(SHORT_ADDR == 0x0001)
  12.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
  13. //    if(SHORT_ADDR == 0x0002)
  14. //        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
  15. //    if(SHORT_ADDR == 0x0003)
  16. //        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
  17.     while (1)
  18.     {
  19.     }
  20. }
复制代码
  1. void Simple_Rx_Callback()
  2. {
  3.           uint32 status_reg = 0,i=0;
  4.     uint32 poll_tx_ts, resp_rx_ts, final_tx_ts;
  5.     uint32 poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32;
  6.     double Ra, Rb, Da, Db;
  7.     int64 tof_dtu;
  8.     char dist_str[16] = {0};
  9.     for (i = 0 ; i < FRAME_LEN_MAX; i++ )
  10.     {
  11.         rx_buffer[i] = '\0';
  12.     }
  13.     dwt_enableframefilter(DWT_FF_RSVD_EN);//disable recevie
  14.     status_reg = dwt_read32bitreg(SYS_STATUS_ID);
  15.     //printf("RECIEVE POLL MESSAGE00!\r\n");  
  16. <font color="#ff0000"><b>    if (status_reg & SYS_STATUS_RXFCG)</b></font>
  17.     {
  18.         /* A frame has been received, copy it to our local buffer. */
  19.         printf("RECIEVE POLL MESSAGE11!\r\n");  
  20.                         frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
  21.                        
  22.         if (frame_len <= FRAME_LEN_MAX)
  23.         {
  24.             dwt_readrxdata(rx_buffer, frame_len, 0);
  25.             msg_f = (srd_msg_dsss*)rx_buffer;
  26.             msg_f_send.destAddr[0] = msg_f->sourceAddr[0];
  27.             msg_f_send.destAddr[1] = msg_f->sourceAddr[1];
  28.             msg_f_send.seqNum = msg_f->seqNum;
  29.                                         //printf("RECIEVE DATA type:%c\r\n",msg_f->messageData[0]);
  30.                                         //printf("0x%04X <--> 0x%02X%02X\r\n",SHORT_ADDR,msg_f->sourceAddr[1],msg_f->sourceAddr[0]);
  31.             switch(msg_f->messageData[0])
  32.             {
  33.                                                         case 'P':
  34.                                                                           printf("RECIEVE DATA LEN:%d\r\n",frame_len);
  35.                                                                    // printf("RECIEVE DATA LEN:%u\r\n",msg_f->messageData[0]);
  36.                     msg_f_send.messageData[0]='A';//Poll ack message
  37.                     int temp = (int)(distance[msg_f_send.destAddr[0]]*100);//convert m to cm
  38.                     msg_f_send.messageData[1]=temp/100;
  39.                     msg_f_send.messageData[2]=temp%100;
  40. //                    dwt_writetxdata(ANCH_RESPONSE_MSG_LEN, (uint8 *)&msg_f_send, 0) ; // write the frame data
  41. //                    dwt_writetxfctrl(ANCH_RESPONSE_MSG_LEN, 0);
  42.                                                                     dwt_writetxdata(14, (uint8 *)&msg_f_send, 0) ; // write the frame data
  43.                     dwt_writetxfctrl(14, 0);
  44.                     //printf("RECIEVE POLL MESSAGE!\r\n");
  45.                     /* Start transmission. */
  46.                     dwt_starttx(DWT_START_TX_IMMEDIATE);
  47.                     //MUST WAIT!!!!!
  48.                     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  49.                     { };
  50.                                                                           poll_rx_ts = get_rx_timestamp_u64();

  51.                     break;

  52.                 case 'F':
  53.                     resp_tx_ts = get_tx_timestamp_u64();
  54.                     final_rx_ts = get_rx_timestamp_u64();
  55.                     final_msg_get_ts(&msg_f->messageData[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);
  56.                     final_msg_get_ts(&msg_f->messageData[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);
  57.                     final_msg_get_ts(&msg_f->messageData[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);

  58.                     poll_rx_ts_32 = (uint32)poll_rx_ts;
  59.                     resp_tx_ts_32 = (uint32)resp_tx_ts;
  60.                     final_rx_ts_32 = (uint32)final_rx_ts;
  61.                     Ra = (double)(resp_rx_ts - poll_tx_ts);
  62.                     Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);
  63.                     Da = (double)(final_tx_ts - resp_rx_ts);
  64.                     Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);
  65.                     tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));

  66.                     tof = tof_dtu * DWT_TIME_UNITS;
  67.                     distance_temp = tof * SPEED_OF_LIGHT;
  68.                     distance[msg_f_send.destAddr[0]] = distance_temp - dwt_getrangebias(config.chan,(float)distance_temp, config.prf);//¾ààë¼õ襽ÃÕyÏμêy
  69.                     //kalman filter
  70.                     //distance[msg_f_send.destAddr[0]] = KalMan(distance[msg_f_send.destAddr[0]]);
  71.                     printf("0x%04X <--> 0x%02X%02X :%.02f cm\n",SHORT_ADDR,msg_f_send.destAddr[1],msg_f_send.destAddr[0],distance[msg_f_send.destAddr[0]]);
  72. //                    sprintf(dist_str, "  Dis: %.02f m", distance[msg_f_send.destAddr[0]]);//m
  73. //                    OLED_ShowString(0, 6,dist_str);
  74.                     break;

  75.                 case 'M':
  76.                                                                                 USART_puts(&msg_f->messageData[1],16);
  77.                     break;

  78.                 default:
  79.                     break;
  80.             }
  81.         }
  82.         dwt_write32bitreg(SYS_STATUS_ID, (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR));
  83.         dwt_enableframefilter(DWT_FF_DATA_EN);
  84. //        dwt_setrxtimeout(0);
  85.         dwt_rxenable(0);
  86.     }
  87.     else
  88.     {
  89.         dwt_write32bitreg(SYS_STATUS_ID, (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR));
  90.         //enable recive again
  91.         dwt_enableframefilter(DWT_FF_DATA_EN);
  92.         dwt_rxenable(0);
  93.     }
  94. }
复制代码


作者: 蓝点无限    时间: 2020-8-15 16:42
你把你巴拉子工程能不能共享出来,大家一起搞搞,我手边正好有072 的主控
作者: 蓝点无限    时间: 2020-8-15 16:45
蓝点无限 发表于 2020-8-15 16:42
你把你巴拉子工程能不能共享出来,大家一起搞搞,我手边正好有072 的主控

stm32基础不好的话,想我这样的,最好一半一半移植。
先把标签下载好,用stm32F4,
然后改rx到072上,直到072 的基站和401的标签通信完毕,说明移植完成
作者: tracy    时间: 2020-8-15 17:21
蓝点无限 发表于 2020-8-15 16:45
stm32基础不好的话,想我这样的,最好一半一半移植。
先把标签下载好,用stm32F4,
然后改rx到072上, ...

坛主太谦虚了。。你都做出成品来了,还这么低调。
作者: tracy    时间: 2020-8-15 17:28
蓝点无限 发表于 2020-8-15 16:42
你把你巴拉子工程能不能共享出来,大家一起搞搞,我手边正好有072 的主控

可以的,只要能解决dw1000定位的问题,072的工程可以互通
作者: woshi123    时间: 2020-8-21 08:47
楼主解决了吗
作者: tracy    时间: 2020-9-23 10:40
问题早已解决,感谢坛主支持!
作者: qb123    时间: 2022-4-25 11:10
原来是这样啊




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