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:
14:8041c9b68406
Parent:
13:b4d27bf7062a
Child:
15:e1fea7e2aff1
--- a/main.cpp	Sun Nov 23 15:07:24 2014 +0000
+++ b/main.cpp	Sun Nov 23 15:37:45 2014 +0000
@@ -5,14 +5,19 @@
 PC          pc(USBTX, USBRX, 921600);   // USB UART Terminal
 DW1000      dw(D11, D12, D13, D10, D14);     // SPI1 on Nucleo Board (MOSI, MISO, SCLK, CS, IRQ)
 
-
+int i=0;
+bool starter = 1;
+bool ping = 0;
+char message[1024] = "";
 uint64_t timestamp_old = 0;
-//#define SENDER
+
+//#define DEBUGSTRING
 
 void Interrupthandler() {
     /*uint8_t frameready = 0;
     dw.readRegister(DW1000_SYS_STATUS, 1, &frameready, 1);
     pc.printf("Interrupt status: %X\r\n", frameready);*/
+    starter = 0;
     
     uint16_t framelength = 0;                                       // get framelength TODO: just for debugging of string
     dw.readRegister(DW1000_RX_FINFO, 0, (uint8_t*)&framelength, 2);
@@ -35,15 +40,22 @@
     timestamp_old = timestamp;
     pc.printf("Timestamp: %lld\r\n", difference);
     
+    wait(1);            // TODO: ugly, never wait in interrupthandler!
+    if (ping) {
+        sprintf((char*)message, "PING! %d", i);
+        dw.sendString(message);
+    } else {
+        sprintf((char*)message, "PONG! %d", i);
+        dw.sendString(message);
+    }
+    
     dw.receiveFrame();
 }
 
 int main() {
-    int i=0;
-    char message[1024] = "";
     pc.printf("DecaWave 0.1\r\nup and running!\r\n");
     
-    dw.setEUI(0xFAEDCD01FAEDCD01);
+    dw.setEUI(0xFAEDCD01FAEDCD01);                  // basic methods called to check if we have a slave
     pc.printf("%d DEVICE_ID register: 0x%X\r\n", i, dw.getDeviceID());
     pc.printf("%d EUI register: %016llX\r\n", i, dw.getEUI());
     pc.printf("%d Voltage: %f\r\n", i, dw.getVoltage());
@@ -53,16 +65,17 @@
     pc.printf("%d System Configuration: %X\r\n", i, conf);
     
     dw.callbackRX = &Interrupthandler;
-#ifndef SENDER
+    
+    // Receiver initialisation
     uint8_t dataframereadyinterrupt = 0x40; // only good frame 0x40 all frames 0x20
     dw.writeRegister(DW1000_SYS_MASK, 1, &dataframereadyinterrupt, 1);
     
     dw.receiveFrame();
-#endif
+    wait(3);
     
     while(1) {
         i++;
-# ifdef SENDER                      // to make one node sender and one receiver
+# ifdef DEBUGSTRING                      // to make one node sender and one receiver
         //message[i-1] = 'O';
         //message[i] = '\0';
         sprintf((char*)message, "HELLO WORLD! %d", i);
@@ -89,8 +102,15 @@
 #else
         pc.printf("%d Waiting...  ", i);
         
-        sprintf((char*)message, "BETWEEN! %d", i);
-        dw.sendString(message);
+        if (starter) {
+            ping = 1;
+            while (starter) {
+                sprintf((char*)message, "PING! %d", i);
+                dw.sendString(message);
+                wait(1);
+            }
+        }
+        
         
         uint64_t status;
         dw.readRegister(DW1000_SYS_STATUS, 0, (uint8_t*)&status, 5);