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:
- 12:985aa9843c3c
- Parent:
- 11:c87d37db2c6f
- Child:
- 13:b4d27bf7062a
--- a/DW1000/DW1000.cpp Sun Nov 23 11:20:46 2014 +0000 +++ b/DW1000/DW1000.cpp Sun Nov 23 14:34:31 2014 +0000 @@ -5,14 +5,11 @@ 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) - uint16_t ldeload[] = {0x0301, 0x8000, 0x0200}; - writeRegister(DW1000_PMSC, 0, (uint8_t*)&ldeload[0], 2); // initialise LDELOAD User Manual p22 - writeRegister(DW1000_OTP_IF, 0x06, (uint8_t*)&ldeload[1], 2); - wait_us(150); - writeRegister(DW1000_PMSC, 0, (uint8_t*)&ldeload[2], 2); + //resetAll(); // we can do a soft reset if we want to (only needed for debugging) + 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 + writeRegister8(DW1000_SYS_CFG, 3, 0x20); // enable auto reenabling receiver after error irq.rise(this, &DW1000::ISR); // attach Interrupt handler to rising edge - resetRX(); } uint32_t DW1000::getDeviceID() { @@ -32,7 +29,7 @@ } float DW1000::getVoltage() { - uint8_t buffer[7] = {0x80, 0x0A, 0x0F, 0x01, 0x00}; // algorithm form DW1000 User Manual p57 + uint8_t buffer[7] = {0x80, 0x0A, 0x0F, 0x01, 0x00}; // algorithm form User Manual p57 writeRegister(DW1000_RF_CONF, 0x11, buffer, 2); writeRegister(DW1000_RF_CONF, 0x12, &buffer[2], 1); writeRegister(DW1000_TX_CAL, 0x00, &buffer[3], 1); @@ -73,14 +70,33 @@ } void DW1000::ISR() { - callbackRX(); + uint64_t status; // get the entire system status + readRegister(DW1000_SYS_STATUS, 0, (uint8_t*)&status, 5); + status &= 0xFFFFFFFFFF; // only 40-Bit + if (status & 0x4000) + callbackRX(); + if (status & 0x80) + ;//callbackTX(); // TODO: mask TX done interrupt make TX handler } -void DW1000::resetRX() { - uint8_t resetrx = 0xE0; //set rx reset - writeRegister(DW1000_PMSC, 3, &resetrx, 1); - resetrx = 0xf0; //clear RX reset - writeRegister(DW1000_PMSC, 3, &resetrx, 1); +void DW1000::loadLDE() { + uint16_t ldeload[] = {0x0301, 0x8000, 0x0200}; // initialise LDE algorithm LDELOAD User Manual p22 + writeRegister(DW1000_PMSC, 0, (uint8_t*)&ldeload[0], 2); // set clock to XTAL so OTP is reliable + writeRegister(DW1000_OTP_IF, 0x06, (uint8_t*)&ldeload[1], 2); // set LDELOAD bit in OTP + wait_us(150); + writeRegister(DW1000_PMSC, 0, (uint8_t*)&ldeload[2], 2); // recover to PLL clock +} + +void DW1000::resetRX() { + writeRegister8(DW1000_PMSC, 3, 0xE0); // set RX reset + writeRegister8(DW1000_PMSC, 3, 0xF0); // clear RX reset +} + +void DW1000::resetAll() { + writeRegister8(DW1000_PMSC, 0, 0x01); // set clock to XTAL + writeRegister8(DW1000_PMSC, 3, 0x00); // set All reset + wait_us(10); // wait for PLL to lock + writeRegister8(DW1000_PMSC, 3, 0xF0); // clear All reset } // SPI Interface ------------------------------------------------------------------------------------ @@ -124,5 +140,5 @@ } } -void DW1000::select() { cs = 0; } //Set CS low to start transmission -void DW1000::deselect() { cs = 1; } //Set CS high to stop transmission \ No newline at end of file +void DW1000::select() { cs = 0; } // set CS low to start transmission +void DW1000::deselect() { cs = 1; } // set CS high to stop transmission \ No newline at end of file