Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DecaWave by
Diff: DW1000/DW1000.cpp
- Revision:
- 45:01a33363bc21
- Parent:
- 44:2e0045042a59
- Child:
- 46:6398237672a0
--- a/DW1000/DW1000.cpp Thu Mar 05 12:18:37 2015 +0000 +++ b/DW1000/DW1000.cpp Sun Mar 08 15:59:14 2015 +0000 @@ -5,27 +5,53 @@ deselect(); // Chip must be deselected first spi.format(8,0); // Setup the spi for standard 8 bit data and SPI-Mode 0 (GPIO5, GPIO6 open circuit or ground on DW1000) - spi.frequency(1000000); // with a 1MHz clock rate (worked up to 49MHz in our Test) + spi.frequency(5000000); // with a 1MHz clock rate (worked up to 49MHz in our Test) resetAll(); // we do a soft reset of the DW1000 everytime the driver starts // Configuration TODO: make method for that + // User Manual "2.5.5 Default Configurations that should be modified" p. 22 + //Those values are for the standard mode (6.8Mbps, 5, 16Mhz, 32 Symbols) and are INCOMPLETE! +// writeRegister16(DW1000_AGC_CTRL, 0x04, 0x8870); +// writeRegister32(DW1000_AGC_CTRL, 0x0C, 0x2502A907); +// writeRegister32(DW1000_DRX_CONF, 0x08, 0x311A002D); +// writeRegister8 (DW1000_LDE_CTRL, 0x0806, 0xD); +// writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1607); +// writeRegister32(DW1000_TX_POWER, 0, 0x0E082848); +// writeRegister32(DW1000_RF_CONF, 0x0C, 0x001E3FE0); +// writeRegister8 (DW1000_TX_CAL, 0x0B, 0xC0); +// writeRegister8 (DW1000_FS_CTRL, 0x0B, 0xA6); - // User Manual "2.5.5 Default Configurations that should be modified" p. 22 - writeRegister16(DW1000_AGC_CTRL, 0x04, 0x8870); - writeRegister32(DW1000_AGC_CTRL, 0x0C, 0x2502A907); - writeRegister32(DW1000_DRX_CONF, 0x08, 0x311A002D); - writeRegister8 (DW1000_LDE_CTRL, 0x0806, 0xD); - writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1607); - writeRegister32(DW1000_TX_POWER, 0, 0x0E082848); - writeRegister32(DW1000_RF_CONF, 0x0C, 0x001E3FE0); - writeRegister8 (DW1000_TX_CAL, 0x0B, 0xC0); - writeRegister8 (DW1000_FS_CTRL, 0x0B, 0xA6); + + //Those values are for the 110kbps mode (5, 16MHz, 1024 Symbols) and are quite complete + writeRegister16(DW1000_AGC_CTRL, 0x04, 0x8870); //AGC_TUNE1 for 16MHz PRF + writeRegister32(DW1000_AGC_CTRL, 0x0C, 0x2502A907); //AGC_TUNE2 (Universal) + writeRegister16(DW1000_AGC_CTRL, 0x12, 0x0055); //AGC_TUNE3 (Universal) + + writeRegister16(DW1000_DRX_CONF, 0x02, 0x000A); //DRX_TUNE0b for 110kbps + writeRegister16(DW1000_DRX_CONF, 0x04, 0x0087); //DRX_TUNE1a for 16MHz PRF + writeRegister16(DW1000_DRX_CONF, 0x06, 0x0064); //DRX_TUNE1b for 110kbps & > 1024 symbols + writeRegister32(DW1000_DRX_CONF, 0x08, 0x351A009A); //PAC size for 1024 symbols preamble & 16MHz PRF + //writeRegister32(DW1000_DRX_CONF, 0x08, 0x371A011D); //PAC size for 2048 symbols preamble + + writeRegister8 (DW1000_LDE_CTRL, 0x0806, 0xD); //LDE_CFG1 + writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1607); //LDE_CFG2 for 16MHz PRF + + writeRegister32(DW1000_TX_POWER, 0, 0x48484848); //Power for channel 5 + + writeRegister8(DW1000_RF_CONF, 0x0B, 0xD8); //RF_RXCTRLH for channel 5 + writeRegister32(DW1000_RF_CONF, 0x0C, 0x001E3FE0); //RF_TXCTRL for channel 5 + + writeRegister8 (DW1000_TX_CAL, 0x0B, 0xC0); //TC_PGDELAY for channel 5 + + writeRegister32 (DW1000_FS_CTRL, 0x07, 0x0800041D); //FS_PLLCFG for channel 5 + writeRegister8 (DW1000_FS_CTRL, 0x0B, 0xA6); //FS_PLLTUNE for channel 5 + loadLDE(); // important everytime DW1000 initialises/awakes otherwise the LDE algorithm must be turned of or there's receiving malfunction see User Manual LDELOAD on p22 & p158 // 110kbps CAUTION: a lot of other registers have to be set for an optimized operation on 110kbps - //writeRegister16(DW1000_TX_FCTRL, 1, 0x2800 | 0x0100 | 0x0080); // use 2048 symbols preable (0x2800), 16MHz pulse repetition frequency (0x0100), 110kbps bit rate (0x0080) see p.69 of DW1000 User Manual - //writeRegister8(DW1000_SYS_CFG, 2, 0x40); // enable special receiving option for 110kbps!! (0x40) see p.64 of DW1000 User Manual [DO NOT enable 1024 byte frames (0x03) becuase it generates disturbance of ranging don't know why...] + writeRegister16(DW1000_TX_FCTRL, 1, 0x0800 | 0x0100 | 0x0080); // use 1024 symbols preamble (0x0800) (previously 2048 - 0x2800), 16MHz pulse repetition frequency (0x0100), 110kbps bit rate (0x0080) see p.69 of DW1000 User Manual + writeRegister8(DW1000_SYS_CFG, 2, 0x44); // enable special receiving option for 110kbps (disable smartTxPower)!! (0x44) see p.64 of DW1000 User Manual [DO NOT enable 1024 byte frames (0x03) becuase it generates disturbance of ranging don't know why...] writeRegister16(DW1000_TX_ANTD, 0, 16384); // set TX and RX Antenna delay to neutral because we calibrate afterwards writeRegister16(DW1000_LDE_CTRL, 0x1804, 16384); // = 2^14 a qurter of the range of the 16-Bit register which corresponds to zero calibration in a round trip (TX1+RX2+TX2+RX1) @@ -122,7 +148,7 @@ length = ((backup & 0xFC) << 8) | (length & 0x03FF); writeRegister16(DW1000_TX_FCTRL, 0, length); - writeRegister40(DW1000_DX_TIME, 0, TxTimestamp); + writeRegister40(DW1000_DX_TIME, 0, TxTimestamp); //write the timestamp on which to send the message stopTRX(); // stop receiving writeRegister8(DW1000_SYS_CTRL, 0, 0x02 | 0x04); // trigger sending process by setting the TXSTRT and TXDLYS bit @@ -253,4 +279,4 @@ void DW1000::deselect() { // always called to end an SPI transmission cs = 1; // set Cable Select pin high to stop transmission irq.enable_irq(); // reenable the interrupt handler -} \ No newline at end of file +}