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 109 #define RANGING_ERROR 0x00 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 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> 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 125 #define DW1000_REGISTER_DEV_ID 0x00 127 #define DW1000_REGISTER_EUI 0x01 129 #define DW1000_REGISTER_PANADR 0x03 130 #define DW1000_REGISTER_PANADR_SHORT_ADDRESS_OFFSET 0x00 131 #define DW1000_REGISTER_PANADR_PANID_OFFSET 0x02 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 138 #define DW1000_REGISTER_SYS_TIME 0x06 140 #define DW1000_REGISTER_TX_FCTRL 0x08 141 #define DW1000_REGISTER_TX_FCTRL_FRAME_LENGTH_MASK 0x000003FF 143 #define DW1000_REGISTER_TX_BUFFER 0x09 145 #define DW1000_REGISTER_DX_TIME 0x0A 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 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 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 166 #define DW1000_REGISTER_RX_FINFO 0x10 167 #define DW1000_REGISTER_RX_FINFO_RXFLEN_MASK 0x000003FF 169 #define DW1000_REGISTER_RX_BUFFER 0x11 171 #define DW1000_REGISTER_RX_RFQUAL 0x12 173 #define DW1000_REGISTER_RX_TTCKI 0x13 175 #define DW1000_REGISTER_RX_TTCKO 0x14 177 #define DW1000_REGISTER_RX_TIME 0x15 179 #define DW1000_REGISTER_TX_TIME 0x17 181 #define DW1000_REGISTER_TX_ANTD 0x18 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 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 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 202 #define DW1000_REGISTER_PMSC_CTRL0 0x36 203 #define DW1000_REGISTER_OFFSET_PMSC_CTRL0 0x00 205 #define DW1000_REGISTER_PMSC_CTRL1 0x36 206 #define DW1000_REGISTER_OFFSET_PMSC_CTRL1 0x04 236 boolean init(uint32_t shortAddrAndPanId);
463 uint8_t
pdDataRequest(uint8_t* buf, uint16_t len, uint8_t delayed, uint64_t time);
473 uint8_t
send(uint8_t* buf, uint16_t len);
485 uint8_t
send(uint8_t* buf, uint16_t len, uint8_t delayed, uint64_t time);
506 void setRxBuffer(uint8_t* buf, uint16_t *len, uint16_t max);
793 void readSpi(uint8_t address, uint8_t* buf, uint16_t len);
805 void readSpiSubAddress(uint8_t address, uint16_t subAddress, uint8_t* buf, uint16_t len);
814 uint32_t readSpiUint32(uint8_t address);
825 void writeSpi(uint8_t address, uint8_t* buf, uint16_t len);
837 void writeSpiSubAddress(uint8_t address, uint16_t subAddress, uint8_t* buf, uint16_t len);
847 void writeSpiUint32(uint8_t address, uint32_t ui32t);
855 uint16_t getAntennaDelayReg();
864 void setAntennaDelayReg(uint16_t newAntennaDelay);
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 );
872 uint16_t antennaDelay;
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'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'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'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's ROM.
Definition: DecaDuino.cpp:937
float getTemperature(void)
Gets the temperature value in celsius degrees from the DW1000's embedded temperature sensor...
Definition: DecaDuino.cpp:1260
uint16_t getPanId()
Gets the PanId (Personnal Area Network Identifier) stored in the DW1000'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'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'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'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'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'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