久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11166|回復(fù): 8
收起左側(cè)

DW1000的官方keil源程序,發(fā)上來(lái)給各位用一下

  [復(fù)制鏈接]
ID:311878 發(fā)表于 2018-4-19 18:28 | 顯示全部樓層 |閱讀模式
這是官方標(biāo)準(zhǔn)程序,還可以使用。

單片機(jī)源程序如下:
  1. /*! ----------------------------------------------------------------------------
  2. *  @file    main.c
  3. *  @brief   Double-sided two-way ranging (DS TWR) initiator example code
  4. *
  5. *           This is a simple code example which acts as the initiator in a DS TWR distance measurement exchange. This application sends a "poll"
  6. *           frame (recording the TX time-stamp of the poll), and then waits for a "response" message expected from the "DS TWR responder" example
  7. *           code (companion to this application). When the response is received its RX time-stamp is recorded and we send a "final" message to
  8. *           complete the exchange. The final message contains all the time-stamps recorded by this application, including the calculated/predicted TX
  9. *           time-stamp for the final message itself. The companion "DS TWR responder" example application works out the time-of-flight over-the-air
  10. *           and, thus, the estimated distance between the two devices.
  11. *
  12. * @attention
  13. *
  14. * Copyright 2015 (c) Decawave Ltd, Dublin, Ireland.
  15. *
  16. * All rights reserved.
  17. *
  18. * @author Decawave
  19. */
  20. #include <string.h>
  21. #include <stdio.h>
  22. #include "deca_device_api.h"
  23. #include "deca_regs.h"
  24. #include "deca_sleep.h"
  25. #include "lcd.h"
  26. #include "port.h"

  27. /* Example application name and version to display on LCD screen. */
  28. #define APP_NAME "DS TWR INIT v1.1"

  29. /* Inter-ranging delay period, in milliseconds. */
  30. #define RNG_DELAY_MS 100

  31. /* Default communication configuration. We use here EVK1000's default mode (mode 3). */
  32. static dwt_config_t config = {
  33.     2,               /* Channel number. */
  34.     DWT_PRF_64M,     /* Pulse repetition frequency. */
  35.     DWT_PLEN_1024,   /* Preamble length. */
  36.     DWT_PAC32,       /* Preamble acquisition chunk size. Used in RX only. */
  37.     9,               /* TX preamble code. Used in TX only. */
  38.     9,               /* RX preamble code. Used in RX only. */
  39.     1,               /* Use non-standard SFD (Boolean) */
  40.     DWT_BR_110K,     /* Data rate. */
  41.     DWT_PHRMODE_STD, /* PHY header mode. */
  42.     (1025 + 64 - 32) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
  43. };
  44. /* Default antenna delay values for 64 MHz PRF. See NOTE 1 below. */
  45. #define TX_ANT_DLY 0
  46. #define RX_ANT_DLY 32899
  47. static uint8 rx_poll_msg[] = {0x00, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};
  48. static uint8 tx_resp_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'V', 'E', 'W', 'A', 0x10, 0x02, 0, 0, 0, 0};
  49. static uint8 rx_final_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  50.        
  51. /* Frames used in the ranging process. See NOTE 2 below. */
  52. static uint8 tx_poll_msg[] = {0x00, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};
  53. static uint8 rx_resp_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'V', 'E', 'W', 'A', 0x10, 0x02, 0, 0, 0, 0};
  54. static uint8 tx_final_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  55. /* Length of the common part of the message (up to and including the function code, see NOTE 2 below). */
  56. typedef signed long long int64;
  57. typedef unsigned long long uint64;
  58. static uint64 poll_rx_ts;
  59. static uint64 resp_tx_ts;
  60. static uint64 final_rx_ts;

  61. static double tof;
  62. static double distance,dist,dist2;
  63.        
  64. #define ALL_MSG_COMMON_LEN 10
  65. /* Indexes to access some of the fields in the frames defined above. */
  66. #define ALL_MSG_SN_IDX 2
  67. #define FINAL_MSG_POLL_TX_TS_IDX 10
  68. #define FINAL_MSG_RESP_RX_TS_IDX 14
  69. #define FINAL_MSG_FINAL_TX_TS_IDX 18
  70. #define FINAL_MSG_TS_LEN 4
  71. /* Frame sequence number, incremented after each transmission. */
  72. static uint32 frame_seq_nb = 0;

  73. /* Buffer to store received response message.
  74. * Its size is adjusted to longest frame that this example code is supposed to handle. */
  75. #define RX_BUF_LEN 20
  76. #define RX_BUF_LEN2 24
  77. static uint8 rx_buffer[RX_BUF_LEN+4];

  78. /* Hold copy of status register state here for reference, so reader can examine it at a breakpoint. */
  79. static uint32 status_reg = 0;

  80. /* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion factor.
  81. * 1 uus = 512 / 499.2 祍 and 1 祍 = 499.2 * 128 dtu. */
  82. #define UUS_TO_DWT_TIME 65536

  83. /* Delay between frames, in UWB microseconds. See NOTE 4 below. */
  84. /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
  85. #define POLL_TX_TO_RESP_RX_DLY_UUS 150
  86. /* This is the delay from Frame RX timestamp to TX reply timestamp used for calculating/setting the DW1000's delayed TX function. This includes the
  87. * frame length of approximately 2.66 ms with above configuration. */
  88. #define RESP_RX_TO_FINAL_TX_DLY_UUS 3100
  89. /* Receive response timeout. See NOTE 5 below. */
  90. #define RESP_RX_TIMEOUT_UUS 2700

  91. #define POLL_RX_TO_RESP_TX_DLY_UUS 2600
  92. /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */
  93. #define RESP_TX_TO_FINAL_RX_DLY_UUS 500
  94. /* Receive final timeout. See NOTE 5 below. */
  95. #define FINAL_RX_TIMEOUT_UUS 4300
  96. #define SPEED_OF_LIGHT 299702547
  97. /* Time-stamps of frames transmission/reception, expressed in device time units.
  98. * As they are 40-bit wide, we need to define a 64-bit int type to handle them. */
  99. typedef unsigned long long uint64;
  100. static uint64 poll_tx_ts;
  101. static uint64 resp_rx_ts;
  102. static uint64 final_tx_ts;

  103. /* Declaration of static functions. */
  104. static uint64 get_tx_timestamp_u64(void);
  105. static uint64 get_rx_timestamp_u64(void);
  106. static void final_msg_set_ts(uint8 *ts_field, uint64 ts);

  107. /*! ------------------------------------------------------------------------------------------------------------------
  108. * @fn main()
  109. *
  110. * @brief Application entry point.
  111. *
  112. * @param  none
  113. *
  114. * @return none
  115. */
  116. static void final_msg_get_ts(const uint8 *ts_field, uint32 *ts)
  117. {
  118.     int i;
  119.     *ts = 0;
  120.     for (i = 0; i < FINAL_MSG_TS_LEN; i++)
  121.     {
  122.         *ts += ts_field[i] << (i * 8);
  123.     }
  124. }
  125. void GPIO_Toggle(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  126. {
  127.         GPIO_WriteBit(GPIOx, GPIO_Pin, (BitAction)!GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin));
  128. }
  129. int fputc(int ch, FILE *f)

  130. {

  131. USART_SendData(USART1, (unsigned char) ch);// USART1 ???? USART2 ?

  132. while (!(USART1->SR & USART_FLAG_TXE));

  133. return (ch);


  134. }

  135. void USART_putc(char c)
  136. {
  137.         //while(!(USART2->SR & 0x00000040));
  138.         //USART_SendData(USART2,c);
  139.         /* e.g. write a character to the USART */
  140.         USART_SendData(USART1, c);

  141.         /* Loop until the end of transmission */
  142.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)        ;
  143. }

  144. void USART_puts(uint8_t *s,uint8_t len)
  145. {
  146.         int i;
  147.         for(i=0; i<len; i++)
  148.         {
  149.                 USART_putc(s[i]);
  150.         }
  151. }
  152. int ld[100];
  153. int LP(int tmp,uint8_t channel)
  154. {
  155. int data;
  156.         data = 0.7*ld[channel]+0.3*tmp;
  157.         ld[channel]=data;
  158.         return data;
  159. }
  160. uint16_t Checksum_u16(uint8_t* pdata, uint32_t len)
  161. {
  162.     uint16_t sum = 0;
  163.     uint32_t i;
  164.     for(i=0; i<len; i++)
  165.         sum += pdata[i];
  166.     sum = ~sum;
  167.     return sum;
  168. }
  169. void LED_blink(void)
  170. {
  171.         uint8_t ii;
  172.         for (ii=0;ii<10;ii++)
  173. {
  174.         GPIO_Toggle(GPIOA,LED_PIN);
  175.         deca_sleep(100);
  176. }
  177. }
  178. extern volatile unsigned long time32_reset;
  179. extern uint8_t Work_Mode;
  180. uint32 frame_len;
  181. uint8_t send[9];
  182. char dist_str[16] = {0};
  183. int32_t dis;
  184. double dID;
  185. uint8_t TAG_ID,ANCHOR_ID, jumptime=0;
  186. uint32_t rec_dist,hex_dist;
  187. uint16_t check;
  188. int main(void)
  189. {
  190.     /* Start with board specific hardware init. */
  191.     peripherals_init();//初始化外設(shè)

  192.     /* Display application name on LCD. */
  193.   //  lcd_display_str(APP_NAME);

  194.     /* Reset and initialise DW1000.
  195.      * For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum
  196.      * performance. */
  197.     reset_DW1000();//重啟DW1000 /* Target specific drive of RSTn line into DW1000 low for a period. */
  198.     spi_set_rate_low();//降低SPI頻率
  199.     dwt_initialise(DWT_LOADUCODE);//初始化DW1000
  200.     spi_set_rate_high();//回復(fù)SPI頻率

  201.     /* Configure DW1000. See NOTE 6 below. */
  202.     dwt_configure(&config);//配置DW1000

  203.     /* Apply default antenna delay value. See NOTE 1 below. */
  204.     dwt_setrxantennadelay(RX_ANT_DLY);                //設(shè)置接收天線延遲
  205.     dwt_settxantennadelay(TX_ANT_DLY);                //設(shè)置發(fā)射天線延遲

  206.     /* Set expected response's delay and timeout. See NOTE 4 and 5 below.
  207.      * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
  208.     dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);//設(shè)置發(fā)送后開啟接收,并設(shè)定延遲時(shí)間
  209.     dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);                                                //設(shè)置接收超時(shí)時(shí)間

  210.                 send[0]=0x6D;                                                                                        //串口數(shù)據(jù)
  211.                 send[1]=0xD6;                                                                                        //串口數(shù)據(jù)

  212.                 tx_poll_msg[6] = ANCHOR_ID;        //UWB POLL 包數(shù)據(jù)
  213.                 rx_resp_msg[6] = ANCHOR_ID;        //UWB RESPONSE 包數(shù)據(jù)
  214.                 tx_final_msg[6] = ANCHOR_ID;//UWB Fianl 包數(shù)據(jù)
  215.                
  216.                 rx_poll_msg[6] = ANCHOR_ID;
  217.                 tx_resp_msg[6] = ANCHOR_ID;
  218.                 rx_final_msg[6] = ANCHOR_ID;
  219.                
  220.                 tx_poll_msg[5] = TAG_ID;//UWB POLL 包數(shù)據(jù)
  221.                 rx_resp_msg[5] = TAG_ID;//UWB RESPONSE 包數(shù)據(jù)
  222.                 tx_final_msg[5] = TAG_ID;//UWB Fianl 包數(shù)據(jù)
  223.     /* Loop forever initiating ranging exchanges. */
  224.                 LED_blink();
  225.                 if(!Work_Mode)   //選擇發(fā)送模式(TAG標(biāo)簽)還是接收模式(ANCHOR基站)
  226.                 {
  227.     while (1)                        //發(fā)送模式(TAG標(biāo)簽)
  228.     {
  229.         /* Write frame data to DW1000 and prepare transmission. See NOTE 7 below. */
  230.         tx_poll_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  231.         dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);//將Poll包數(shù)據(jù)傳給DW1000,將在開啟發(fā)送時(shí)傳出去
  232.         dwt_writetxfctrl(sizeof(tx_poll_msg), 0);//設(shè)置超寬帶發(fā)送數(shù)據(jù)長(zhǎng)度

  233.         /* Start transmission, indicating that a response is expected so that reception is enabled automatically after the frame is sent and the delay
  234.          * set by dwt_setrxaftertxdelay() has elapsed. */
  235.         dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//開啟發(fā)送,發(fā)送完成后等待一段時(shí)間開啟接收,等待時(shí)間在dwt_setrxaftertxdelay中設(shè)置

  236.         /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
  237.         while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不斷查詢芯片狀態(tài)直到成功接收或者發(fā)生錯(cuò)誤
  238.         { };

  239.         /* Increment frame sequence number after transmission of the poll message (modulo 256). */
  240.         frame_seq_nb++;

  241.         if (status_reg & SYS_STATUS_RXFCG)//如果成功接收
  242.         {
  243.             uint32 frame_len;

  244.             /* Clear good RX frame event and TX frame sent in the DW1000 status register. */
  245.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器標(biāo)志位

  246.             /* A frame has been received, read it into the local buffer. */
  247.             frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;        //獲得接收到的數(shù)據(jù)長(zhǎng)度
  248.             if (frame_len <= RX_BUF_LEN)
  249.             {
  250.                 dwt_readrxdata(rx_buffer, frame_len, 0);   //讀取接收數(shù)據(jù)
  251.             }

  252.             /* Check that the frame is the expected response from the companion "DS TWR responder" example.
  253.              * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
  254.             rx_buffer[ALL_MSG_SN_IDX] = 0;
  255.             if (memcmp(rx_buffer, rx_resp_msg, ALL_MSG_COMMON_LEN) == 0)//判斷接收到的數(shù)據(jù)是否是response數(shù)據(jù)
  256.             {
  257.                 uint32 final_tx_time;

  258.                                                        
  259.                 /* Retrieve poll transmission and response reception timestamp. */
  260.                 poll_tx_ts = get_tx_timestamp_u64();                                                                                //獲得POLL發(fā)送時(shí)間T1
  261.                 resp_rx_ts = get_rx_timestamp_u64();                                                                                //獲得RESPONSE接收時(shí)間T4

  262.                 /* Compute final message transmission time. See NOTE 9 below. */
  263.                 final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//計(jì)算final包發(fā)送時(shí)間,T5=T4+Treply2
  264.                 dwt_setdelayedtrxtime(final_tx_time);//設(shè)置final包發(fā)送時(shí)間T5

  265.                 /* Final TX timestamp is the transmission time we programmed plus the TX antenna delay. */
  266.                 final_tx_ts = (((uint64)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包實(shí)際發(fā)送時(shí)間是計(jì)算時(shí)間加上發(fā)送天線delay

  267.                 /* Write all timestamps in the final message. See NOTE 10 below. */
  268.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//將T1,T4,T5寫入發(fā)送數(shù)據(jù)
  269.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_RESP_RX_TS_IDX], resp_rx_ts);
  270.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts);

  271.                 /* Write and send final message. See NOTE 7 below. */
  272.                 tx_final_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  273.                 dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);//將發(fā)送數(shù)據(jù)寫入DW1000
  274.                 dwt_writetxfctrl(sizeof(tx_final_msg), 0);//設(shè)定發(fā)送數(shù)據(jù)長(zhǎng)度
  275.                 dwt_starttx(DWT_START_TX_DELAYED);//設(shè)定為延遲發(fā)送

  276.                 /* Poll DW1000 until TX frame sent event set. See NOTE 8 below. */
  277.                 while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不斷查詢芯片狀態(tài)直到發(fā)送完成
  278.                 { };

  279.                 /* Clear TXFRS event. */
  280.                 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清楚標(biāo)志位

  281.                 /* Increment frame sequence number after transmission of the final message (modulo 256). */
  282.                 frame_seq_nb++;
  283.                                                                 time32_reset = 0;
  284.                                                                 GPIO_Toggle(GPIOA,LED_PIN);//LED閃爍
  285.                                                                 jumptime = 0;
  286.             }else{
  287.                                                         jumptime =5;//如果通訊失敗,將間隔時(shí)間增加5ms,避開因?yàn)槎鄻?biāo)簽同時(shí)發(fā)送引起的沖突。
  288.                                                 }
  289.         }
  290.         else
  291.         {
  292.             /* Clear RX error events in the DW1000 status register. */
  293.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
  294.                                                 jumptime =5;
  295.         }

  296.         /* Execute a delay between ranging exchanges. */
  297.         deca_sleep(RNG_DELAY_MS+jumptime);//休眠固定時(shí)間
  298.     }
  299.         }else{
  300.                 while (1)//接收模式(ANCHOR基站)
  301.     {
  302.         /* Clear reception timeout to start next ranging process. */
  303.         dwt_setrxtimeout(0);//設(shè)定接收超時(shí)時(shí)間,0位沒有超時(shí)時(shí)間

  304.         /* Activate reception immediately. */
  305.         dwt_rxenable(0);//打開接收

  306.         /* Poll for reception of a frame or error/timeout. See NOTE 7 below. */
  307.         while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不斷查詢芯片狀態(tài)直到接收成功或者出現(xiàn)錯(cuò)誤
  308.         { };

  309.         if (status_reg & SYS_STATUS_RXFCG)//成功接收
  310.         {
  311.            

  312.             /* Clear good RX frame event in the DW1000 status register. */
  313.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清楚標(biāo)志位

  314.             /* A frame has been received, read it into the local buffer. */
  315.             frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//獲得接收數(shù)據(jù)長(zhǎng)度
  316.             if (frame_len <= RX_BUFFER_LEN)
  317.             {
  318.                 dwt_readrxdata(rx_buffer, frame_len, 0);//讀取接收數(shù)據(jù)
  319.             }

  320.             /* Check that the frame is a poll sent by "DS TWR initiator" example.
  321.              * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
  322.             rx_buffer[ALL_MSG_SN_IDX] = 0;
  323.                                                         TAG_ID = rx_buffer[5];
  324.                                                         rx_poll_msg[5] = TAG_ID;//為多標(biāo)簽通訊服務(wù),防止一次通訊中接收到不同ID標(biāo)簽的數(shù)據(jù)
  325.                                                         tx_resp_msg[5] = TAG_ID;
  326.                                                         rx_final_msg[5] = TAG_ID;
  327.             if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == 0)//判斷是否是poll包數(shù)據(jù)
  328.             {
  329.                 uint32 resp_tx_time;

  330.                 /* Retrieve poll reception timestamp. */
  331.                 poll_rx_ts = get_rx_timestamp_u64();//獲得Poll包接收時(shí)間T2

  332.                 /* Set send time for response. See NOTE 8 below. */
  333.                 resp_tx_time = (poll_rx_ts + (POLL_RX_TO_RESP_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//計(jì)算Response發(fā)送時(shí)間T3。
  334.                 dwt_setdelayedtrxtime(resp_tx_time);//設(shè)置Response發(fā)送時(shí)間T3

  335.                 /* Set expected delay and timeout for final message reception. */
  336.                 dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);//設(shè)置發(fā)送完成后開啟接收延遲時(shí)間
  337.                 dwt_setrxtimeout(FINAL_RX_TIMEOUT_UUS);//接收超時(shí)時(shí)間

  338.                 /* Write and send the response message. See NOTE 9 below.*/
  339.                                                 //                memcpy(&tx_resp_msg[11],&dis,4);
  340.                 tx_resp_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  341.                 dwt_writetxdata(sizeof(tx_resp_msg), tx_resp_msg, 0);//寫入發(fā)送數(shù)據(jù)
  342.                 dwt_writetxfctrl(sizeof(tx_resp_msg), 0);//設(shè)定發(fā)送長(zhǎng)度
  343.                 dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//延遲發(fā)送,等待接收

  344.                 /* We assume that the transmission is achieved correctly, now poll for reception of expected "final" frame or error/timeout.
  345.                  * See NOTE 7 below. */
  346.                 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))///不斷查詢芯片狀態(tài)直到接收成功或者出現(xiàn)錯(cuò)誤
  347.                 { };

  348.                 /* Increment frame sequence number after transmission of the response message (modulo 256). */
  349.                 frame_seq_nb++;

  350.                 if (status_reg & SYS_STATUS_RXFCG)//接收成功
  351.                 {
  352.                     /* Clear good RX frame event and TX frame sent in the DW1000 status register. */
  353.                     dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚標(biāo)志位

  354.                     /* A frame has been received, read it into the local buffer. */
  355.                     frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;//數(shù)據(jù)長(zhǎng)度
  356.                     if (frame_len <= RX_BUF_LEN2)
  357.                     {
  358.                         dwt_readrxdata(rx_buffer, frame_len, 0);//讀取接收數(shù)據(jù)
  359.                     }

  360.                     /* Check that the frame is a final message sent by "DS TWR initiator" example.
  361.                      * As the sequence number field of the frame is not used in this example, it can be zeroed to ease the validation of the frame. */
  362.                     rx_buffer[ALL_MSG_SN_IDX] = 0;
  363.                     if (memcmp(rx_buffer, rx_final_msg, ALL_MSG_COMMON_LEN) == 0)//判斷是否為Fianl包
  364.                     {
  365.                         uint32 poll_tx_ts, resp_rx_ts, final_tx_ts;
  366.                         uint32 poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32;
  367.                         double Ra, Rb, Da, Db;
  368.                         int64 tof_dtu;

  369.                         /* Retrieve response transmission and final reception timestamps. */
  370.                         resp_tx_ts = get_tx_timestamp_u64();//獲得response發(fā)送時(shí)間T3
  371.                         final_rx_ts = get_rx_timestamp_u64();//獲得final接收時(shí)間T6

  372.                         /* Get timestamps embedded in the final message. */
  373.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);//從接收數(shù)據(jù)中讀取T1,T4,T5
  374.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);
  375.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);

  376.                         /* Compute time of flight. 32-bit subtractions give correct answers even if clock has wrapped. See NOTE 10 below. */
  377.                         poll_rx_ts_32 = (uint32)poll_rx_ts;//使用32位數(shù)據(jù)計(jì)算
  378.                         resp_tx_ts_32 = (uint32)resp_tx_ts;
  379.                         final_rx_ts_32 = (uint32)final_rx_ts;
  380.                         Ra = (double)(resp_rx_ts - poll_tx_ts);//Tround1 = T4 - T1  
  381.                         Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);//Tround2 = T6 - T3
  382.                         Da = (double)(final_tx_ts - resp_rx_ts);//Treply2 = T5 - T4  
  383.                         Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);//Treply1 = T3 - T2  
  384.                         tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));//計(jì)算公式

  385.                         tof = tof_dtu * DWT_TIME_UNITS;
  386.                         distance = tof * SPEED_OF_LIGHT;//距離=光速*飛行時(shí)間
  387.                                                                                                 dist2 = distance - dwt_getrangebias(config.chan,(float)distance, config.prf);//距離減去矯正系數(shù)
  388.                                                                                                
  389.                                                                                                 dis = dist2*100;//dis 為單位為cm的距離
  390.                                                                                                 dist = LP(dis,TAG_ID);//LP 為低通濾波器,讓數(shù)據(jù)更穩(wěn)定
  391.                                                                                                 time32_reset = 0;
  392.                                                                                                 GPIO_Toggle(GPIOA,LED_PIN);
  393.                                                                                         if (GPIO_ReadInputDataBit(GPIOA,SW2) != RESET)  //通過(guò)撥碼開關(guān)判斷數(shù)據(jù)輸出格式
  394.                                                                                        
  395. ……………………

  396. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
