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

Committer:
manumaet
Date:
Fri Nov 21 14:33:23 2014 +0000
Revision:
10:d077bb12d259
Parent:
9:c8839de428ac
Child:
11:c87d37db2c6f
in between messing with framelenght of sendFrame to solve issue with >1 byte;; readRegister8 tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manumaet 0:f50e671ffff7 1 #include "mbed.h"
manumaet 0:f50e671ffff7 2 #include "PC.h" // Serial Port via USB for debugging with Terminal
manumaet 0:f50e671ffff7 3 #include "DW1000.h"
manumaet 0:f50e671ffff7 4
manumaet 0:f50e671ffff7 5 PC pc(USBTX, USBRX, 921600); // USB UART Terminal
manumaet 7:e634eeafc4d2 6 DW1000 dw(D11, D12, D13, D10, D14); // SPI1 on Nucleo Board (MOSI, MISO, SCLK, CS, IRQ)
manumaet 0:f50e671ffff7 7
manumaet 8:7a9c61242e2f 8 #define SENDER
manumaet 5:111f11c95d27 9
manumaet 6:d5864a1b9e17 10 void Interrupthandler() {
manumaet 10:d077bb12d259 11 /*uint8_t frameready = 0;
manumaet 7:e634eeafc4d2 12 dw.readRegister(DW1000_SYS_STATUS, 1, &frameready, 1);
manumaet 10:d077bb12d259 13 pc.printf("Interrupt status: %X\r\n", frameready);*/
manumaet 10:d077bb12d259 14
manumaet 10:d077bb12d259 15 uint16_t framelength = 0; // get framelength
manumaet 10:d077bb12d259 16 dw.readRegister(DW1000_RX_FINFO, 0, (uint8_t*)&framelength, 2);
manumaet 10:d077bb12d259 17 framelength &= 0x03FF;
manumaet 10:d077bb12d259 18 framelength -= 2;
manumaet 10:d077bb12d259 19
manumaet 10:d077bb12d259 20 char* receive = dw.receiveString();
manumaet 10:d077bb12d259 21 pc.printf("Message Received: %s %d\r\n", receive, framelength);
manumaet 10:d077bb12d259 22 delete[] receive;
manumaet 10:d077bb12d259 23
manumaet 10:d077bb12d259 24 dw.resetRX(); // TODO: is crucial because otherwise only 1 frame is received correct
manumaet 8:7a9c61242e2f 25 dw.receiveFrame();
manumaet 6:d5864a1b9e17 26 }
manumaet 6:d5864a1b9e17 27
manumaet 0:f50e671ffff7 28 int main() {
manumaet 4:6240b9c7a033 29 int i=0;
manumaet 10:d077bb12d259 30 char message[1024] = "";
manumaet 0:f50e671ffff7 31 pc.printf("DecaWave 0.1\r\nup and running!\r\n");
manumaet 0:f50e671ffff7 32
manumaet 0:f50e671ffff7 33 dw.setEUI(0xFAEDCD01FAEDCD01);
manumaet 4:6240b9c7a033 34 pc.printf("%d DEVICE_ID register: 0x%X\r\n", i, dw.getDeviceID());
manumaet 4:6240b9c7a033 35 pc.printf("%d EUI register: %016llX\r\n", i, dw.getEUI());
manumaet 4:6240b9c7a033 36 pc.printf("%d Voltage: %f\r\n", i, dw.getVoltage());
manumaet 0:f50e671ffff7 37
manumaet 4:6240b9c7a033 38 // read System Configuration
manumaet 4:6240b9c7a033 39 uint32_t conf = 0;
manumaet 4:6240b9c7a033 40 dw.readRegister(DW1000_SYS_CFG, 0, (uint8_t*)&conf, 4);
manumaet 4:6240b9c7a033 41 pc.printf("%d System Configuration: %X\r\n", i, conf);
manumaet 4:6240b9c7a033 42
manumaet 7:e634eeafc4d2 43 wait(1);
manumaet 5:111f11c95d27 44
manumaet 8:7a9c61242e2f 45 dw.callbackRX = &Interrupthandler;
manumaet 9:c8839de428ac 46 #ifndef SENDER
manumaet 10:d077bb12d259 47 uint8_t dataframereadyinterrupt = 0x40; // only good frame 0x40 all frames 0x20
manumaet 5:111f11c95d27 48 dw.writeRegister(DW1000_SYS_MASK, 1, &dataframereadyinterrupt, 1);
manumaet 7:e634eeafc4d2 49
manumaet 7:e634eeafc4d2 50 // Receive something
manumaet 8:7a9c61242e2f 51 dw.receiveFrame();
manumaet 5:111f11c95d27 52 #endif
manumaet 5:111f11c95d27 53
manumaet 0:f50e671ffff7 54 while(1) {
manumaet 0:f50e671ffff7 55 i++;
manumaet 5:111f11c95d27 56 # ifdef SENDER // to make one node sender and one receiver
manumaet 0:f50e671ffff7 57 // Send something
manumaet 10:d077bb12d259 58 message[i-1] = 'O';
manumaet 10:d077bb12d259 59 message[i] = '\0';
manumaet 10:d077bb12d259 60 //sprintf((char*)message, "HELLO WORLD! %d", i);
manumaet 10:d077bb12d259 61 if (i < 200)
manumaet 10:d077bb12d259 62 pc.printf("%d Message: \"%s\" %d\r\n", i, message, strlen(message));
manumaet 10:d077bb12d259 63 else
manumaet 10:d077bb12d259 64 pc.printf("%d Message: %d\r\n", i, strlen(message));
manumaet 10:d077bb12d259 65 dw.sendString(message);
manumaet 0:f50e671ffff7 66
manumaet 10:d077bb12d259 67 char messagecheck[1024];
manumaet 10:d077bb12d259 68 dw.readRegister(DW1000_TX_BUFFER, 0, (uint8_t*)messagecheck, strlen(message)+1);
manumaet 10:d077bb12d259 69 messagecheck[1] = '\0';
manumaet 10:d077bb12d259 70 if (i < 200)
manumaet 10:d077bb12d259 71 pc.printf("%d Buffer: \"%s\" %d\r\n", i, messagecheck, strlen(messagecheck)+1);
manumaet 10:d077bb12d259 72 else
manumaet 10:d077bb12d259 73 pc.printf("%d Buffer: %d\r\n", i, strlen(messagecheck)+1);
manumaet 9:c8839de428ac 74 /*for(int i=0; i<10; i++) { // to control Voltage
manumaet 9:c8839de428ac 75 pc.printf("%d Voltage: %f\r\n", i, dw.getVoltage());
manumaet 9:c8839de428ac 76 wait(0.2);
manumaet 9:c8839de428ac 77 }*/
manumaet 10:d077bb12d259 78 wait(1);
manumaet 8:7a9c61242e2f 79 #else
manumaet 8:7a9c61242e2f 80 pc.printf("%d Waiting...\r\n", i);
manumaet 10:d077bb12d259 81 wait(1);
manumaet 0:f50e671ffff7 82 # endif
manumaet 4:6240b9c7a033 83
manumaet 0:f50e671ffff7 84 }
manumaet 0:f50e671ffff7 85 }