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
DW1000/DW1000.h@18:bbc7ca7d3a95, 2014-11-24 (annotated)
- Committer:
- manumaet
- Date:
- Mon Nov 24 16:48:03 2014 +0000
- Revision:
- 18:bbc7ca7d3a95
- Parent:
- 17:8afa5f9122da
- Child:
- 20:257d56530ae1
many changes, sadly TX interrupt broken
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manumaet | 0:f50e671ffff7 | 1 | // by Manuel Stalder & Matthias Grob 2015 |
manumaet | 0:f50e671ffff7 | 2 | |
manumaet | 0:f50e671ffff7 | 3 | #ifndef DW1000_H |
manumaet | 0:f50e671ffff7 | 4 | #define DW1000_H |
manumaet | 0:f50e671ffff7 | 5 | |
manumaet | 0:f50e671ffff7 | 6 | #include "mbed.h" |
manumaet | 0:f50e671ffff7 | 7 | |
manumaet | 0:f50e671ffff7 | 8 | // register addresses |
manumaet | 17:8afa5f9122da | 9 | // Mnemonic Address Bytes Description |
manumaet | 17:8afa5f9122da | 10 | #define DW1000_DEV_ID 0x00 // 4 Device Identifier – includes device type and revision information |
manumaet | 17:8afa5f9122da | 11 | #define DW1000_EUI 0x01 // 8 Extended Unique Identifier |
manumaet | 17:8afa5f9122da | 12 | #define DW1000_PANADR 0x03 // 4 PAN Identifier and Short Address |
manumaet | 17:8afa5f9122da | 13 | #define DW1000_SYS_CFG 0x04 // 4 System Configuration bitmap |
manumaet | 17:8afa5f9122da | 14 | #define DW1000_SYS_TIME 0x06 // 5 System Time Counter (40-bit) |
manumaet | 17:8afa5f9122da | 15 | #define DW1000_TX_FCTRL 0x08 // 5 Transmit Frame Control |
manumaet | 17:8afa5f9122da | 16 | #define DW1000_TX_BUFFER 0x09 // 1024 Transmit Data Buffer |
manumaet | 17:8afa5f9122da | 17 | #define DW1000_DX_TIME 0x0A // 5 Delayed Send or Receive Time (40-bit) |
manumaet | 17:8afa5f9122da | 18 | #define DW1000_RX_FWTO 0x0C // 2 Receive Frame Wait Timeout Period |
manumaet | 17:8afa5f9122da | 19 | #define DW1000_SYS_CTRL 0x0D // 4 System Control Register |
manumaet | 17:8afa5f9122da | 20 | #define DW1000_SYS_MASK 0x0E // 4 System Event Mask Register |
manumaet | 17:8afa5f9122da | 21 | #define DW1000_SYS_STATUS 0x0F // 5 System Event Status Register |
manumaet | 17:8afa5f9122da | 22 | #define DW1000_RX_FINFO 0x10 // 4 RX Frame Information (in double buffer set) |
manumaet | 17:8afa5f9122da | 23 | #define DW1000_RX_BUFFER 0x11 // 1024 Receive Data Buffer (in double buffer set) |
manumaet | 17:8afa5f9122da | 24 | #define DW1000_RX_FQUAL 0x12 // 8 Rx Frame Quality information (in double buffer set) |
manumaet | 17:8afa5f9122da | 25 | #define DW1000_RX_TTCKI 0x13 // 4 Receiver Time Tracking Interval (in double buffer set) |
manumaet | 17:8afa5f9122da | 26 | #define DW1000_RX_TTCKO 0x14 // 5 Receiver Time Tracking Offset (in double buffer set) |
manumaet | 17:8afa5f9122da | 27 | #define DW1000_RX_TIME 0x15 // 14 Receive Message Time of Arrival (in double buffer set) |
manumaet | 17:8afa5f9122da | 28 | #define DW1000_TX_TIME 0x17 // 10 Transmit Message Time of Sending (in double buffer set) |
manumaet | 17:8afa5f9122da | 29 | #define DW1000_TX_ANTD 0x18 // 2 16-bit Delay from Transmit to Antenna |
manumaet | 17:8afa5f9122da | 30 | #define DW1000_SYS_STATE 0x19 // 5 System State information |
manumaet | 17:8afa5f9122da | 31 | #define DW1000_ACK_RESP_T 0x1A // 4 Acknowledgement Time and Response Time |
manumaet | 17:8afa5f9122da | 32 | #define DW1000_RX_SNIFF 0x1D // 4 Pulsed Preamble Reception Configuration |
manumaet | 17:8afa5f9122da | 33 | #define DW1000_TX_POWER 0x1E // 4 TX Power Control |
manumaet | 17:8afa5f9122da | 34 | #define DW1000_CHAN_CTRL 0x1F // 4 Channel Control |
manumaet | 17:8afa5f9122da | 35 | #define DW1000_USR_SFD 0x21 // 41 User-specified short/long TX/RX SFD sequences |
manumaet | 17:8afa5f9122da | 36 | #define DW1000_AGC_CTRL 0x23 // 32 Automatic Gain Control configuration |
manumaet | 17:8afa5f9122da | 37 | #define DW1000_EXT_SYNC 0x24 // 12 External synchronisation control. |
manumaet | 17:8afa5f9122da | 38 | #define DW1000_ACC_MEM 0x25 // 4064 Read access to accumulator data |
manumaet | 17:8afa5f9122da | 39 | #define DW1000_GPIO_CTRL 0x26 // 44 Peripheral register bus 1 access - GPIO control |
manumaet | 17:8afa5f9122da | 40 | #define DW1000_DRX_CONF 0x27 // 44 Digital Receiver configuration |
manumaet | 17:8afa5f9122da | 41 | #define DW1000_RF_CONF 0x28 // 58 Analog RF Configuration |
manumaet | 17:8afa5f9122da | 42 | #define DW1000_TX_CAL 0x2A // 52 Transmitter calibration block |
manumaet | 17:8afa5f9122da | 43 | #define DW1000_FS_CTRL 0x2B // 21 Frequency synthesiser control block |
manumaet | 17:8afa5f9122da | 44 | #define DW1000_AON 0x2C // 12 Always-On register set |
manumaet | 17:8afa5f9122da | 45 | #define DW1000_OTP_IF 0x2D // 18 One Time Programmable Memory Interface |
manumaet | 17:8afa5f9122da | 46 | #define DW1000_LDE_CTRL 0x2E // - Leading edge detection control block |
manumaet | 17:8afa5f9122da | 47 | #define DW1000_DIG_DIAG 0x2F // 41 Digital Diagnostics Interface |
manumaet | 17:8afa5f9122da | 48 | #define DW1000_PMSC 0x36 // 48 Power Management System Control Block |
manumaet | 0:f50e671ffff7 | 49 | |
manumaet | 0:f50e671ffff7 | 50 | #define DW1000_WRITE_FLAG 0x80 // First Bit of the address has to be 1 to indicate we want to write |
manumaet | 0:f50e671ffff7 | 51 | #define DW1000_SUBADDRESS_FLAG 0x40 // if we have a sub address second Bit has to be 1 |
manumaet | 0:f50e671ffff7 | 52 | #define DW1000_2_SUBADDRESS_FLAG 0x80 // if we have a long sub adress (more than 7 Bit) we set this Bit in the first part |
manumaet | 0:f50e671ffff7 | 53 | |
manumaet | 8:7a9c61242e2f | 54 | class DW1000 { |
manumaet | 0:f50e671ffff7 | 55 | public: |
manumaet | 7:e634eeafc4d2 | 56 | DW1000(PinName MOSI, PinName MISO, PinName SCLK, PinName CS, PinName IRQ); // constructor, uses SPI class |
manumaet | 0:f50e671ffff7 | 57 | |
manumaet | 0:f50e671ffff7 | 58 | // Device API |
manumaet | 17:8afa5f9122da | 59 | uint32_t getDeviceID(); // gets the Device ID which should be 0xDECA0130 (good for testing SPI!) |
manumaet | 17:8afa5f9122da | 60 | uint64_t getEUI(); // gets 64 bit Extended Unique Identifier according to IEEE standard |
manumaet | 17:8afa5f9122da | 61 | void setEUI(uint64_t EUI); // sets 64 bit Extended Unique Identifier according to IEEE standard |
manumaet | 17:8afa5f9122da | 62 | float getVoltage(); // gets the current chip voltage measurement form the A/D converter |
manumaet | 18:bbc7ca7d3a95 | 63 | uint64_t getStatus(); // get the 40 bit device status |
manumaet | 0:f50e671ffff7 | 64 | |
manumaet | 10:d077bb12d259 | 65 | void sendString(char* message); // to send String with arbitrary length |
manumaet | 17:8afa5f9122da | 66 | char* receiveString(); // to receive char string with arbitrary length (ATTENTION! you have to delete the returned memory location like "client delete[] receivedMessage;") |
manumaet | 17:8afa5f9122da | 67 | void sendFrame(uint8_t* message, uint16_t length); // send a raw frame (length in bytes) |
manumaet | 17:8afa5f9122da | 68 | void startRX(); // start listening for frames |
manumaet | 17:8afa5f9122da | 69 | void stopRX(); // stop listening for frames |
manumaet | 4:6240b9c7a033 | 70 | |
manumaet | 0:f50e671ffff7 | 71 | //private: |
manumaet | 17:8afa5f9122da | 72 | bool receiving; // holds if we need to preserve a receiving state after sending |
manumaet | 12:985aa9843c3c | 73 | |
manumaet | 17:8afa5f9122da | 74 | void loadLDE(); // load the leading edge detection algorithm to RAM, [IMPORTANT because receiving malfunction may occur] see User Manual LDELOAD on p22 & p158 |
manumaet | 17:8afa5f9122da | 75 | void stopTRX(); // disable tranceiver go back to idle mode |
manumaet | 17:8afa5f9122da | 76 | void resetRX(); // soft reset only the tranciever part of DW1000 |
manumaet | 17:8afa5f9122da | 77 | void resetAll(); // soft reset the entire DW1000 (some registers stay as they were see User Manual) |
manumaet | 17:8afa5f9122da | 78 | |
manumaet | 17:8afa5f9122da | 79 | // Interrupt |
manumaet | 17:8afa5f9122da | 80 | InterruptIn irq; // Pin used to handle Events from DW1000 by an Interrupthandler |
manumaet | 18:bbc7ca7d3a95 | 81 | void (*callbackRX) (int framelength); // function pointer to callback which is called when successfull RX took place |
manumaet | 18:bbc7ca7d3a95 | 82 | void (*callbackTX) (); // function pointer to callback which is called when successfull TX took place |
manumaet | 17:8afa5f9122da | 83 | void ISR(); // interrupt handling method (also calls according callback methods) |
manumaet | 18:bbc7ca7d3a95 | 84 | uint16_t getFramelength(); // to get the framelength of the received frame from the PHY header |
manumaet | 0:f50e671ffff7 | 85 | |
manumaet | 0:f50e671ffff7 | 86 | // SPI Inteface |
manumaet | 0:f50e671ffff7 | 87 | SPI spi; // SPI Bus |
manumaet | 0:f50e671ffff7 | 88 | DigitalOut cs; // Slave selector for SPI-Bus (here explicitly needed to start and end SPI transactions also usable to wake up DW1000) |
manumaet | 0:f50e671ffff7 | 89 | |
manumaet | 18:bbc7ca7d3a95 | 90 | uint8_t readRegister8(uint8_t reg, uint16_t subaddress); // expressive methods to read or write the number of bits written in the name |
manumaet | 18:bbc7ca7d3a95 | 91 | uint16_t readRegister16(uint8_t reg, uint16_t subaddress); |
manumaet | 18:bbc7ca7d3a95 | 92 | uint64_t readRegister40(uint8_t reg, uint16_t subaddress); |
manumaet | 18:bbc7ca7d3a95 | 93 | void writeRegister8(uint8_t reg, uint16_t subaddress, uint8_t buffer); |
manumaet | 18:bbc7ca7d3a95 | 94 | void writeRegister16(uint8_t reg, uint16_t subaddress, uint16_t buffer); |
manumaet | 8:7a9c61242e2f | 95 | |
manumaet | 0:f50e671ffff7 | 96 | void readRegister(uint8_t reg, uint16_t subaddress, uint8_t *buffer, int length); |
manumaet | 0:f50e671ffff7 | 97 | void writeRegister(uint8_t reg, uint16_t subaddress, uint8_t *buffer, int length); |
manumaet | 0:f50e671ffff7 | 98 | void setupTransaction(uint8_t reg, uint16_t subaddress, bool write); // writes bytes to SPI to setup a write or read transaction the register address and subaddress |
manumaet | 0:f50e671ffff7 | 99 | void select(); // selects the only slave for a transaction |
manumaet | 0:f50e671ffff7 | 100 | void deselect(); // deselects the only slave after transaction |
manumaet | 0:f50e671ffff7 | 101 | }; |
manumaet | 0:f50e671ffff7 | 102 | |
manumaet | 7:e634eeafc4d2 | 103 | #endif |