1基站多標(biāo)簽V3.5.zip (982.82 KB, 下載次數(shù): 166)
回復(fù)

使用道具 舉報(bào)

ID:241425 發(fā)表于 2018-6-4 20:42 | 顯示全部樓層
不知道能不能用哈,參考看看。有注釋不錯(cuò)。
回復(fù)

使用道具 舉報(bào)

ID:363360 發(fā)表于 2018-8-14 14:32 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:384234 發(fā)表于 2018-11-3 21:32 | 顯示全部樓層
keil文件沒找著啊,就看到了.cproj ,沒有 .uvproj 么
回復(fù)

使用道具 舉報(bào)

ID:321673 發(fā)表于 2018-12-26 16:48 | 顯示全部樓層
我想問一下,你程序里面連中斷函數(shù)都沒配,是怎么能用的?
回復(fù)

使用道具 舉報(bào)

ID:142681 發(fā)表于 2019-5-13 14:47 | 顯示全部樓層
定位準(zhǔn)么?
回復(fù)

使用道具 舉報(bào)

ID:415174 發(fā)表于 2019-10-3 09:28 | 顯示全部樓層
很需要這個(gè),不知道能用不
回復(fù)

使用道具 舉報(bào)

ID:194927 發(fā)表于 2019-10-3 15:43 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:644483 發(fā)表于 2019-11-18 18:42 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 极品在线 | 欧美精品成人一区二区三区四区 | 91精品国产91久久久久久 | 久久国产精品偷 | 精品精品视频 | 91精品久久久久久久99 | 欧美在线观看免费观看视频 | 蜜桃视频麻豆 | 久草新在线 | 欧美日韩国产精品一区二区 | 国产福利小视频 | 日美女逼逼 | 一二区视频 | 亚洲精品在线免费 | 国产成人精品区一区二区不卡 | 日日日日操| 日韩欧美在线免费观看 | 成人在线视频一区 | 99日韩| 91就要激情| 亚洲精品一二区 | 欧美激情视频网站 | 久久亚洲一区二区三区四区 | 久久综合久 | 成人免费观看视频 | 国产特级毛片 | 欧产日产国产精品视频 | 国产一区二区日韩 | 欧美综合视频在线 | 九九热免费视频在线观看 | 亚洲一区视频在线 | 91免费在线 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 成人网在线观看 | 成人a视频片观看免费 | 手机av在线| 欧美日韩久| ww亚洲ww亚在线观看 | 欧美久久久久久久久中文字幕 | 欧美福利在线 | 免费视频二区 |