This is the DW1000 driver and our self developed distance measurement application based on it. We do this as a semester thesis at ETH Zürich under the Automatic Control Laboratory in the Department of electrical engineering.

Dependencies:   mbed

Revision:
11:c87d37db2c6f
Parent:
10:d077bb12d259
Child:
12:985aa9843c3c
--- a/DW1000/DW1000.cpp	Fri Nov 21 14:33:23 2014 +0000
+++ b/DW1000/DW1000.cpp	Sun Nov 23 11:20:46 2014 +0000
@@ -5,6 +5,12 @@
     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);
+    
     irq.rise(this, &DW1000::ISR);       // attach Interrupt handler to rising edge
     resetRX();
 }
@@ -50,13 +56,16 @@
     return receive;
 }
 
-void DW1000::sendFrame(uint8_t* message, int length) {
+void DW1000::sendFrame(uint8_t* message, uint16_t length) {
     writeRegister(DW1000_TX_BUFFER, 0, message, length);  // fill buffer
     
-    uint16_t framelength = length+2;                                // put length of frame including 2 CRC Bytes
-    writeRegister(DW1000_TX_FCTRL, 0, (uint8_t*)&framelength, 1);   // TODO: make that bigger frames than 256 can be sent
+    uint8_t backup = readRegister8(DW1000_TX_FCTRL, 1);
+    length += 2;                                // put length of frame including 2 CRC Bytes
+    length = ((backup & 0xFC) << 8) | (length & 0x03FF);
     
-    //writeRegister8(DW1000_SYS_CTRL, 0, 0x02);                       // trigger sending process by setting the TXSTRT bit
+    writeRegister(DW1000_TX_FCTRL, 0, (uint8_t*)&length, 2);   // TODO: make that bigger frames than 256 can be sent
+    
+    writeRegister8(DW1000_SYS_CTRL, 0, 0x02);                       // trigger sending process by setting the TXSTRT bit
 }
 
 void DW1000::receiveFrame() {