Untitled
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. * * The information contained herein is property of Nordic Semiconductor ASA. * Terms and conditions of usage are described in detail in NORDIC * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. * * Licensees are granted free, non-transferable use of the information. NO * WARRANTY of ANY KIND is provided. This heading must NOT be removed from * the file. * */ #include "sdk_config.h" #include "FreeRTOS.h" #include "task.h" #include "timers.h" #include "bsp.h" #include "boards.h" #include "nordic_common.h" #include "nrf_drv_clock.h" #include "nrf_drv_spi.h" #include "nrf_uart.h" #include "app_util_platform.h" #include "nrf_gpio.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf.h" #include "app_error.h" #include "app_util_platform.h" #include "app_error.h" #include <string.h> #include "port_platform.h" #include "deca_types.h" #include "deca_param_types.h" #include "deca_regs.h" #include "deca_device_api.h" #include "uart.h" //-----------------dw1000---------------------------- static dwt_config_t config = { 5, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ DWT_PLEN_1024, /* Preamble length. Used in TX only. */ DWT_PAC64, /* Preamble acquisition chunk size. Used in RX only. */ 10, /* TX preamble code. Used in TX only. */ 10, /* RX preamble code. Used in RX only. */ 0, /* 0 to use standard SFD, 1 to use non-standard SFD. */ DWT_BR_110K, /* Data rate. */ DWT_PHRMODE_STD, /* PHY header mode. */ (129 + 8 - 8) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ }; /* Preamble timeout, in multiple of PAC size. See NOTE 3 below. */ #define PRE_TIMEOUT 1000 /* Delay between frames, in UWB microseconds. See NOTE 1 below. */ #define POLL_TX_TO_RESP_RX_DLY_UUS 100 /*Should be accurately calculated during calibration*/ #define TX_ANT_DLY 16300 #define RX_ANT_DLY 16456 //--------------dw1000---end--------------- #define TASK_DELAY 200 /**< Task delay. Delays a LED0 task for 200 ms */ #define TIMER_PERIOD 2000 /**< Timer period. LED1 timer will expire after 1000 ms */ #ifdef USE_FREERTOS TaskHandle_t ss_initiator_task_handle; /**< Reference to SS TWR Initiator FreeRTOS task. */ extern void ss_initiator_task_function (void * pvParameter); TaskHandle_t led_toggle_task_handle; /**< Reference to LED0 toggling FreeRTOS task. */ TimerHandle_t led_toggle_timer_handle; /**< Reference to LED1 toggling FreeRTOS timer. */ #endif #ifdef USE_FREERTOS /**@brief LED0 task entry function. * * @param[in] pvParameter Pointer that will be used as the parameter for the task. */ static void led_toggle_task_function (void * pvParameter) { UNUSED_PARAMETER(pvParameter); while (true) { LEDS_INVERT(BSP_LED_0_MASK); /* Delay a task for a given number of ticks */ vTaskDelay(TASK_DELAY); /* Tasks must be implemented to never return... */ } } /**@brief The function to call when the LED1 FreeRTOS timer expires. * * @param[in] pvParameter Pointer that will be used as the parameter for the timer. */ static void led_toggle_timer_callback (void * pvParameter) { UNUSED_PARAMETER(pvParameter); LEDS_INVERT(BSP_LED_1_MASK); } #else extern int ss_init_run(void); #endif // #ifdef USE_FREERTOS int main(void) { /* Setup some LEDs for debug Green and Blue on DWM1001-DEV */ LEDS_CONFIGURE(BSP_LED_0_MASK | BSP_LED_1_MASK | BSP_LED_2_MASK); LEDS_ON(BSP_LED_0_MASK | BSP_LED_1_MASK | BSP_LED_2_MASK ); #ifdef USE_FREERTOS /* Create task for LED0 blinking with priority set to 2 */ UNUSED_VARIABLE(xTaskCreate(led_toggle_task_function, "LED0", configMINIMAL_STACK_SIZE + 200, NULL, 2, &led_toggle_task_handle)); /* Start timer for LED1 blinking */ led_toggle_timer_handle = xTimerCreate( "LED1", TIMER_PERIOD, pdTRUE, NULL, led_toggle_timer_callback); UNUSED_VARIABLE(xTimerStart(led_toggle_timer_handle, 0)); /* Create task for SS TWR Initiator set to 2 */ UNUSED_VARIABLE(xTaskCreate(ss_initiator_task_function, "SSTWR_INIT", configMINIMAL_STACK_SIZE + 200, NULL, 2, &ss_initiator_task_handle)); #endif // #ifdef USE_FREERTOS //-------------dw1000 ini------------------------------------ /* Setup DW1000 IRQ pin */ nrf_gpio_cfg_input(DW1000_IRQ, NRF_GPIO_PIN_NOPULL); //irq /*Initialization UART*/ boUART_Init (); printf("Single Sided Two Way Ranging Initiator Example \r\n"); printf("abc\r\n"); /* Reset DW1000 */ reset_DW1000(); /* Set SPI clock to 2MHz */ port_set_dw1000_slowrate(); /* Init the DW1000 */ if (dwt_initialise(DWT_LOADUCODE) == DWT_ERROR) { //Init of DW1000 Failed while (1) {}; } // Set SPI to 8MHz clock port_set_dw1000_fastrate(); /* Configure DW1000. */ dwt_configure(&config); /* Apply default antenna delay value. See NOTE 2 below. */ dwt_setrxantennadelay(RX_ANT_DLY); dwt_settxantennadelay(TX_ANT_DLY); /* Set preamble timeout for expected frames. See NOTE 3 below. */ //dwt_setpreambledetecttimeout(0); // PRE_TIMEOUT /* Set expected response's delay and timeout. * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */ dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); dwt_setrxtimeout(65000); // Maximum value timeout with DW1000 is 65ms //-------------dw1000 ini------end--------------------------- // IF WE GET HERE THEN THE LEDS WILL BLINK #ifdef USE_FREERTOS /* Start FreeRTOS scheduler. */ vTaskStartScheduler(); while(1) {}; #else // No RTOS task here so just call the main loop here. // Loop forever responding to ranging requests. while (1) { ss_init_run(); } #endif } /***************************************************************************************************************************************************** * NOTES: * * 1. The single-sided two-way ranging scheme implemented here has to be considered carefully as the accuracy of the distance measured is highly * sensitive to the clock offset error between the devices and the length of the response delay between frames. To achieve the best possible * accuracy, this response delay must be kept as low as possible. In order to do so, 6.8 Mbps data rate is used in this example and the response * delay between frames is defined as low as possible. The user is referred to User Manual for more details about the single-sided two-way ranging * process. NB:SEE ALSO NOTE 11. * 2. The sum of the values is the TX to RX antenna delay, this should be experimentally determined by a calibration process. Here we use a hard coded * value (expected to be a little low so a positive error will be seen on the resultant distance estimate. For a real production application, each * device should have its own antenna delay properly calibrated to get good precision when performing range measurements. * 3. This timeout is for complete reception of a frame, i.e. timeout duration must take into account the length of the expected frame. Here the value * is arbitrary but chosen large enough to make sure that there is enough time to receive the complete response frame sent by the responder at the * 6.8M data rate used (around 200 µs). * 4. In a real application, for optimum performance within regulatory limits, it may be necessary to set TX pulse bandwidth and TX power, (using * the dwt_configuretxrf API call) to per device calibrated values saved in the target system or the DW1000 OTP memory. * 5. The user is referred to DecaRanging ARM application (distributed with EVK1000 product) for additional practical example of usage, and to the * DW1000 API Guide for more details on the DW1000 driver functions. * ****************************************************************************************************************************************************/
Leave a Comment