init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
DW1000Utils.h
00001 #pragma once 00002 00003 #include <mbed.h> 00004 #include "DW1000.h" 00005 00006 class DW1000Utils 00007 { 00008 public: 00009 // Recommended settings: 00010 // Data rate 110 kbps - Preamble length 2048 or 4096. 00011 // Data rate 850 kbps - Preamble length 256, 512 or 1024. 00012 // Data rate 6.8 Mbps - Preamble length 64. 00013 00014 const static uint32_t PREAMBLE_LENGTH_64 = (1 << 18); 00015 const static uint32_t PREAMBLE_LENGTH_128 = (1 << 18) | (1 << 20); 00016 const static uint32_t PREAMBLE_LENGTH_256 = (1 << 18) | (1 << 21); 00017 const static uint32_t PREAMBLE_LENGTH_512 = (1 << 18) | (1 << 20) | (1 << 21); 00018 const static uint32_t PREAMBLE_LENGTH_1024 = (1 << 19); 00019 const static uint32_t PREAMBLE_LENGTH_2048 = (1 << 19) | (1 << 21); 00020 const static uint32_t PREAMBLE_LENGTH_4096 = (1 << 18) | (1 << 19); 00021 00022 enum PrfSetting 00023 { 00024 PRF_16_MHz = 1, 00025 PRF_64_MHz, 00026 }; 00027 00028 enum DataRateSetting 00029 { 00030 RATE_110_kbps = 1, 00031 RATE_850_kbps, 00032 RATE_6_8_Mbps, 00033 }; 00034 00035 // Set pulse repetition frequency 00036 static void setPulseRepetitionFrequency(DW1000* dw_ptr, PrfSetting prf_setting) 00037 { 00038 // Transmit PRF setting (see page 75 of user manual) 00039 uint32_t prf_value; 00040 if (prf_setting == PRF_16_MHz) 00041 { 00042 prf_value = (1 << 16); 00043 } 00044 else 00045 { 00046 prf_value = (1 << 17); 00047 } 00048 uint32_t prf_mask = (1 << 16) | (1 << 17); 00049 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00050 tx_ctrl &= ~prf_mask; 00051 tx_ctrl |= (prf_value & prf_mask); 00052 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00053 00054 // Receive PRF setting (see page 109 and of user manual) 00055 if (prf_setting == PRF_16_MHz) 00056 { 00057 prf_value = (1 << 18); 00058 } 00059 else 00060 { 00061 prf_value = (1 << 19); 00062 } 00063 prf_mask = (1 << 18) | (1 << 19); 00064 uint32_t chan_ctrl = dw_ptr->readRegister32(DW1000_CHAN_CTRL, 0x00); 00065 chan_ctrl &= ~prf_mask; 00066 chan_ctrl |= (prf_value & prf_mask); 00067 dw_ptr->writeRegister32(DW1000_CHAN_CTRL, 0x00, chan_ctrl); 00068 } 00069 00070 // Set preamble length (see page 76 of user manual) 00071 static void setPreambleLength(DW1000* dw_ptr, uint32_t preamble_setting) 00072 { 00073 uint32_t preamble_mask = (1 << 18) | (1 << 19) | (1 << 20) | (1 << 21); 00074 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00075 tx_ctrl &= ~preamble_mask; 00076 tx_ctrl |= (preamble_setting & preamble_mask); 00077 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00078 } 00079 00080 // Set data rate 00081 static void setDataRate(DW1000* dw_ptr, DataRateSetting rate_setting) 00082 { 00083 // Transmit data rate (see page 73 of user manual) 00084 uint32_t rate_value; 00085 if (rate_setting == RATE_110_kbps) 00086 { 00087 rate_value = 0; 00088 } 00089 else if (rate_setting == RATE_850_kbps) 00090 { 00091 rate_value = (1 << 13); 00092 } 00093 else 00094 { 00095 rate_value = (1 << 14); 00096 } 00097 uint32_t rate_mask = (1 << 13) | (1 << 14); 00098 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00099 tx_ctrl &= ~rate_mask; 00100 tx_ctrl |= (rate_value & rate_mask); 00101 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00102 00103 // Receive data rate (see page 72 of user manual) 00104 if (rate_setting == RATE_110_kbps) 00105 { 00106 rate_value = (1 << 18); 00107 rate_value = (1 << 22); 00108 } 00109 else if (rate_setting == RATE_850_kbps) 00110 { 00111 rate_value = (1 << 18); 00112 } 00113 else 00114 { 00115 rate_value = 0; 00116 } 00117 rate_mask = (1 << 18) | (1 << 22); 00118 uint32_t sys_cfg = dw_ptr->readRegister32(DW1000_SYS_CFG, 0x00); 00119 sys_cfg &= ~rate_mask; 00120 sys_cfg |= (rate_value & rate_mask); 00121 dw_ptr->writeRegister32(DW1000_SYS_CFG, 0x00, sys_cfg); 00122 00123 if (rate_setting == RATE_110_kbps) 00124 { 00125 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x000A); // DRX_TUNE0b for 110 kbps 00126 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0064); // DRX_TUNE1b for 110 kbps & > 1024 symbols 00127 } 00128 else if (rate_setting == RATE_850_kbps) 00129 { 00130 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x0001); // DRX_TUNE0b for 850 kbps 00131 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0020); // DRX_TUNE1b for 850 kbps & 128 - 1024 symbols 00132 } 00133 else 00134 { 00135 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x0001); // DRX_TUNE0b for 6.8 Mbps 00136 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0010); // DRX_TUNE1b for 6.8 Mbps & 64 symbols 00137 } 00138 } 00139 00140 // Improved settings for direct path detection in non-line-of-sight environments. 00141 // See DecaWave Application Note APS006. 00142 static void setNLOSSettings(DW1000* dw_ptr, DataRateSetting rate_setting = RATE_850_kbps, PrfSetting prf_setting = PRF_16_MHz, uint32_t preamble_setting = PREAMBLE_LENGTH_1024) 00143 { 00144 setDataRate(dw_ptr, rate_setting); 00145 setPulseRepetitionFrequency(dw_ptr, prf_setting); 00146 setPreambleLength(dw_ptr, preamble_setting); 00147 00148 // Setting for Noise Threshold Multiplier 1 00149 dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x07); // LDE_CFG1 00150 // Setting for Noise Threshold Multiplier 2 00151 if (prf_setting == PRF_16_MHz) 00152 { 00153 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x0003); // LDE_CFG2 for 16 MHz PRF 00154 } 00155 else 00156 { 00157 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1603); // LDE_CFG2 for 64 MHz PRF 00158 } 00159 } 00160 00161 // Default settings for line-of-sight environments 00162 static void setLOSSettings(DW1000* dw_ptr, DataRateSetting rate_setting = RATE_850_kbps, PrfSetting prf_setting = PRF_16_MHz, uint32_t preamble_setting = PREAMBLE_LENGTH_1024) 00163 { 00164 setDataRate(dw_ptr, rate_setting); 00165 setPulseRepetitionFrequency(dw_ptr, prf_setting); 00166 setPreambleLength(dw_ptr, preamble_setting); 00167 00168 // Setting for Noise Threshold Multiplier 1 00169 dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x0c); // LDE_CFG1 00170 // dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x0d); // LDE_CFG1 00171 // Setting for Noise Threshold Multiplier 2 00172 if (prf_setting == PRF_16_MHz) 00173 { 00174 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1607); // LDE_CFG2 for 16 MHz PRF 00175 } 00176 else 00177 { 00178 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x0607); // LDE_CFG2 for 64 MHz PRF 00179 } 00180 } 00181 };
Generated on Sat Jul 16 2022 03:03:28 by
1.7.2