DecaDuino
Ranging/synchronisation over UWB - DecaDuino library for Arduino
DecaDuino.h
Go to the documentation of this file.
1 // DecaDuino.h
2 //
3 // Another DecaWave DW1000 driver for Arduino
4 // See the README file in this directory for documentation
5 //
92 
93 #ifndef DecaDuino_h
94 #define DecaDuino_h
95 
96 #include "Arduino.h"
97 
98 //#define DECADUINO_DEBUG
99 
100 #define DW1000_IRQ0_PIN 9
101 #define DW1000_IRQ1_PIN 0
102 #define DW1000_IRQ2_PIN 1
103 #define DW1000_CS0_PIN 10
104 #define DW1000_CS1_PIN 10
105 #define DW1000_CS2_PIN 10
106 #define MAX_NB_DW1000_FOR_INTERRUPTS 32
107 #define DEBUG_STR_LEN 256
108 
109 #define RANGING_ERROR 0x00
110 
111 #define DW1000_TIMEBASE 15.65E-12
112 #define AIR_SPEED_OF_LIGHT 282622876.092008 // @brief Unofficial celerity value, prototype based, by Adrien van den Bossche <vandenbo at univ-tlse2.fr>
113 #define RANGING_UNIT AIR_SPEED_OF_LIGHT*DW1000_TIMEBASE
114 
115 #define DWM1000_DEFAULT_ANTENNA_DELAY_VALUE 32847 //@brief Calibration value for DWM1000 on IRIT's DecaWiNo, by Adrien van den Bossche <vandenbo at univ-tlse2.fr>
116 
117 #define DW1000_TRX_STATUS_IDLE 0
118 #define DW1000_TRX_STATUS_TX 1
119 #define DW1000_TRX_STATUS_RX 2
120 #define DW1000_TRX_STATUS_SLEEP 3
121 
122 
123 // DW1000 register map
124 
125 #define DW1000_REGISTER_DEV_ID 0x00
126 
127 #define DW1000_REGISTER_EUI 0x01
128 
129 #define DW1000_REGISTER_PANADR 0x03
130 #define DW1000_REGISTER_PANADR_SHORT_ADDRESS_OFFSET 0x00
131 #define DW1000_REGISTER_PANADR_PANID_OFFSET 0x02
132 
133 #define DW1000_REGISTER_SYS_CFG 0x04
134 #define DW1000_REGISTER_SYS_CFG_RXAUTR_MASK 0x20000000
135 #define DW1000_REGISTER_SYS_CFG_PHR_MODE_MASK 0x00030000
136 #define DW1000_REGISTER_SYS_CFG_PHR_MODE_SHIFT 16
137 
138 #define DW1000_REGISTER_SYS_TIME 0x06
139 
140 #define DW1000_REGISTER_TX_FCTRL 0x08
141 #define DW1000_REGISTER_TX_FCTRL_FRAME_LENGTH_MASK 0x000003FF
142 
143 #define DW1000_REGISTER_TX_BUFFER 0x09
144 
145 #define DW1000_REGISTER_DX_TIME 0x0A
146 
147 #define DW1000_REGISTER_SYS_CTRL 0x0D
148 #define DW1000_REGISTER_SYS_CTRL_TXSTRT_MASK 0x00000002
149 #define DW1000_REGISTER_SYS_CTRL_TXDLYS_MASK 0x00000004
150 #define DW1000_REGISTER_SYS_CTRL_TRXOFF_MASK 0x00000040
151 #define DW1000_REGISTER_SYS_CTRL_RXENAB_MASK 0x00000100
152 
153 #define DW1000_REGISTER_SYS_MASK 0x0E
154 #define DW1000_REGISTER_SYS_MASK_MTXFRS_MASK 0x00000080
155 #define DW1000_REGISTER_SYS_MASK_MRXDFR_MASK 0x00002000
156 #define DW1000_REGISTER_SYS_MASK_MRXFCG_MASK 0x00004000
157 
158 #define DW1000_REGISTER_SYS_STATUS 0x0F
159 #define DW1000_REGISTER_SYS_STATUS_IRQS_MASK 0x00000001
160 #define DW1000_REGISTER_SYS_STATUS_TXFRS_MASK 0x00000080
161 #define DW1000_REGISTER_SYS_STATUS_LDEDONE_MASK 0x00000400
162 #define DW1000_REGISTER_SYS_STATUS_RXDFR_MASK 0x00002000
163 #define DW1000_REGISTER_SYS_STATUS_RXFCG_MASK 0x00004000
164 #define DW1000_REGISTER_SYS_STATUS_RXFCE_MASK 0x00008000
165 
166 #define DW1000_REGISTER_RX_FINFO 0x10
167 #define DW1000_REGISTER_RX_FINFO_RXFLEN_MASK 0x000003FF
168 
169 #define DW1000_REGISTER_RX_BUFFER 0x11
170 
171 #define DW1000_REGISTER_RX_RFQUAL 0x12
172 
173 #define DW1000_REGISTER_RX_TTCKI 0x13
174 
175 #define DW1000_REGISTER_RX_TTCKO 0x14
176 
177 #define DW1000_REGISTER_RX_TIME 0x15
178 
179 #define DW1000_REGISTER_TX_TIME 0x17
180 
181 #define DW1000_REGISTER_TX_ANTD 0x18
182 
183 #define DW1000_REGISTER_CHAN_CTRL 0x1F
184 #define DW1000_REGISTER_CHAN_CTRL_TX_CHAN_MASK 0x0000000F
185 #define DW1000_REGISTER_CHAN_CTRL_RX_CHAN_MASK 0x000000F0
186 #define DW1000_REGISTER_CHAN_CTRL_RXPRF_MASK 0x000C0000
187 #define DW1000_REGISTER_CHAN_CTRL_TX_PCODE_MASK 0x07C00000
188 #define DW1000_REGISTER_CHAN_CTRL_RX_PCODE_MASK 0xF8000000
189 
190 #define DW1000_REGISTER_AON_CTRL 0x2C
191 #define DW1000_REGISTER_OFFSET_AON_CTRL 0x02
192 #define DW1000_REGISTER_AON_CTRL_UPL_CFG_MASK 0x04
193 
194 #define DW1000_REGISTER_AON_CFG0 0x2C
195 #define DW1000_REGISTER_OFFSET_AON_CFG0 0x06
196 #define DW1000_REGISTER_AON_CFG0_SLEEP_EN_MASK 0x01
197 #define DW1000_REGISTER_AON_CFG0_WAKE_PIN_MASK 0x02
198 #define DW1000_REGISTER_AON_CFG0_WAKE_SPI_MASK 0x04
199 #define DW1000_REGISTER_AON_CFG0_WAKE_CNT_MASK 0x08
200 #define DW1000_REGISTER_AON_CFG0_LPDIV_EN_MASK 0x10
201 
202 #define DW1000_REGISTER_PMSC_CTRL0 0x36
203 #define DW1000_REGISTER_OFFSET_PMSC_CTRL0 0x00
204 
205 #define DW1000_REGISTER_PMSC_CTRL1 0x36
206 #define DW1000_REGISTER_OFFSET_PMSC_CTRL1 0x04
207 
208 
209 class DecaDuino {
210 
211  public:
219  DecaDuino(uint8_t slaveSelectPin = DW1000_CS0_PIN, uint8_t interruptPin = DW1000_IRQ0_PIN);
220 
227  boolean init();
228 
236  boolean init(uint32_t shortAddrAndPanId);
237 
244  void resetDW1000();
245 
253  void setPHRMode(uint8_t mode);
254 
261  uint8_t getPHRMode(void);
262 
270  void getSystemTimeCounter(uint64_t *p);
271 
278  uint64_t getSystemTimeCounter(void);
279 
286  uint16_t getPanId();
287 
294  uint16_t getShortAddress();
295 
302  uint64_t getEuid();
303 
311  void setPanId(uint16_t panId);
312 
320  void setShortAddress(uint16_t shortAddress);
321 
330  void setShortAddressAndPanId(uint16_t shortAddress, uint16_t panId);
331 
339  int setShortAddressAndPanId(uint32_t shortAddressPanId);
340 
347  uint8_t getChannelRaw(void);
348 
355  uint8_t getChannel(void);
356 
363  uint8_t getRxPrf(void);
364 
371  uint8_t getTxPcode(void);
372 
379  uint8_t getRxPcode(void);
380 
388  bool setChannel(uint8_t channel);
389 
397  bool setRxPrf(uint8_t prf);
398 
406  bool setTxPcode(uint8_t pcode);
407 
415  bool setRxPcode(uint8_t pcode);
416 
423  int getPreambleLength(void);
424 
432  bool setPreambleLength(int plength);
433 
441  uint64_t alignDelayedTransmission ( uint64_t wantedDelay );
442 
451  uint8_t pdDataRequest(uint8_t* buf, uint16_t len);
452 
463  uint8_t pdDataRequest(uint8_t* buf, uint16_t len, uint8_t delayed, uint64_t time);
464 
473  uint8_t send(uint8_t* buf, uint16_t len);
474 
485  uint8_t send(uint8_t* buf, uint16_t len, uint8_t delayed, uint64_t time);
486 
495  void setRxBuffer(uint8_t* buf, uint16_t *len);
496 
506  void setRxBuffer(uint8_t* buf, uint16_t *len, uint16_t max);
507 
514  void plmeRxEnableRequest(void);
515 
523  void plmeRxEnableRequest(uint16_t max);
524 
533  void plmeRxEnableRequest(uint8_t* buf, uint16_t *len);
534 
544  void plmeRxEnableRequest(uint8_t* buf, uint16_t *len, uint16_t max);
545 
552  void plmeRxDisableRequest(void);
553 
560  void sleepRequest(void);
561 
568  uint8_t rxFrameAvailable(void);
569 
578  uint8_t rxFrameAvailable(uint8_t* buf, uint16_t *len);
579 
589  uint8_t rxFrameAvailable(uint8_t* buf, uint16_t *len, uint16_t max);
590 
597  bool hasTxSucceeded(void);
598 
605  uint8_t getTrxStatus(void);
606 
613  uint8_t getTemperatureRaw(void);
614 
622  float getTemperature(void);
623 
630  uint8_t getVoltageRaw(void);
631 
639  float getVoltage(void);
640 
648  uint16_t decodeUint16 ( uint8_t *data );
649 
658  void encodeUint16 ( uint16_t from, uint8_t *to );
659 
667  uint32_t decodeUint32 ( uint8_t *data );
668 
677  void encodeUint32 ( uint32_t from, uint8_t *to );
678 
684  uint64_t decodeUint40 ( uint8_t *data );
685 
691  void encodeUint40 ( uint64_t from, uint8_t *to );
692 
700  uint64_t decodeUint64 ( uint8_t *data );
701 
710  void encodeUint64 ( uint64_t from, uint8_t *to );
711 
719  float decodeFloat ( uint8_t *data );
720 
729  void encodeFloat ( float from, uint8_t *to );
730 
738  void printUint64 ( uint64_t ui64 );
739 
746  uint64_t getLastTxTimestamp();
747 
754  uint64_t getLastRxTimestamp();
755 
762  double getLastRxSkew();
763 
770  uint16_t getAntennaDelay();
771 
779  void setAntennaDelay(uint16_t newAntennaDelay);
780 
781 
782  private:
783 
793  void readSpi(uint8_t address, uint8_t* buf, uint16_t len);
794 
805  void readSpiSubAddress(uint8_t address, uint16_t subAddress, uint8_t* buf, uint16_t len);
806 
814  uint32_t readSpiUint32(uint8_t address);
815 
825  void writeSpi(uint8_t address, uint8_t* buf, uint16_t len);
826 
837  void writeSpiSubAddress(uint8_t address, uint16_t subAddress, uint8_t* buf, uint16_t len);
838 
847  void writeSpiUint32(uint8_t address, uint32_t ui32t);
848 
855  uint16_t getAntennaDelayReg();
856 
864  void setAntennaDelayReg(uint16_t newAntennaDelay);
865 
866  uint8_t debugStr[DEBUG_STR_LEN];
867  void spi_send ( uint8_t u8 );
868  void spi_send ( uint16_t u16 );
869  void spi_send ( uint8_t* buf, uint16_t len );
870  void spi_receive ( uint8_t* buf, uint16_t len );
871 
872  uint16_t antennaDelay;
873 
874  protected:
875 
882  static void isr0();
883 
890  static void isr1();
891 
898  static void isr2();
899 
906  void handleInterrupt();
907 
911  SPISettings currentSPISettings;
912 
916  uint64_t euid;
917 
921  uint8_t *rxData;
922 
926  uint16_t *rxDataLen;
930  uint16_t rxDataLenMax;
931 
936 
940  uint8_t trxStatus;
941 
945  bool lastTxOK;
946 
950  uint64_t lastTxTimestamp;
951 
955  uint64_t lastRxTimestamp;
956 
960  double clkOffset;
962  uint8_t _interruptPin;
964 };
965 
966 #endif
bool hasTxSucceeded(void)
Returns true if the last transmission request has been succefully completed.
Definition: DecaDuino.cpp:401
uint8_t getPHRMode(void)
Returns the PHR Mode.
Definition: DecaDuino.cpp:884
uint8_t _interruptPin
Definition: DecaDuino.h:962
bool lastTxOK
Flag indicating if last transmission is done.
Definition: DecaDuino.h:945
void setPHRMode(uint8_t mode)
Set PHR Mode.
Definition: DecaDuino.cpp:875
uint32_t decodeUint32(uint8_t *data)
Builds an uint32 value from four uint8 values.
Definition: DecaDuino.cpp:759
void setShortAddress(uint16_t shortAddress)
Sets the ShortAddress (16-bit network address, aka IEEE short address) in the DW1000&#39;s RAM...
Definition: DecaDuino.cpp:955
void encodeUint32(uint32_t from, uint8_t *to)
Formats an uint32 value as a list of uint8 values.
Definition: DecaDuino.cpp:765
bool setRxPcode(uint8_t pcode)
Sets the Rx Preamble Code.
Definition: DecaDuino.cpp:1087
void resetDW1000()
Reset the DW1000 chip.
Definition: DecaDuino.cpp:115
static DecaDuino * _DecaDuinoInterrupt[]
Definition: DecaDuino.h:963
uint64_t alignDelayedTransmission(uint64_t wantedDelay)
Returns an aligned timestamp to use with pdDataRequest() in case of delayed transmissions.
Definition: DecaDuino.cpp:407
boolean init()
Initializes DecaDuino and DWM1000 without addressing fields filtering (Promiscuous mode) ...
Definition: DecaDuino.cpp:19
uint64_t getLastRxTimestamp()
Returns last received frame timestamp based on the DWM1000 System Time Counter at 64GHz...
Definition: DecaDuino.cpp:907
DecaDuino(uint8_t slaveSelectPin=DW1000_CS0_PIN, uint8_t interruptPin=DW1000_IRQ0_PIN)
DecaDuino Constructor.
Definition: DecaDuino.cpp:12
uint8_t send(uint8_t *buf, uint16_t len)
Sends a len-byte frame from buf.
Definition: DecaDuino.cpp:475
static void isr1()
The second interrupt function.
Definition: DecaDuino.cpp:216
static void isr0()
The first interrupt function.
Definition: DecaDuino.cpp:207
uint8_t getTemperatureRaw(void)
Gets the raw value from the DW1000&#39;s embedded temperature sensor.
Definition: DecaDuino.cpp:1224
#define DEBUG_STR_LEN
Definition: DecaDuino.h:107
uint8_t rxFrameAvailable(void)
Returns true if a frame has been received.
Definition: DecaDuino.cpp:561
uint16_t getShortAddress()
Gets the ShortAddress (16-bit network address, aka IEEE short address) stored in the DW1000&#39;s RAM...
Definition: DecaDuino.cpp:928
uint8_t getChannel(void)
Returns the currently configured radio channel.
Definition: DecaDuino.cpp:1000
uint8_t trxStatus
Transceiver status.
Definition: DecaDuino.h:940
uint64_t getEuid()
Gets the Euid (Extended Unique IDentifier) stored in the DW1000&#39;s ROM.
Definition: DecaDuino.cpp:937
float getTemperature(void)
Gets the temperature value in celsius degrees from the DW1000&#39;s embedded temperature sensor...
Definition: DecaDuino.cpp:1260
uint16_t getPanId()
Gets the PanId (Personnal Area Network Identifier) stored in the DW1000&#39;s RAM.
Definition: DecaDuino.cpp:919
void plmeRxEnableRequest(void)
Sets transceiver mode to receive mode.
Definition: DecaDuino.cpp:507
bool setTxPcode(uint8_t pcode)
Sets the Tx Preamble Code.
Definition: DecaDuino.cpp:1071
uint8_t getRxPcode(void)
Returns the currently configured Rx Preamble Code.
Definition: DecaDuino.cpp:1026
void setPanId(uint16_t panId)
Sets the PanId (Personnal Area Network Identifier) in the DW1000&#39;s RAM.
Definition: DecaDuino.cpp:946
uint64_t euid
Current EUID (Extended Unique IDentifier)
Definition: DecaDuino.h:916
void plmeRxDisableRequest(void)
Sets transceiver mode to idle mode.
Definition: DecaDuino.cpp:547
uint64_t decodeUint64(uint8_t *data)
Builds an uint64 value from eight uint8 values.
Definition: DecaDuino.cpp:795
void sleepRequest(void)
Sets transceiver mode to sleep mode.
Definition: DecaDuino.cpp:1278
uint64_t lastTxTimestamp
Timestamp of last transmitted frame.
Definition: DecaDuino.h:950
float getVoltage(void)
Gets the voltage value in volts from the DW1000&#39;s embedded voltage sensor.
Definition: DecaDuino.cpp:1269
#define DW1000_CS0_PIN
Definition: DecaDuino.h:103
float decodeFloat(uint8_t *data)
Builds a float value from four uint8 values.
Definition: DecaDuino.cpp:819
uint8_t _slaveSelectPin
Definition: DecaDuino.h:961
uint8_t getTrxStatus(void)
Gets the DecaDuino transceiver status.
Definition: DecaDuino.cpp:602
uint8_t getRxPrf(void)
Returns the currently configured Pulse Repetition Frequency.
Definition: DecaDuino.cpp:1006
uint16_t * rxDataLen
The current PPDU length.
Definition: DecaDuino.h:926
uint64_t lastRxTimestamp
Timestamp of last received frame.
Definition: DecaDuino.h:955
void encodeFloat(float from, uint8_t *to)
Formats an float value as a list of uint8 values.
Definition: DecaDuino.cpp:837
void setRxBuffer(uint8_t *buf, uint16_t *len)
Sets the RX buffer for future frame reception. Received bytes will be stored at the beginning of the ...
Definition: DecaDuino.cpp:487
uint8_t getChannelRaw(void)
Returns the currently configured radio channels.
Definition: DecaDuino.cpp:991
bool setRxPrf(uint8_t prf)
Sets the Pulse Repetition Frequency.
Definition: DecaDuino.cpp:1055
uint64_t getSystemTimeCounter(void)
Returns the System Time Counter value.
Definition: DecaDuino.cpp:892
void encodeUint40(uint64_t from, uint8_t *to)
Formats an uint64 value with only 5 LSbytes as a list of uint8 values.
Definition: DecaDuino.cpp:785
uint8_t getTxPcode(void)
Returns the currently configured Tx Preamble Code.
Definition: DecaDuino.cpp:1016
uint8_t pdDataRequest(uint8_t *buf, uint16_t len)
Sends a len-byte frame from buf.
Definition: DecaDuino.cpp:413
void setAntennaDelay(uint16_t newAntennaDelay)
Sets the current antenna delay value.
Definition: DecaDuino.cpp:1198
double getLastRxSkew()
Returns last received frame&#39;s clock skew, also designated as clock offset in the Decawave documentati...
Definition: DecaDuino.cpp:913
void printUint64(uint64_t ui64)
Prints an uint64_t value on console.
Definition: DecaDuino.cpp:854
static void isr2()
The third interrupt function.
Definition: DecaDuino.cpp:225
SPISettings currentSPISettings
Current SPI-bus settings.
Definition: DecaDuino.h:911
void encodeUint64(uint64_t from, uint8_t *to)
Formats an uint64 value as a list of uint8 values.
Definition: DecaDuino.cpp:806
uint64_t decodeUint40(uint8_t *data)
Builds an uint64 value from five uint8 values.
Definition: DecaDuino.cpp:774
uint64_t getLastTxTimestamp()
Returns last transmitted frame timestamp based on the DWM1000 System Time Counter at 64GHz...
Definition: DecaDuino.cpp:901
uint16_t rxDataLenMax
The max PPDU length.
Definition: DecaDuino.h:930
uint16_t decodeUint16(uint8_t *data)
Builds an uint16 value from two uint8 values.
Definition: DecaDuino.cpp:746
uint8_t getVoltageRaw(void)
Gets the raw value from the DW1000&#39;s embedded voltage sensor.
Definition: DecaDuino.cpp:1242
uint8_t * rxData
The current (or last) PPDU.
Definition: DecaDuino.h:921
void encodeUint16(uint16_t from, uint8_t *to)
Formats an uint16 value as a list of uint8 values.
Definition: DecaDuino.cpp:752
void setShortAddressAndPanId(uint16_t shortAddress, uint16_t panId)
Sets both the ShortAddress and the PanId in the DW1000&#39;s RAM.
Definition: DecaDuino.cpp:964
uint8_t rxDataAvailable
Flag indicating if last reception has data.
Definition: DecaDuino.h:935
double clkOffset
Last clock offset (aka clock skew)
Definition: DecaDuino.h:960
uint16_t getAntennaDelay()
Returns current antenna delay value.
Definition: DecaDuino.cpp:1192
bool setPreambleLength(int plength)
Sets the preamble length.
Definition: DecaDuino.cpp:1152
int getPreambleLength(void)
Returns the preamble length.
Definition: DecaDuino.cpp:1103
#define DW1000_IRQ0_PIN
Definition: DecaDuino.h:100
void handleInterrupt()
The global interrupt function.
Definition: DecaDuino.cpp:234
Definition: DecaDuino.h:209
bool setChannel(uint8_t channel)
Sets the radio channels for TX and RX.
Definition: DecaDuino.cpp:1036