From 187d5a216bff2485bb98869e3b96a46ab2e2d808 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期一, 17 七月 2023 16:54:24 +0800
Subject: [PATCH] 改为dw3000,代码修改结束,没有测试,先提交一下。

---
 Src/decadriver/deca_device_api.h | 2301 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 1,656 insertions(+), 645 deletions(-)

diff --git a/Src/decadriver/deca_device_api.h b/Src/decadriver/deca_device_api.h
index 6adcdc3..88fb37d 100644
--- a/Src/decadriver/deca_device_api.h
+++ b/Src/decadriver/deca_device_api.h
@@ -1,10 +1,10 @@
 /*! ----------------------------------------------------------------------------
- * @file	deca_device_api.h
- * @brief	DW1000 API Functions
+ * @file    deca_device_api.h
+ * @brief   DW3000 API Functions
  *
  * @attention
  *
- * Copyright 2013 (c) DecaWave Ltd, Dublin, Ireland.
+ * Copyright 2013-2020(c) Decawave Ltd, Dublin, Ireland.
  *
  * All rights reserved.
  *
@@ -13,97 +13,59 @@
 #ifndef _DECA_DEVICE_API_H_
 #define _DECA_DEVICE_API_H_
 
-#include <stdint.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#include "deca_types.h"
+
+#ifndef DWT_NUM_DW_DEV
+#define DWT_NUM_DW_DEV (1)
+#endif
+
+
+#define DWT_BIT_MASK(bit_num)   (((uint32_t)1)<<(bit_num))
+
+/* MACRO */
+#define dwt_write32bitreg(addr,value)  dwt_write32bitoffsetreg(addr,0,value)
+#define dwt_read32bitreg(addr)     dwt_read32bitoffsetreg(addr,0)
+#define dwt_writefastCMD(cmd)     dwt_writetodevice(cmd,0,0,0)
+
+#define dwt_or8bitoffsetreg(addr, offset, or_val) dwt_modify8bitoffsetreg(addr, offset, -1, or_val)
+#define dwt_and8bitoffsetreg(addr, offset, and_val) dwt_modify8bitoffsetreg(addr, offset, and_val, 0)
+#define dwt_and_or8bitoffsetreg(addr,offset, and_val, or_val) dwt_modify8bitoffsetreg(addr,offset,and_val,or_val)
+#define dwt_set_bit_num_8bit_reg(addr,bit_num) dwt_modify8bitoffsetreg(addr,0,-1,DWT_BIT_MASK(bit_num))
+#define dwt_clr_bit_num_8bit_reg(addr,bit_num) dwt_modify8bitoffsetreg(addr,0,~DWT_BIT_MASK(bit_num),0)
+
+#define dwt_or16bitoffsetreg(addr, offset, or_val) dwt_modify16bitoffsetreg(addr, offset, -1, or_val)
+#define dwt_and16bitoffsetreg(addr, offset, and_val) dwt_modify16bitoffsetreg(addr, offset, and_val, 0)
+#define dwt_and_or16bitoffsetreg(addr,offset, and_val, or_val) dwt_modify16bitoffsetreg(addr,offset,and_val,or_val)
+#define dwt_set_bit_num_16bit_reg(addr,bit_num) dwt_modify16bitoffsetreg(addr,0,-1,DWT_BIT_MASK(bit_num))
+#define dwt_clr_bit_num_16bit_reg(addr,bit_num) dwt_modify16bitoffsetreg(addr,0,~DWT_BIT_MASK(bit_num),0)
+
+#define dwt_or32bitoffsetreg(addr, offset, or_val) dwt_modify32bitoffsetreg(addr, offset, -1, or_val)
+#define dwt_and32bitoffsetreg(addr, offset, and_val) dwt_modify32bitoffsetreg(addr, offset, and_val, 0)
+#define dwt_and_or32bitoffsetreg(addr,offset, and_val, or_val) dwt_modify32bitoffsetreg(addr,offset,and_val,or_val)
+#define dwt_set_bit_num_32bit_reg(addr,bit_num) dwt_modify32bitoffsetreg(addr,0,-1,DWT_BIT_MASK(bit_num))
+#define dwt_clr_bit_num_32bit_reg(addr,bit_num) dwt_modify32bitoffsetreg(addr,0,~DWT_BIT_MASK(bit_num),0)
+
+
+/* */
 #define DWT_SUCCESS (0)
 #define DWT_ERROR   (-1)
 
-#define DWT_TIME_UNITS          (1.0/499.2e6/128.0) //!< = 15.65e-12 s
+#define DWT_TIME_UNITS      (1.0/499.2e6/128.0) //!< = 15.65e-12 s
 
-#define DWT_DEVICE_ID   (0xDECA0130) 		//!< DW1000 MP device ID
+#define DWT_A0_DEV_ID       (0xDECA0300)        //!< DW3000 MPW A0 (non PDOA) silicon device ID
+#define DWT_A0_PDOA_DEV_ID  (0xDECA0310)        //!< DW3000 MPW A0 (with PDOA) silicon device ID
+#define DWT_B0_DEV_ID       (0xDECA0301)        //!< DW3000 MPW B0 (non PDOA) silicon device ID
+#define DWT_B0_PDOA_DEV_ID  (0xDECA0311)        //!< DW3000 MPW B0 (with PDOA) silicon device ID
+#define DWT_C0_DEV_ID       (0xDECA0302)        //!< DW3000 MPW C0 (non PDOA) silicon device ID
+#define DWT_C0_PDOA_DEV_ID  (0xDECA0312)        //!< DW3000 MPW C0 (with PDOA) silicon device ID
 
-//! constants for selecting the bit rate for data TX (and RX)
-//! These are defined for write (with just a shift) the TX_FCTRL register
-#define DWT_BR_110K		0	//!< UWB bit rate 110 kbits/s
-#define DWT_BR_850K		1	//!< UWB bit rate 850 kbits/s
-#define DWT_BR_6M8		2	//!< UWB bit rate 6.8 Mbits/s
-
-//! constants for specifying the (Nominal) mean Pulse Repetition Frequency
-//! These are defined for direct write (with a shift if necessary) to CHAN_CTRL and TX_FCTRL regs
-#define DWT_PRF_16M		1	//!< UWB PRF 16 MHz
-#define DWT_PRF_64M		2	//!< UWB PRF 64 MHz
-
-//! constants for specifying Preamble Acquisition Chunk (PAC) Size in symbols
-#define DWT_PAC8		0	//!< PAC  8 (recommended for RX of preamble length  128 and below
-#define DWT_PAC16		1	//!< PAC 16 (recommended for RX of preamble length  256
-#define DWT_PAC32		2	//!< PAC 32 (recommended for RX of preamble length  512
-#define DWT_PAC64		3	//!< PAC 64 (recommended for RX of preamble length 1024 and up
-
-//! constants for specifying TX Preamble length in symbols
-//! These are defined to allow them be directly written into byte 2 of the TX_FCTRL register
-//! (i.e. a four bit value destined for bits 20..18 but shifted left by 2 for byte alignment)
-#define DWT_PLEN_4096	0x0C	//! Standard preamble length 4096 symbols
-#define DWT_PLEN_2048	0x28	//! Non-standard preamble length 2048 symbols
-#define DWT_PLEN_1536	0x18	//! Non-standard preamble length 1536 symbols
-#define DWT_PLEN_1024	0x08	//! Standard preamble length 1024 symbols
-#define DWT_PLEN_512	0x34	//! Non-standard preamble length 512 symbols
-#define DWT_PLEN_256	0x24	//! Non-standard preamble length 256 symbols
-#define DWT_PLEN_128	0x14	//! Non-standard preamble length 128 symbols
-#define DWT_PLEN_64		0x04	//! Standard preamble length 64 symbols
-
-//! callback events
-#define DWT_SIG_RX_NOERR			0
-#define DWT_SIG_TX_DONE             1		// Frame has been sent
-#define DWT_SIG_RX_OKAY             2       // Frame Received with Good CRC
-#define DWT_SIG_RX_ERROR            3       // Frame Received but CRC is wrong
-#define DWT_SIG_RX_TIMEOUT          4       // Timeout on receive has elapsed
-#define DWT_SIG_TX_AA_DONE			6		// ACK frame has been sent (as a result of auto-ACK)
-
-#define DWT_SIG_RX_PHR_ERROR        8       // Error found in PHY Header
-#define DWT_SIG_RX_SYNCLOSS         9       // Un-recoverable error in Reed Solomon Decoder
-#define DWT_SIG_RX_SFDTIMEOUT       10      // Saw preamble but got no SFD within configured time
-#define DWT_SIG_RX_PTOTIMEOUT		11		// Got preamble detection timeout (no preamble detected)
-#define DWT_SIG_TX_PENDING			12		// Delayed TX is pending
-#define DWT_SIG_TX_ERROR			13      // TX failed
-#define DWT_SIG_RX_PENDING 			14 		// RX has been re-enabled
-
-#define DWT_SFDTOC_DEF				0x1041	// default SFD timeout value
-
-#define DWT_PHRMODE_STD				0x0		// standard PHR mode
-#define DWT_PHRMODE_EXT				0x3		// DW proprietary extended frames PHR mode
-
-// Defined constants for "mode" bitmask parameter passed into dwt_starttx() function.
-#define DWT_START_TX_IMMEDIATE      0
-#define DWT_START_TX_DELAYED        1
-#define DWT_RESPONSE_EXPECTED		2
-
-
-//frame filtering configuration options
-#define DWT_FF_NOTYPE_EN			0x000			// no frame types allowed (FF disabled)
-#define DWT_FF_COORD_EN				0x002			// behave as coordinator (can receive frames with no dest address (PAN ID has to match))
-#define DWT_FF_BEACON_EN			0x004			// beacon frames allowed
-#define DWT_FF_DATA_EN				0x008			// data frames allowed
-#define DWT_FF_ACK_EN				0x010			// ack frames allowed
-#define DWT_FF_MAC_EN				0x020			// mac control frames allowed
-#define DWT_FF_RSVD_EN				0x040			// reserved frame types allowed
-
-//DW1000 interrupt events
-#define DWT_INT_TFRS			0x00000080			// frame sent
-#define DWT_INT_LDED            0x00000400			// micro-code has finished execution
-#define DWT_INT_RFCG			0x00004000			// frame received with good CRC
-#define DWT_INT_RPHE			0x00001000			// receiver PHY header error
-#define DWT_INT_RFCE			0x00008000			// receiver CRC error
-#define DWT_INT_RFSL			0x00010000			// receiver sync loss error
-#define DWT_INT_RFTO			0x00020000			// frame wait timeout
-#define DWT_INT_RXOVRR			0x00100000			// receiver overrun
-#define DWT_INT_RXPTO			0x00200000			// preamble detect timeout
-#define DWT_INT_SFDT			0x04000000			// SFD timeout
-#define DWT_INT_ARFE			0x20000000			// frame rejected (due to frame filtering configuration)
-
+#define DELAY_20uUSec           (20)/*Delay of 20uSec(measured 24uSec)*/
+#define MAX_RETRIES_FOR_PLL     (6)
+#define MAX_RETRIES_FOR_PGF     (3)
 
 //DW1000 SLEEP and WAKEUP configuration parameters
 #define DWT_PRESRV_SLEEP 0x0100                      // PRES_SLEEP - on wakeup preserve sleep bit
@@ -116,39 +78,342 @@
 #define DWT_WAKE_CS      0x4						// wake up on chip select
 #define DWT_WAKE_WK      0x2						// wake up on WAKEUP PIN
 #define DWT_SLP_EN       0x1						// enable sleep/deep sleep functionality
-
-//DW1000 INIT configuration parameters
-#define DWT_LOADUCODE     0x1
-#define DWT_LOADNONE	  0x0
-
-//DW1000 OTP operating parameter set selection
-#define DWT_OPSET_64LEN   0x0
-#define DWT_OPSET_TIGHT   0x1
-#define DWT_OPSET_DEFLT   0x2
-
-typedef struct
-{
-
-    uint32_t status;      //initial value of register as ISR is entered
-    uint8_t  event;		//event type
-    uint8_t  aatset;		//auto ACK TX bit is set
-    uint16_t datalength;	//length of frame
-    uint8_t  fctrl[2];	//frame control bytes
-    uint8_t  dblbuff ;	//set if double buffer is enabled
-
-} dwt_callback_data_t;
-
-
 typedef enum
 {
-    CHAN_CTRL_TXCHAN_1 = 0x01,	/* Selects the transmit channel 1 */
-    CHAN_CTRL_TXCHAN_2 = 0x02,	/* Selects the transmit channel 2 */
-    CHAN_CTRL_TXCHAN_3 = 0x03,	/* Selects the transmit channel 3 */
-    CHAN_CTRL_TXCHAN_4 = 0x04,	/* Selects the transmit channel 4 */
-    CHAN_CTRL_TXCHAN_5 = 0x05,	/* Selects the transmit channel 5 */
-    CHAN_CTRL_TXCHAN_7 = 0x07	/* Selects the transmit channel 7 */
-} eCHAN;
+     AOA,
+     NON_AOA
+}dw3000type_e;
 
+typedef enum {
+    DW3000_SPI_RD_BIT    = 0x0000U,
+    DW3000_SPI_WR_BIT    = 0x8000U,
+    DW3000_SPI_AND_OR_8  = 0x8001U,
+    DW3000_SPI_AND_OR_16 = 0x8002U,
+    DW3000_SPI_AND_OR_32 = 0x8003U,
+}spi_modes_e;
+
+//! fast commands
+#define CMD_DB_TOGGLE     0x13   //!< Toggle double buffer pointer
+#define CMD_CLR_IRQS      0x12   //!< Clear all events/clear interrupt
+#define CMD_CCA_TX_W4R    0x11   //!< Check if channel clear prior to TX, enable RX when TX done
+#define CMD_DTX_REF_W4R   0x10   //!< Start delayed TX (as DTX_REF below), enable RX when TX done
+#define CMD_DTX_RS_W4R    0xF    //!< Start delayed TX (as DTX_RS below), enable RX when TX done
+#define CMD_DTX_TS_W4R    0xE    //!< Start delayed TX (as DTX_TS below), enable RX when TX done
+#define CMD_DTX_W4R       0xD    //!< Start delayed TX (as DTX below), enable RX when TX done
+#define CMD_TX_W4R        0xC    //!< Start TX (as below), enable RX when TX done
+#define CMD_CCA_TX        0xB    //!< Check if channel clear prior to TX
+#define CMD_DRX_REF       0xA    //!< Enable RX @ time = DREF_TIME + DX_TIME
+#define CMD_DTX_REF       0x9    //!< Start delayed TX (RMARKER will be @ time = DREF_TIME + DX_TIME)
+#define CMD_DRX_RS        0x8    //!< Enable RX @ time = RX_TIME + DX_TIME
+#define CMD_DTX_RS        0x7    //!< Start delayed TX (RMARKER will be @ time = RX_TIME + DX_TIME)
+#define CMD_DRX_TS        0x6    //!< Enable RX @ time = TX_TIME + DX_TIME
+#define CMD_DTX_TS        0x5    //!< Start delayed TX (RMARKER will be @ time = TX_TIME + DX_TIME)
+#define CMD_DRX           0x4    //!< Enable RX @ time specified in DX_TIME register
+#define CMD_DTX           0x3    //!< Start delayed TX (RMARKER will be @ time set in DX_TIME register)
+#define CMD_RX            0x2    //!< Enable RX
+#define CMD_TX            0x1    //!< Start TX
+#define CMD_TXRXOFF       0x0    //!< Turn off TX or RX, clear any TX/RX events and put DW3000 into IDLE
+
+//! constants for selecting the bit rate for data TX (and RX)
+//! These are defined for write (with just a shift) the TX_FCTRL register
+#define DWT_BR_850K     0   //!< UWB bit rate 850 kbits/s
+#define DWT_BR_6M8      1   //!< UWB bit rate 6.8 Mbits/s
+#define DWT_BR_NODATA   2   //!< No data (SP3 packet format)
+
+//! constants for specifying the (Nominal) mean Pulse Repetition Frequency
+//! These are defined for direct write (with a shift if necessary) to CHAN_CTRL and TX_FCTRL regs
+#define DWT_PRF_16M     1   //!< UWB PRF 16 MHz
+#define DWT_PRF_64M     2   //!< UWB PRF 64 MHz
+#define DWT_PRF_SCP     3   //!< SCP UWB PRF ~100 MHz
+
+//! constants for specifying Preamble Acquisition Chunk (PAC) Size in symbols
+#define DWT_PAC8        0   //!< PAC  8 (recommended for RX of preamble length  128 and below
+#define DWT_PAC16       1   //!< PAC 16 (recommended for RX of preamble length  256
+#define DWT_PAC32       2   //!< PAC 32 (recommended for RX of preamble length  512
+#define DWT_PAC4        3   //!< PAC  4 (recommended for RX of preamble length  < 127
+
+//! constants for specifying SFD Types and size
+#define DWT_SFD_IEEE_4A 0   //!< IEEE 8-bit ternary
+#define DWT_SFD_DW_8    1   //!< DW 8-bit
+#define DWT_SFD_DW_16   2   //!< DW 16-bit
+#define DWT_SFD_IEEE_4Z 3   //!< IEEE 8-bit binary (4z)
+#define DWT_SFD_LEN8    (8) //!< IEEE, and DW 8-bit are length 8
+#define DWT_SFD_LEN16   (16)//!< DW 16-bit is length 16
+
+//! constants for specifying TX Preamble length in symbols
+//! These are defined to allow them be directly written into byte 2 of the TX_FCTRL register
+//! (i.e. a four bit value destined for bits 20..18 but shifted left by 2 for byte alignment)
+#define DWT_PLEN_4096   0x03    //! Standard preamble length 4096 symbols
+#define DWT_PLEN_2048   0x0A    //! Non-standard preamble length 2048 symbols
+#define DWT_PLEN_1536   0x06    //! Non-standard preamble length 1536 symbols
+#define DWT_PLEN_1024   0x02    //! Standard preamble length 1024 symbols
+#define DWT_PLEN_512    0x0d    //! Non-standard preamble length 512 symbols
+#define DWT_PLEN_256    0x09    //! Non-standard preamble length 256 symbols
+#define DWT_PLEN_128    0x05    //! Non-standard preamble length 128 symbols
+#define DWT_PLEN_64     0x01    //! Standard preamble length 64 symbols
+#define DWT_PLEN_32     0x04    //! Non-standard length 32
+#define DWT_PLEN_72     0x07    //! Non-standard length 72
+
+#define DWT_SFDTOC_DEF          129  // default SFD timeout value
+
+#define DWT_PHRMODE_STD         0x0     // standard PHR mode
+#define DWT_PHRMODE_EXT         0x1     // DW proprietary extended frames PHR mode
+
+#define DWT_PHRRATE_STD         0x0     // standard PHR rate
+#define DWT_PHRRATE_DTA         0x1     // PHR at data rate (6M81)
+
+// Define DW3000 PDOA modes
+#define DWT_PDOA_M0           0x0     // DW PDOA mode is off
+#define DWT_PDOA_M1           0x1     // DW PDOA mode  mode 1
+#define DWT_PDOA_M3           0x3     // DW PDOA mode  mode 3
+
+// Define DW3000 STS modes
+#define DWT_STS_MODE_OFF         0x0     // STS is off
+#define DWT_STS_MODE_1           0x1     // STS mode 1
+#define DWT_STS_MODE_2           0x2     // STS mode 2
+#define DWT_STS_MODE_ND          0x3     // STS with no data
+#define DWT_STS_MODE_SDC         0x8     // Enable Super Deterministic Codes
+#define DWT_STS_CONFIG_MASK      0xB
+
+
+#define DWT_SFD_COUNT_WARN      (0x2000 >> 7)   // SFD count warning bit (STS quality status bit)
+
+// Defined constants for "mode" bitmask parameter passed into dwt_starttx() function.
+#define DWT_START_TX_IMMEDIATE      0x00    //! Send the frame immediately
+#define DWT_START_TX_DELAYED        0x01    //! Send the frame at specified time (time must be less that half period away)
+#define DWT_RESPONSE_EXPECTED       0x02    //! Will enable the receiver after TX has completed
+#define DWT_START_TX_DLY_REF        0x04    //! Send the frame at specified time (time in DREF_TIME register + any time in DX_TIME register)
+#define DWT_START_TX_DLY_RS         0x08    //! Send the frame at specified time (time in RX_TIME_0 register + any time in DX_TIME register)
+#define DWT_START_TX_DLY_TS         0x10    //! Send the frame at specified time (time in TX_TIME_LO register + any time in DX_TIME register)
+
+#define DWT_START_TX_CCA            0x20    //! Send the frame if no preamble detected within PTO time
+
+// Defined constants for "mode" bitmask parameter passed into dwt_rxenable() function.
+#define DWT_START_RX_IMMEDIATE      0x00    //! Enable the receiver immediately
+#define DWT_START_RX_DELAYED        0x01    //! Set up delayed RX, if "late" error triggers, then the RX will be enabled immediately
+#define DWT_IDLE_ON_DLY_ERR         0x02    //! If delayed RX failed due to "late" error then if this
+                                            //! flag is set the RX will not be re-enabled immediately, and device will be in IDLE when function exits
+#define DWT_START_RX_DLY_REF        0x04    //! Enable the receiver at specified time (time in DREF_TIME register + any time in DX_TIME register)
+#define DWT_START_RX_DLY_RS         0x08    //! Enable the receiver at specified time (time in RX_TIME_0 register + any time in DX_TIME register)
+#define DWT_START_RX_DLY_TS         0x10    //! Enable the receiver at specified time (time in TX_TIME_LO register + any time in DX_TIME register)
+
+// Defined constants when SPI CRC mode is used:
+typedef enum
+{
+    DWT_SPI_CRC_MODE_NO = 0,    /* No CRC */
+    DWT_SPI_CRC_MODE_WR,        /* This is used to enable SPI CRC check (the SPI CRC check will be enabled on DW3000 and CRC-8 added for SPI write transactions) */
+    DWT_SPI_CRC_MODE_WRRD       /* This is used to optionally enable additional CRC check on the SPI read operations, while the CRC check on the SPI write operations is also enabled */
+}dwt_spi_crc_mode_e;
+
+
+// Defined constants for "mode" bit field parameter passed to dwt_setleds() function.
+#define DWT_LEDS_DISABLE     0x00
+#define DWT_LEDS_ENABLE      0x01
+#define DWT_LEDS_INIT_BLINK  0x02
+// Default blink time. Blink time is expressed in multiples of 14 ms. The value defined here is ~225 ms.
+#define DWT_LEDS_BLINK_TIME_DEF 0x10
+
+#define GPIO_PIN2_RXLED         (((uint32_t)0x1)<<6)    /* The pin operates as the RXLED output */
+#define GPIO_PIN3_TXLED         (((uint32_t)0x1)<<9)    /* The pin operates as the TXLED output */
+
+#define GPIO_PIN0_EXTTXE        (((uint32_t)0x2)<<0)    /* The pin operates as the EXTTXE output (output TX state) */
+#define GPIO_PIN1_EXTRXE        (((uint32_t)0x2)<<3)    /* The pin operates as the EXTRXE output (output RX state) */
+
+#define GPIO_PIN4_EXTDA         (((uint32_t)0x1)<<12)   /* The pin operates to support external DA/PA */
+#define GPIO_PIN5_EXTTX         (((uint32_t)0x1)<<15)   /* The pin operates to support external PA */
+#define GPIO_PIN6_EXTRX         (((uint32_t)0x1)<<18)   /* The pin operates to support external LNA */
+
+// Defined constants for "lna_pa" bit field parameter passed to dwt_setlnapamode() function
+#define DWT_LNA_PA_DISABLE     0x00
+#define DWT_LNA_ENABLE         0x01
+#define DWT_PA_ENABLE          0x02
+#define DWT_TXRX_EN            0x04
+
+//Reset options
+#define DWT_RESET_ALL          0x00
+#define DWT_RESET_CTRX         0x0F
+#define DWT_RESET_RX           0xEF
+#define DWT_RESET_CLEAR        0xFF
+
+//frame filtering configuration options
+#define DWT_FF_ENABLE_802_15_4      0x2             // enable FF for 802.15.4
+#define DWT_FF_DISABLE              0x0             // disable FF
+#define DWT_FF_BEACON_EN            0x001           // beacon frames allowed
+#define DWT_FF_DATA_EN              0x002           // data frames allowed
+#define DWT_FF_ACK_EN               0x004           // ack frames allowed
+#define DWT_FF_MAC_EN               0x008           // mac control frames allowed
+#define DWT_FF_RSVD_EN              0x010           // reserved frame types allowed
+#define DWT_FF_MULTI_EN             0x020           // multipurpose frames allowed
+#define DWT_FF_FRAG_EN              0x040           // fragmented frame types allowed
+#define DWT_FF_EXTEND_EN            0x080           // extended frame types allowed
+#define DWT_FF_COORD_EN             0x100           // behave as coordinator (can receive frames with no dest address (PAN ID has to match))
+#define DWT_FF_IMPBRCAST_EN         0x200           // allow MAC implicit broadcast
+#define DWT_FF_MAC_LE0_EN           0x408           // mac frames allowed if address in LE0_PEND mathces source address
+#define DWT_FF_MAC_LE1_EN           0x808           // mac frames allowed if address in LE1_PEND mathces source address
+#define DWT_FF_MAC_LE2_EN           0x1008           // mac frames allowed if address in LE2_PEND mathces source address
+#define DWT_FF_MAC_LE3_EN           0x2008           // mac frames allowed if address in LE3_PEND mathces source address
+
+
+// SYS_STATE_LO register errors
+#define DW_SYS_STATE_TXERR          0xD0000         // TSE is in TX but TX is in IDLE in SYS_STATE_LO register
+
+//DW3000 interrupt events
+
+#define DWT_INT_SCRC            0x00000004          // SPI write CRC error event
+#define DWT_INT_TFRS            0x00000080          // frame sent
+#define DWT_INT_LDED            0x00000400          // micro-code has finished execution
+#define DWT_INT_RFCG            0x00004000          // frame received with good CRC
+#define DWT_INT_RPHE            0x00001000          // receiver PHY header error
+#define DWT_INT_RFCE            0x00008000          // receiver CRC error
+#define DWT_INT_RFSL            0x00010000          // receiver sync loss error
+#define DWT_INT_RFTO            0x00020000          // frame wait timeout
+#define DWT_INT_LDEERR          0x00040000          // CIA error
+#define DWT_INT_RXOVRR          0x00100000          // receiver overrun
+#define DWT_INT_RXPTO           0x00200000          // preamble detect timeout
+#define DWT_INT_LCSSERR         0x00400000          // LCSS set up error
+#define DWT_INT_SFDT            0x04000000          // SFD timeout
+#define DWT_INT_HPDWARN         0x08000000          // HPDWARN timeout
+#define DWT_INT_CPERR           0x10000000          // STS Error
+#define DWT_INT_ARFE            0x20000000          // frame rejected (due to frame filtering configuration)
+#define DWT_INT_ALL             0x3FFFFFFF
+#define DWT_INT_RX              (DWT_INT_LDED | DWT_INT_RFCG | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFSL | DWT_INT_RFTO | DWT_INT_LDEERR | DWT_INT_RXPTO | DWT_INT_SFDT | DWT_INT_ARFE)
+
+
+//DW3000 SLEEP and WAKEUP configuration parameters
+#define DWT_PGFCAL       0x0800
+#define DWT_GOTORX       0x0200
+#define DWT_GOTOIDLE     0x0100
+#define DWT_SEL_OPS3     0x00C0
+#define DWT_SEL_OPS2     0x0080                     // Short OPS table
+#define DWT_SEL_OPS1     0x0040                     // SCP
+#define DWT_SEL_OPS0     0x0000                     // Long OPS table
+#define DWT_ALT_OPS      0x0020
+#define DWT_LOADLDO      0x0010
+#define DWT_LOADDGC      0x0008
+#define DWT_LOADBIAS     0x0004
+#define DWT_RUNSAR       0x0002
+#define DWT_CONFIG       0x0001                     // download the AON array into the HIF (configuration download)
+
+#define DWT_PRES_SLEEP   0x20                       // allows for SLEEP_EN bit to be "preserved", although it will self - clear on wake up
+#define DWT_WAKE_WUP     0x10                       // wake up on WAKEUP PIN
+#define DWT_WAKE_CSN     0x8                        // wake up on chip select
+#define DWT_BROUT_EN     0x4                        // enable brownout detector during sleep/deep sleep
+#define DWT_SLEEP        0x2                        // enable sleep (if this bit is clear the device will enter deep sleep)
+#define DWT_SLP_EN       0x1                        // enable sleep/deep sleep functionality
+
+//DW3000 IDLE/INIT mode definitions
+#define DWT_DW_INIT      0x0
+#define DWT_DW_IDLE      0x1
+#define DWT_DW_IDLE_RC   0x2
+
+#define DWT_READ_OTP_PID  0x10    //read part ID from OTP
+#define DWT_READ_OTP_LID  0x20    //read lot ID from OTP
+#define DWT_READ_OTP_BAT  0x40    //read ref voltage from OTP
+#define DWT_READ_OTP_TMP  0x80    //read ref temperature from OTP
+
+//DW3000 OTP operating parameter set selection
+#define DWT_OPSET_LONG   (0x0<<11)
+#define DWT_OPSET_SCP    (0x1<<11)
+#define DWT_OPSET_SHORT  (0x2<<11)
+
+//Conversion factor to convert clock offset from PPM to ratio
+#define CLOCK_OFFSET_PPM_TO_RATIO (1.0/(1<<26))
+
+#define AON_SLPCNT_LO (0x102) //address of SLEEP counter bits [19:12] in AON memory
+#define AON_SLPCNT_HI (0x103) //address of SLEEP counter bits [27:20] in AON memory
+#define AON_SLPCNT_CAL_CTRL (0x104) //address of SLEEP counter cal control
+#define AON_SLPCNT_CAL_LO   (0x10E) //address of SLEEP counter cal value low byte
+#define AON_SLPCNT_CAL_HI   (0x10F) //address of SLEEP counter cal value high byte
+
+#define DW_CIA_DIAG_LOG_MAX (0x8)   //CIA to copy to swinging set a maximum set of diagnostic registers in Double Buffer mode
+#define DW_CIA_DIAG_LOG_MID (0x4)   //CIA to copy to swinging set a medium set of diagnostic registers in Double Buffer mode
+#define DW_CIA_DIAG_LOG_MIN (0x2)   //CIA to copy to swinging set a minimal set of diagnostic registers in Double Buffer mode
+#define DW_CIA_DIAG_LOG_ALL (0x1)   //CIA to log all diagnostic registers
+#define DW_CIA_DIAG_LOG_OFF (0x0)   //CIA to log reduced set of diagnostic registers
+
+// Call-back data RX frames flags
+#define DWT_CB_DATA_RX_FLAG_RNG  0x01 // Ranging bit
+#define DWT_CB_DATA_RX_FLAG_ND   0x02 // No data mode
+#define DWT_CB_DATA_RX_FLAG_CIA  0x04 // CIA done
+#define DWT_CB_DATA_RX_FLAG_CER  0x08 // CIA error
+#define DWT_CB_DATA_RX_FLAG_CPER 0x10 // CP error
+
+// LDO and BIAS tune kick
+#define LDO_BIAS_KICK (0x180)  // Writing to bit 7 and 8
+
+// Multiplication factors to convert carrier integrator value to a frequency offset in Hertz
+#define FREQ_OFFSET_MULTIPLIER          (998.4e6/2.0/1024.0/131072.0)
+
+// Multiplication factors to convert frequency offset in Hertz to PPM crystal offset
+// NB: also changes sign so a positive value means the local RX clock is running slower than the remote TX device.
+#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5     (-1.0e6/6489.6e6)
+#define HERTZ_TO_PPM_MULTIPLIER_CHAN_9     (-1.0e6/7987.2e6)
+
+// Low Energy (LE) device addresses
+#define LE0 0 //LE0_PEND address
+#define LE1 1 //LE1_PEND address
+#define LE2 2 //LE2_PEND address
+#define LE3 3 //LE3_PEND address
+
+// TX/RX call-back data
+typedef struct
+{
+    uint32_t status;      //initial value of register as ISR is entered
+    uint16_t status_hi;   //initial value of register as ISR is entered, if relevant for that event type
+    uint16_t datalength;  //length of frame
+    uint8_t  rx_flags;    //RX frame flags, see above
+} dwt_cb_data_t;
+
+// Call-back type for SPI read error event (if the DW3000 generated CRC does not match the one calculated by the dwt_generatecrc8 function)
+typedef void(*dwt_spierrcb_t)(void);
+
+// Call-back type for all interrupt events
+typedef void (*dwt_cb_t)(const dwt_cb_data_t *);
+
+
+#define SQRT_FACTOR             181 /*Factor of sqrt(2) for calculation*/
+#define STS_LEN_SUPPORTED       7   /*The supported STS length options*/
+#define SQRT_SHIFT_VAL          7
+#define SHIFT_VALUE             11
+#define MOD_VALUE               2048
+#define HALF_MOD                (MOD_VALUE>>1)
+
+/*This Enum holds INT working options.*/
+typedef enum
+{
+    DWT_DISABLE_INT=0,/*Disable these INT*/
+    DWT_ENABLE_INT,/*Enable these INT*/
+    DWT_ENABLE_INT_ONLY/*Enable only these INT*/
+} dwt_INT_options_e;
+
+
+/*This Enum holds the index for factor calculation.*/
+typedef enum
+{
+    DWT_STS_LEN_32  =0,
+    DWT_STS_LEN_64  =1,
+    DWT_STS_LEN_128 =2,
+    DWT_STS_LEN_256 =3,
+    DWT_STS_LEN_512 =4,
+    DWT_STS_LEN_1024=5,
+    DWT_STS_LEN_2048=6
+} dwt_sts_lengths_e;
+
+#define GET_STS_REG_SET_VALUE(x)     ((uint16_t)1<<((x)+2))    /* Returns the value to set in CP_CFG0_ID for STS length. The x is the enum value from dwt_sts_lengths_e */
+
+/* Enum used for selecting channel for DGC on-wake kick. */
+typedef enum
+{
+    DWT_DGC_SEL_CH5=0,
+    DWT_DGC_SEL_CH9
+} dwt_dgc_chan_sel;
+
+/* Enum used for selecting location to load DGC data from */
+typedef enum
+{
+    DWT_DGC_LOAD_FROM_SW=0,
+    DWT_DGC_LOAD_FROM_OTP
+} dwt_dgc_load_location;
 
 /*! ------------------------------------------------------------------------------------------------------------------
  * Structure typedef: dwt_config_t
@@ -156,76 +421,341 @@
  * Structure for setting device configuration via dwt_configure() function
  *
  */
-
-#pragma pack(1)
 typedef struct
 {
-    uint8_t chan ;           //!< channel number {1, 2, 3, 4, 5, 7 }
-    uint8_t prf ;            //!< Pulse Repetition Frequency {DWT_PRF_16M or DWT_PRF_64M}
+    uint8_t chan ;           //!< Channel number (5 or 9)
     uint8_t txPreambLength ; //!< DWT_PLEN_64..DWT_PLEN_4096
     uint8_t rxPAC ;          //!< Acquisition Chunk Size (Relates to RX preamble length)
-    uint8_t txCode ;         //!< TX preamble code
-    uint8_t rxCode ;         //!< RX preamble code
-    uint8_t nsSFD ;          //!< Boolean should we use non-standard SFD for better performance
-    uint8_t dataRate ;       //!< Data Rate {DWT_BR_110K, DWT_BR_850K or DWT_BR_6M8}
+    uint8_t txCode ;         //!< TX preamble code (the code configures the PRF, e.g. 9 -> PRF of 64 MHz)
+    uint8_t rxCode ;         //!< RX preamble code (the code configures the PRF, e.g. 9 -> PRF of 64 MHz)
+    uint8_t sfdType;         //!< SFD type (0 for short IEEE 8-bit standard, 1 for DW 8-bit, 2 for DW 16-bit, 3 for 4z BPRF)
+    uint8_t dataRate ;       //!< Data rate {DWT_BR_850K or DWT_BR_6M8}
     uint8_t phrMode ;        //!< PHR mode {0x0 - standard DWT_PHRMODE_STD, 0x3 - extended frames DWT_PHRMODE_EXT}
+    uint8_t phrRate;         //!< PHR rate {0x0 - standard DWT_PHRRATE_STD, 0x1 - at datarate DWT_PHRRATE_DTA}
     uint16_t sfdTO ;         //!< SFD timeout value (in symbols)
-} __attribute__ ((packed))  dwt_config_t ;
-#pragma pack()
+    uint8_t stsMode;         //!< STS mode (no STS, STS before PHR or STS after data)
+    dwt_sts_lengths_e stsLength;    //!< STS length (the allowed values are listed in dwt_sts_lengths_e
+    uint8_t pdoaMode;        //!< PDOA mode
+} dwt_config_t ;
 
 
 typedef struct
 {
-    uint8_t	PGdly;
+    uint8_t   PGdly;
     //TX POWER
-    //31:24		BOOST_0.125ms_PWR
-    //23:16		BOOST_0.25ms_PWR-TX_SHR_PWR
-    //15:8		BOOST_0.5ms_PWR-TX_PHR_PWR
-    //7:0		DEFAULT_PWR-TX_DATA_PWR
-    uint32_t	power;
-}
-dwt_txconfig_t ;
+    //31:24     TX_CP_PWR
+    //23:16     TX_SHR_PWR
+    //15:8      TX_PHR_PWR
+    //7:0       TX_DATA_PWR
+    uint32_t  power;
+    uint16_t  PGcount;
+} dwt_txconfig_t ;
 
 
 typedef struct
 {
+    uint8_t       ipatovRxTime[5] ;   // RX timestamp from Ipatov sequence
+    uint8_t       ipatovRxStatus ;    // RX status info for Ipatov sequence
+    uint16_t      ipatovPOA ;         // POA of Ipatov
 
-    uint16_t		maxNoise ;			// LDE max value of noise
-    uint16_t		firstPathAmp1 ;	    // Amplitude at floor(index FP) + 1
-    uint16_t      stdNoise ;			// Standard deviation of noise
-    uint16_t		firstPathAmp2 ;		// Amplitude at floor(index FP) + 2
-    uint16_t		firstPathAmp3 ;		// Amplitude at floor(index FP) + 3
-    uint16_t		maxGrowthCIR ;		// Channel Impulse Response max growth CIR
-    uint16_t      rxPreamCount ;      // Count of preamble symbols accumulated
-    //uint32_t        debug1;
-    //uint32_t        debug2;
-    uint16_t      firstPath ;         // First path index (10.6 bits fixed point integer)
+    uint8_t       stsRxTime[5] ;   // RX timestamp from STS
+    uint16_t      stsRxStatus ;    // RX status info for STS
+    uint16_t      stsPOA;          // POA of STS block 1
+    uint8_t       sts2RxTime[5];   // RX timestamp from STS
+    uint16_t      sts2RxStatus;    // RX status info for STS
+    uint16_t      sts2POA;         // POA of STS block 2
+
+    uint8_t       tdoa[6];            // TDOA from two STS RX timestamps
+    int16_t       pdoa;               // PDOA from two STS POAs signed int [1:-11] in radians
+
+    int16_t       xtalOffset ;        // estimated xtal offset of remote device
+    uint32_t      ciaDiag1 ;          // Diagnostics common to both sequences
+
+    uint32_t      ipatovPeak ;        // index and amplitude of peak sample in Ipatov sequence CIR
+    uint32_t      ipatovPower ;       // channel area allows estimation of channel power for the Ipatov sequence
+    uint32_t      ipatovF1 ;          // F1 for Ipatov sequence
+    uint32_t      ipatovF2 ;          // F2 for Ipatov sequence
+    uint32_t      ipatovF3 ;          // F3 for Ipatov sequence
+    uint16_t      ipatovFpIndex ;     // First path index for Ipatov sequence 
+    uint16_t      ipatovAccumCount ;  // Number accumulated symbols for Ipatov sequence
+
+    uint32_t      stsPeak ;        // index and amplitude of peak sample in STS CIR
+    uint16_t      stsPower ;       // channel area allows estimation of channel power for the STS
+    uint32_t      stsF1 ;          // F1 for STS
+    uint32_t      stsF2 ;          // F2 for STS
+    uint32_t      stsF3 ;          // F3 for STS
+    uint16_t      stsFpIndex ;     // First path index for STS
+    uint16_t      stsAccumCount ;  // Number accumulated symbols for STS
+
+    uint32_t      sts2Peak;        // index and amplitude of peak sample in STS CIR
+    uint16_t      sts2Power;       // channel area allows estimation of channel power for the STS
+    uint32_t      sts2F1;          // F1 for STS
+    uint32_t      sts2F2;          // F2 for STS
+    uint32_t      sts2F3;          // F3 for STS
+    uint16_t      sts2FpIndex;     // First path index for STS
+    uint16_t      sts2AccumCount;  // Number accumulated symbols for STS
+
 } dwt_rxdiag_t ;
 
 
 typedef struct
 {
-    //all of the below are mapped to a 12-bit register in DW1000
-    uint16_t PHE ;					//number of received header errors
-    uint16_t RSL ;					//number of received frame sync loss events
-    uint16_t CRCG ;					//number of good CRC received frames
-    uint16_t CRCB ;					//number of bad CRC (CRC error) received frames
-    uint16_t ARFE ;					//number of address filter errors
-    uint16_t OVER ;					//number of receiver overflows (used in double buffer mode)
-    uint16_t SFDTO ;					//SFD timeouts
-    uint16_t PTO ;					//Preamble timeouts
-    uint16_t RTO ;					//RX frame wait timeouts
-    uint16_t TXF ;					//number of transmitted frames
-    uint16_t HPW ;					//half period warn
-    uint16_t TXW ;					//power up warn
+    //all of the below are mapped to a register in DW3000
+    uint16_t PHE;                    //12-bit number of received header error events
+    uint16_t RSL;                    //12-bit number of received frame sync loss event events
+    uint16_t CRCG;                   //12-bit number of good CRC received frame events
+    uint16_t CRCB;                   //12-bit number of bad CRC (CRC error) received frame events
+    uint8_t  ARFE;                   //8-bit number of address filter error events
+    uint8_t  OVER;                   //8-bit number of receive buffer overrun events (used in double buffer mode)
+    uint16_t SFDTO;                  //12-bit number of SFD timeout events
+    uint16_t PTO;                    //12-bit number of Preamble timeout events
+    uint8_t  RTO;                    //8-bit number of RX frame wait timeout events
+    uint16_t TXF;                    //12-bit number of transmitted frame events
+    uint8_t  HPW;                    //8-bit half period warning events (when delayed RX/TX enable is used)
+    uint8_t  CRCE;                   //8-bit SPI CRC error events
+    uint16_t PREJ;                   //12-bit number of Preamble rejection events
 
 } dwt_deviceentcnts_t ;
 
+/********************************************************************************************************************/
+/*                                                AES BLOCK                                                         */
+/********************************************************************************************************************/
+
+//enums below are defined in such a way as to allow a simple write to DW3000 AES configuration registers
+
+/* For MIC size definition */
+typedef enum {
+    MIC_0 = 0,
+    MIC_4, MIC_6, MIC_8, MIC_10, MIC_12, MIC_14, MIC_16
+}dwt_mic_size_e;
+
+/* Key size definition */
+typedef enum {
+    AES_KEY_128bit = 0,
+    AES_KEY_192bit = 1,
+    AES_KEY_256bit = 2
+}dwt_aes_key_size_e;
+
+/* Load key from RAM selection */
+typedef enum {
+    AES_KEY_No_Load = 0,
+    AES_KEY_Load
+}dwt_aes_key_load_e;
+
+/* Key source - RAM or registers */
+typedef enum {
+    AES_KEY_Src_Register = 0,    /* Use AES KEY from registers */
+    AES_KEY_Src_RAMorOTP         /* Use AES KEY from RAM or OTP (depending if AES_key_OTP set),
+                                    AES_KEY_Load needs to be set as well */
+}dwt_aes_key_src_e;
+
+/* Operation selection */
+typedef enum {
+    AES_Encrypt = 0,
+    AES_Decrypt
+}dwt_aes_mode_e;
+
+/* This defines the source port for encrypted/unencrypted data */
+typedef enum {
+    AES_Src_Scratch = 0,
+    AES_Src_Rx_buf_0,
+    AES_Src_Rx_buf_1,
+    AES_Src_Tx_buf
+}dwt_aes_src_port_e;
+
+/* This defines the dest port for encrypted/unencrypted data */
+typedef enum {
+    AES_Dst_Scratch = 0,
+    AES_Dst_Rx_buf_0,
+    AES_Dst_Rx_buf_1,
+    AES_Dst_Tx_buf,
+    AES_Dst_STS_key
+}dwt_aes_dst_port_e;
+
+/* storage for 128/192/256-bit key */
+typedef struct {
+      uint32_t key0;
+      uint32_t key1;
+      uint32_t key2;
+      uint32_t key3;
+      uint32_t key4;
+      uint32_t key5;
+      uint32_t key6;
+      uint32_t key7;
+}dwt_aes_key_t;
+
+typedef enum
+{
+    AES_core_type_GCM=0,    /* Core type GCM */
+    AES_core_type_CCM       /* Core type CCM */
+}dwt_aes_core_type_e;
+
+
+typedef enum
+{
+    AES_key_RAM =0,     /* Use the AES KEY from RAM */
+    AES_key_OTP         /* Use the AES KEY from OTP, key_load needs to match -> needs to be set to AES_KEY_Src_Ram */
+}dwt_aes_key_otp_type_e;
+
+typedef struct {
+    dwt_aes_key_otp_type_e  aes_key_otp_type; //!< Using KEY from OTP or RAM, if this is set to AES_key_OTP, KEY from OTP is used
+    dwt_aes_core_type_e     aes_core_type;    //!< Core type GCM or CCM*
+    dwt_mic_size_e          mic;              //!< Message integrity code size
+    dwt_aes_key_src_e       key_src;          //!< Location of the key: either as programmed in registers(128 bit) or in the RAM or in the OTP
+    dwt_aes_key_load_e      key_load;         //!< Loads key from RAM or uses KEY from the registers
+    uint8_t                 key_addr;         //!< Address offset of AES key when using AES key in RAM
+    dwt_aes_key_size_e      key_size;         //!< AES key length configuration corresponding to AES_KEY_128/192/256bit
+    dwt_aes_mode_e          mode;             //!< Operation type encrypt/decrypt
+} dwt_aes_config_t ;
+
+typedef struct {
+    uint8_t             *nonce;      //!< Pointer to the nonce
+    uint8_t             *header;     //!< Pointer to header (this is not encrypted/decrypted)
+    uint8_t             *payload;    //!< Pointer to payload (this is encrypted/decrypted)
+    uint8_t             header_len;  //!< Header size
+    uint16_t            payload_len; //!< Payload size
+    dwt_aes_src_port_e  src_port;    //!< Source port
+    dwt_aes_dst_port_e  dst_port;    //!< Dest port
+    dwt_aes_mode_e      mode;        //!< Encryption or decryption
+    uint8_t             mic_size;    //!< tag_size;
+}dwt_aes_job_t;
+
+/* storage for 128-bit STS CP key */
+typedef struct {
+    uint32_t key0;
+    uint32_t key1;
+    uint32_t key2;
+    uint32_t key3;
+}dwt_sts_cp_key_t;
+
+/* storage for 128-bit STS CP IV (nonce) */
+typedef struct {
+    uint32_t iv0;
+    uint32_t iv1;
+    uint32_t iv2;
+    uint32_t iv3;
+}dwt_sts_cp_iv_t;
+
+
+#define ERROR_DATA_SIZE      (-1)
+#define ERROR_WRONG_MODE     (-2)
+#define ERROR_WRONG_MIC_SIZE (-3)
+#define ERROR_PAYLOAD_SIZE   (-4)
+#define MIC_ERROR            (0xff)
+#define STS_LEN_128BIT       (16)
+
+typedef enum
+{
+    DBL_BUF_STATE_EN=0,/*Double buffer enabled*/
+    DBL_BUF_STATE_DIS/*Double buffer disabled*/
+}dwt_dbl_buff_state_e;
+
+typedef enum
+{
+    DBL_BUF_MODE_AUTO=0,/*Automatic*/
+    DBL_BUF_MODE_MAN/*Manual*/
+}dwt_dbl_buff_mode_e;
+
+/*
+	Lookup table default values for channel 5
+*/
+typedef enum
+{
+    CH5_DGC_LUT_0 = 0x1c0fd,
+    CH5_DGC_LUT_1 = 0x1c43e,
+    CH5_DGC_LUT_2 = 0x1c6be,
+    CH5_DGC_LUT_3 = 0x1c77e,
+    CH5_DGC_LUT_4 = 0x1cf36,
+    CH5_DGC_LUT_5 = 0x1cfb5,
+    CH5_DGC_LUT_6 = 0x1cff5
+} dwt_configmrxlut_ch5_e;
+
+/*
+	Lookup table default values for channel 9
+*/
+typedef enum
+{
+    CH9_DGC_LUT_0 = 0x2a8fe,
+    CH9_DGC_LUT_1 = 0x2ac36,
+    CH9_DGC_LUT_2 = 0x2a5fe,
+    CH9_DGC_LUT_3 = 0x2af3e,
+    CH9_DGC_LUT_4 = 0x2af7d,
+    CH9_DGC_LUT_5 = 0x2afb5,
+    CH9_DGC_LUT_6 = 0x2afb5
+} dwt_configmrxlut_ch9_e;
+
+#define DBL_BUFF_OFF             0x0
+#define DBL_BUFF_ACCESS_BUFFER_0 0x1
+#define DBL_BUFF_ACCESS_BUFFER_1 0x3
+
+/********************************************************************************************************************/
+/*                                                     API LIST                                                     */
+/********************************************************************************************************************/
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_getpartid()
+ * @brief This function returns the version of the API as defined by DW3000_DRIVER_VERSION
  *
+ * input parameters
+ *
+ * output parameters
+ *
+ * returns version (DW3000_DRIVER_VERSION)
+ */
+int32_t dwt_apiversion(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function sets the local data structure pointer to point to the element in the local array as given by the index.
+ *
+ * input parameters
+ * @param index    - selects the array element to point to. Must be within the array bounds, i.e. < DWT_NUM_DW_DEV
+ *
+ * output parameters
+ *
+ * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ */
+int dwt_setlocaldataptr(unsigned int index);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief Returns the PG delay value of the TX
+ *
+ * input parameters
+ *
+ * output parameters
+ *
+ * returns uint8_t
+ */
+uint8_t dwt_readpgdelay(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to return the read V measured @ 3.3 V value recorded in OTP address 0x8 (VBAT_ADDRESS)
+ *
+ * NOTE: dwt_initialise() must be called prior to this function so that it can return a relevant value.
+ *
+ * input parameters
+ *
+ * output parameters
+ *
+ * returns the 8 bit V bat value as programmed in the factory
+ */
+uint8_t dwt_geticrefvolt(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to return the read T measured @ 23 C value recorded in OTP address 0x9 (VTEMP_ADDRESS)
+ *
+ * NOTE: dwt_initialise() must be called prior to this function so that it can return a relevant value.
+ *
+ * input parameters
+ *
+ * output parameters
+ *
+ * returns the 8 bit V temp value as programmed in the factory
+ */
+uint8_t dwt_geticreftemp(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This is used to return the read part ID of the device
+ *
+ * NOTE: dwt_initialise() must be called prior to this function so that it can return a relevant value.
  *
  * input parameters
  *
@@ -236,9 +766,9 @@
 uint32_t dwt_getpartid(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_getlotid()
- *
  * @brief This is used to return the read lot ID of the device
+ *
+ * NOTE: dwt_initialise() must be called prior to this function so that it can return a relevant value.
  *
  * input parameters
  *
@@ -249,22 +779,20 @@
 uint32_t dwt_getlotid(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readdevid()
- *
- * @brief This is used to return the read device type and revision information of the DW1000 device (MP part is 0xDECA0130)
+ * @brief This is used to return the read device type and revision information of the DW3000 device (MP part is 0xDECA0130)
  *
  * input parameters
  *
  * output parameters
  *
- * returns the read value which for DW1000 is 0xDECA0130
+ * returns the read value which for DW3000 is 0xDECA0130
  */
 uint32_t dwt_readdevid(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_otprevision()
- *
  * @brief This is used to return the read OTP revision
+ *
+ * NOTE: dwt_initialise() must be called prior to this function so that it can return a relevant value.
  *
  * input parameters
  *
@@ -275,77 +803,106 @@
 uint8_t dwt_otprevision(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setGPIOforEXTTRX()
- *
- * @brief This is used to enable GPIO for external LNA or PA functionality - HW dependent, consult the DW1000 User Manual
+ * @brief This function enables/disables the fine grain TX sequencing (enabled by default).
  *
  * input parameters
+ * @param enable - 1 to enable fine grain TX sequencing, 0 to disable it.
  *
+ * output parameters none
+ *
+ * no return value
+ */
+void dwt_setfinegraintxseq(int enable);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to enable GPIO for external LNA or PA functionality - HW dependent, consult the DW3000 User Manual.
+ *        This can also be used for debug as enabling TX and RX GPIOs is quite handy to monitor DW3000's activity.
+ *
+ * NOTE: Enabling PA functionality requires that fine grain TX sequencing is deactivated. This can be done using
+ *       dwt_setfinegraintxseq().
+ *
+ * input parameters
+ * @param lna_pa - bit field: bit 0 if set will enable LNA functionality,
+ *                          : bit 1 if set will enable PA functionality,
+ *                          : to disable LNA/PA set the bits to 0 (
  * output parameters
  *
  * no return value
  */
-void dwt_setGPIOforEXTTRX(void);
+void dwt_setlnapamode(int lna_pa);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setGPIOdirection()
- *
- * @brief This is used to set GPIO direction as an input (1) or output (0)
- *
- * input parameters
- * @param gpioNum    -   this is the GPIO to configure - see GxM0... GxM8 in the deca_regs.h file
- * @param direction  -   this sets the GPIO direction - see GxP0... GxP8 in the deca_regs.h file
- *
- * output parameters
- *
- * no return value
- */
-void dwt_setGPIOdirection(uint32_t gpioNum, uint32_t direction);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setGPIOvalue()
- *
- * @brief This is used to set GPIO value as (1) or (0) only applies if the GPIO is configured as output
- *
- * input parameters
- * @param gpioNum    -   this is the GPIO to configure - see GxM0... GxM8 in the deca_regs.h file
- * @param value  -   this sets the GPIO value - see GDP0... GDP8 in the deca_regs.h file
- *
- * output parameters
- *
- * no return value
- */
-void dwt_setGPIOvalue(uint32_t gpioNum, uint32_t value);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_initialise()
- *
- * @brief This function initiates communications with the DW1000 transceiver
- * and reads its DEV_ID register (address 0x00) to verify the IC is one supported
- * by this software (e.g. DW1000 32-bit device ID value is 0xDECA0130).  Then it
+ * @brief This function initialises the DW3000 transceiver:
+ * it reads its DEV_ID register (address 0x00) to verify the IC is one supported
+ * by this software (e.g. DW3000 32-bit device ID value is 0xDECA03xx).  Then it
  * does any initial once only device configurations needed for use and initialises
  * as necessary any static data items belonging to this low-level driver.
  *
  * NOTES:
  * 1.this function needs to be run before dwt_configuresleep, also the SPI frequency has to be < 3MHz
- * 2.it also reads and applies LDO tune and crystal trim values from OTP memory
+ * 2.it also reads and applies LDO and BIAS tune and crystal trim values from OTP memory
+ * 3.it is assumed this function is called after a reset or on power up of the DW3000*
  *
  * input parameters
- * @param config    -   specifies what configuration to load
- *                  DWT_LOADUCODE     0x1 - load the LDE microcode from ROM - enabled accurate RX timestamp
- *                  DWT_LOADNONE      0x0 - do not load any values from OTP memory
+ * @param mode - mask which defines which OTP values to read.
  *
  * output parameters
  *
  * returns DWT_SUCCESS for success, or DWT_ERROR for error
  */
-int dwt_initialise(uint16_t config) ;
+int dwt_initialise(int mode);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configure()
+ * @brief This function can place DW3000 into IDLE/IDLE_PLL or IDLE_RC mode when it is not actively in TX or RX.
  *
+ * input parameters
+ * @param state - DWT_DW_IDLE (1) to put DW3000 into IDLE/IDLE_PLL state; DWT_DW_INIT (0) to put DW3000 into INIT_RC state;
+ *                DWT_DE_IDLE_RC (2) to put DW3000 into IDLE_RC state.
+ *
+ * output parameters none
+ *
+ * no return value
+ */
+void dwt_setdwstate(int state);
+
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to enable GPIO clocks. The clocks are needed to ensure correct GPIO operation
+ *
+ * input parameters
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_enablegpioclocks(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function needs to be called after device is woken up from DEEPSLEEP/SLEEP state, to restore the
+ * configuration which has not been automatically restored from AON
+ *
+ * input parameters
+ *
+ * return DWT_SUCCESS
+ *
+ */
+void dwt_restoreconfig(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function configures STS mode: e.g. DWT_STS_MODE_OFF, DWT_STS_MODE_1 etc
+ * The dwt_configure should be called prior to this to configure other parameters
+ *
+ * input parameters
+ * @param stsMode    -   e.g. DWT_STS_MODE_OFF, DWT_STS_MODE_1 etc.
+ *
+ * return DWT_SUCCESS
+ *
+ */
+void dwt_configurestsmode(uint8_t stsMode);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This function provides the main API for the configuration of the
- * DW1000 and this low-level driver.  The input is a pointer to the data structure
+ * DW3000 and this low-level driver.  The input is a pointer to the data structure
  * of type dwt_config_t that holds all the configurable items.
  * The dwt_config_t structure shows which ones are supported
  *
@@ -354,13 +911,11 @@
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * return DWT_SUCCESS or DWT_ERROR (e.g. when PLL CAL fails / PLL fails to lock)
  */
-int dwt_configure(dwt_config_t *config) ;
+int dwt_configure(dwt_config_t *config);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configuretxrf()
- *
  * @brief This function provides the API for the configuration of the TX spectrum
  * including the power and pulse generator delay. The input is a pointer to the data structure
  * of type dwt_txconfig_t that holds all the configurable items.
@@ -372,11 +927,58 @@
  *
  * no return value
  */
-void dwt_configuretxrf(dwt_txconfig_t *config) ;
+void dwt_configuretxrf(dwt_txconfig_t *config);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setrxantennadelay()
+ * @brief This function re-loads the STS AES initial value
  *
+ * input parameters
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configurestsloadiv(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function sets the default values of the lookup tables depending on the channel selected.
+ *
+ * input parameters
+ * @param[in] channel - Channel that the device will be transmitting/receiving on.
+ *
+ * no return value
+ */
+void dwt_configmrxlut(int channel);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function configures the STS AES 128 bit key value.
+ * the default value is [31:00]c9a375fa,
+ *                      [63:32]8df43a20,
+ *                      [95:64]b5e5a4ed,
+ *                     [127:96]0738123b
+ *
+ * input parameters
+ * @param pStsKey - the pointer to the structure of dwt_sts_cp_key_t type, which holds the AES128 key value to generate STS
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configurestskey(dwt_sts_cp_key_t* pStsKey);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function configures the STS AES 128 bit initial value, the default value is 1, i.e. DW3000 reset value is 1.
+ *
+ * input parameters
+ * @param pStsIv - the pointer to the structure of dwt_sts_cp_iv_t type, which holds the IV value to generate STS
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configurestsiv(dwt_sts_cp_iv_t* pStsIv);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This API function writes the antenna delay (in time units) to RX registers
  *
  * input parameters:
@@ -390,8 +992,6 @@
 void dwt_setrxantennadelay(uint16_t antennaDly);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_settxantennadelay()
- *
  * @brief This API function writes the antenna delay (in time units) to TX registers
  *
  * input parameters:
@@ -405,44 +1005,27 @@
 void dwt_settxantennadelay(uint16_t antennaDly);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setsmarttxpower()
- *
- * @brief This call enables or disables the smart TX power feature.
- *
- * input parameters
- * @param enable - this enables or disables the TX smart power (1 = enable, 0 = disable)
- *
- * output parameters
- *
- * no return value
- */
-void dwt_setsmarttxpower(int enable);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_writetxdata()
- *
- * @brief This API function writes the supplied TX data into the DW1000's
+ * @brief This API function writes the supplied TX data into the DW3000's
  * TX buffer.  The input parameters are the data length in bytes and a pointer
  * to those data bytes.
  *
  * input parameters
- * @param txFrameLength  - This is the total frame length, including the two byte CRC.
- *                         Note: this is the length of TX message (including the 2 byte CRC) - max is 1023
- *                         standard PHR mode allows up to 127 bytes
+ * @param txDataLength   - This is the total length of data (in bytes) to write to the tx buffer.
+ *                         Note: the size of tx buffer is 1024 bytes.
+ *                         The standard PHR mode allows to transmit frames of up to 127 bytes (including 2 byte CRC)
+ *                         The extended PHR mode allows to transmit frames of up to 1023 bytes (including 2 byte CRC)
  *                         if > 127 is programmed, DWT_PHRMODE_EXT needs to be set in the phrMode configuration
  *                         see dwt_configure function
- * @param txFrameBytes   - Pointer to the user抯 buffer containing the data to send.
- * @param txBufferOffset - This specifies an offset in the DW1000抯 TX Buffer at which to start writing data.
+ * @param txDataBytes    - Pointer to the user's buffer containing the data to send.
+ * @param txBufferOffset - This specifies an offset in the DW IC's TX Buffer at which to start writing data.
  *
  * output parameters
  *
  * returns DWT_SUCCESS for success, or DWT_ERROR for error
  */
-int dwt_writetxdata(uint16_t txFrameLength, uint8_t *txFrameBytes, uint16_t txBufferOffset) ;
+int dwt_writetxdata(uint16_t txDataLength, uint8_t *txDataBytes, uint16_t txBufferOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_writetxfctrl()
- *
  * @brief This API function configures the TX frame control register before the transmission of a frame
  *
  * input parameters:
@@ -451,33 +1034,62 @@
  *                              if > 127 is programmed, DWT_PHRMODE_EXT needs to be set in the phrMode configuration
  *                              see dwt_configure function
  * @param txBufferOffset - the offset in the tx buffer to start writing the data
+ * @param ranging - 1 if this is a ranging frame, else 0
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * no return value
  */
-int dwt_writetxfctrl(uint16_t txFrameLength, uint16_t txBufferOffset) ;
+void dwt_writetxfctrl(uint16_t txFrameLength, uint16_t txBufferOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_starttx()
+ * @brief This API function is used to configure frame preamble length, the frame premable length can be
+ * configured in steps of 8, from 16 to 2048 symbols. If a non-zero value is configured, then the TXPSR_PE setting is ignored.
  *
+ * input parameters:
+ * @param preambleLength - sets the length of the preamble, value of 0 disables this setting and the length of the
+ *                         frame will be dependent on the TXPSR_PE setting as configured by dwt_configure function
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_setplenfine(uint8_t preambleLength);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This call initiates the transmission, input parameter indicates which TX mode is used see below
  *
  * input parameters:
- * @param mode - if 0 immediate TX (no response expected)
- *               if 1 delayed TX (no response expected)
- *               if 2 immediate TX (response expected - so the receiver will be automatically turned on after TX is done)
- *               if 3 delayed TX (response expected - so the receiver will be automatically turned on after TX is done)
- *
+ * @param mode - if mode = DWT_START_TX_IMMEDIATE - immediate TX (no response expected)
+ *               if mode = DWT_START_TX_DELAYED - delayed TX (no response expected)  at specified time (time in DX_TIME register)
+ *               if mode = DWT_START_TX_DLY_REF - delayed TX (no response expected)  at specified time (time in DREF_TIME register + any time in DX_TIME register)
+ *               if mode = DWT_START_TX_DLY_RS  - delayed TX (no response expected)  at specified time (time in RX_TIME_0 register + any time in DX_TIME register)
+ *               if mode = DWT_START_TX_DLY_TS  - delayed TX (no response expected)  at specified time (time in TX_TIME_LO register + any time in DX_TIME register)
+ *               if mode = DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED - immediate TX (response expected - so the receiver will be automatically turned on after TX is done)
+ *               if mode = DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED - delayed TX (response expected - so the receiver will be automatically turned on after TX is done)
+ *               if mode = DWT_START_TX_CCA - Send the frame if no preamble detected within PTO time
+ *               if mode = DWT_START_TX_CCA  | DWT_RESPONSE_EXPECTED - Send the frame if no preamble detected within PTO time and then enable RX
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed transmission will fail if the delayed time has passed)
+ * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed transmission will be cancelled if the delayed time has passed)
  */
-int dwt_starttx(uint8_t mode) ;
+int dwt_starttx(uint8_t mode);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setdelayedtrxtime()
+ * @brief This API function configures the reference time used for relative timing of delayed sending and reception.
+ * The value is at a 8ns resolution.
  *
+ * input parameters
+ * @param reftime - the reference time (which together with DX_TIME or TX timestamp or RX timestamp time is used to define a
+ * transmission time or delayed RX on time)
+ *
+ * output parameters none
+ *
+ * no return value
+ */
+void dwt_setreferencetrxtime(uint32_t reftime);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This API function configures the delayed transmit time or the delayed RX on time
  *
  * input parameters
@@ -488,11 +1100,9 @@
  *
  * no return value
  */
-void dwt_setdelayedtrxtime(uint32_t starttime) ;
+void dwt_setdelayedtrxtime(uint32_t starttime);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readtxtimestamp()
- *
  * @brief This is used to read the TX timestamp (adjusted with the programmed antenna delay)
  *
  * input parameters
@@ -502,11 +1112,9 @@
  *
  * no return value
  */
-void dwt_readtxtimestamp(uint8_t *timestamp);
+void dwt_readtxtimestamp(uint8_t * timestamp);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readtxtimestamphi32()
- *
  * @brief This is used to read the high 32-bits of the TX timestamp (adjusted with the programmed antenna delay)
  *
  * input parameters
@@ -518,8 +1126,6 @@
 uint32_t dwt_readtxtimestamphi32(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readtxtimestamplo32()
- *
  * @brief This is used to read the low 32-bits of the TX timestamp (adjusted with the programmed antenna delay)
  *
  * input parameters
@@ -531,8 +1137,35 @@
 uint32_t dwt_readtxtimestamplo32(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readrxtimestamp()
+ * @brief This is used to read the PDOA result, it is the phase difference between either the Ipatov and STS POA, or
+ * the two STS POAs, depending on the PDOA mode of operation. (POA - Phase Of Arrival)
  *
+ * NOTE: To convert to degrees: float pdoa_deg = ((float)pdoa / (1 << 11)) * 180 / M_PI
+ *
+ * input parameters
+ *
+ * output parameters - the PDOA result (signed in [1:-11] radian units)
+ *
+ * no return value
+ */
+int16_t dwt_readpdoa(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function is used to read the TDOA (Time Difference On Arrival). The TDOA value that is read from the
+ * register is 41-bits in length. However, 6 bytes (or 48 bits) are read from the register. The remaining 7 bits at
+ * the 'top' of the 6 bytes that are not part of the TDOA value should be set to zero and should not interfere with
+ * rest of the 41-bit value. However, there is no harm in masking the returned value.
+ * 
+ * input parameters
+ * 
+ * output parameters
+ * @param tdoa: time difference on arrival - buffer of 6 bytes that will be filled with TDOA value by calling this function
+ * 
+ * no return value
+ */
+void dwt_readtdoa(uint8_t * tdoa);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This is used to read the RX timestamp (adjusted time of arrival)
  *
  * input parameters
@@ -542,11 +1175,34 @@
  *
  * no return value
  */
-void dwt_readrxtimestamp(uint8_t *timestamp);
+void dwt_readrxtimestamp(uint8_t * timestamp);
+void dwt_readrxtimestampunadj(uint8_t * timestamp);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readrxtimestamphi32()
+ * @brief This is used to read the RX timestamp (adjusted time of arrival) w.r.t. Ipatov CIR
  *
+ * input parameters
+ * @param timestamp - a pointer to a 5-byte buffer which will store the read RX timestamp time
+ *
+ * output parameters - the timestamp buffer will contain the value after the function call
+ *
+ * no return value
+ */
+void dwt_readrxtimestamp_ipatov(uint8_t * timestamp);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to read the RX timestamp (adjusted time of arrival) w.r.t. STS CIR
+ *
+ * input parameters
+ * @param timestamp - a pointer to a 5-byte buffer which will store the read RX timestamp time
+ *
+ * output parameters - the timestamp buffer will contain the value after the function call
+ *
+ * no return value
+ */
+void dwt_readrxtimestamp_sts(uint8_t * timestamp);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This is used to read the high 32-bits of the RX timestamp (adjusted with the programmed antenna delay)
  *
  * input parameters
@@ -558,8 +1214,6 @@
 uint32_t dwt_readrxtimestamphi32(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readrxtimestamplo32()
- *
  * @brief This is used to read the low 32-bits of the RX timestamp (adjusted with the programmed antenna delay)
  *
  * input parameters
@@ -571,8 +1225,6 @@
 uint32_t dwt_readrxtimestamplo32(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readsystimestamphi32()
- *
  * @brief This is used to read the high 32-bits of the system time
  *
  * input parameters
@@ -584,36 +1236,6 @@
 uint32_t dwt_readsystimestamphi32(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readsystime()
- *
- * @brief This is used to read the system time
- *
- * input parameters
- * @param timestamp - a pointer to a 5-byte buffer which will store the read system time
- *
- * output parameters
- * @param timestamp - the timestamp buffer will contain the value after the function call
- *
- * no return value
- */
-void dwt_readsystime(uint8_t *timestamp);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_checkoverrun()
- *
- * @brief This is used to check if the overrun condition is set in DW1000
- *
- * input parameters
- *
- * output parameters
- *
- * returns 1 if the RXOVERR bit is set, else 0
- */
-int dwt_checkoverrun(void);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_forcetrxoff()
- *
  * @brief This is used to turn off the transceiver
  *
  * input parameters
@@ -625,87 +1247,74 @@
 void dwt_forcetrxoff(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_syncrxbufptrs()
- *
- * @brief this function synchronizes rx buffer pointers
- * need to make sure that the host/IC buffer pointers are aligned before starting RX
- *
- * input parameters:
- *
- * output parameters
- *
- * no return value
- */
-void dwt_syncrxbufptrs(void);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_rxenable()
- *
- * @brief This call turns on the receiver, can be immediate or delayed.
+ * @brief This call turns on the receiver, can be immediate or delayed (depending on the mode parameter). In the case of a
+ * "late" error the receiver will only be turned on if the DWT_IDLE_ON_DLY_ERR is not set.
  * The receiver will stay turned on, listening to any messages until
  * it either receives a good frame, an error (CRC, PHY header, Reed Solomon) or  it times out (SFD, Preamble or Frame).
  *
  * input parameters
- * @param delayed - TRUE the receiver is turned on after some delay (as programmed with dwt_setdelayedtime())
+ * @param mode - this can be one of the following allowed values:
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed receive enable will be too far in the future if delayed time has passed (if delayed time is > 8s from now))
+ * DWT_START_RX_IMMEDIATE      0x00    Enable the receiver immediately
+ * DWT_START_RX_DELAYED        0x01    Set up delayed RX, if "late" error triggers, then the RX will be enabled immediately
+ * DWT_IDLE_ON_DLY_ERR         0x02    If delayed RX failed due to "late" error then if this
+                                       flag is set the RX will not be re-enabled immediately, and device will be in IDLE when function exits
+ * DWT_START_RX_DLY_REF        0x04    Enable the receiver at specified time (time in DREF_TIME register + any time in DX_TIME register)
+ * DWT_START_RX_DLY_RS         0x08    Enable the receiver at specified time (time in RX_TIME_0 register + any time in DX_TIME register)
+ * DWT_START_RX_DLY_TS         0x10    Enable the receiver at specified time (time in TX_TIME_LO register + any time in DX_TIME register)
+
+ * e.g.
+ * (DWT_START_RX_DELAYED | DWT_IDLE_ON_DLY_ERR) 0x03 used to disable re-enabling of receiver if delayed RX failed due to "late" error
+ *
+ * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed receive enable will be too far in the future if delayed time has passed)
  */
-int dwt_rxenable(int delayed) ;
+int dwt_rxenable(int mode);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setrxmode()
+ * @brief enable/disable and configure SNIFF mode.
  *
- *  @brief enable different RX modes, e.g.:
- *   a) "snooze" mode, the receiver only listens periodically for preamble
- *   b) the RX PPDM "sniff" mode - receiver cycles through ON/OFF periods
+ * SNIFF mode is a low-power reception mode where the receiver is sequenced on and off instead of being on all the time.
+ * The time spent in each state (on/off) is specified through the parameters below.
+ * See DW3000 User Manual section 4.5 "Low-Power SNIFF mode" for more details.
  *
  * input parameters:
- * @param mode      - DWT_RX_NORMAL = 0x0
- *                    DWT_RX_SNIFF  = 0x1      enable the rx PPDM "sniff" mode
- * @param rxON      - SNIFF mode ON period in PACs
- * @param rxOFF     - SNIFF mode OFF period in us (actually in 1.0256 micro second intervals)
+ * @param enable - 1 to enable SNIFF mode, 0 to disable. When 0, all other parameters are not taken into account.
+ * @param timeOn - duration of receiver ON phase, expressed in multiples of PAC size. The counter automatically adds 1 PAC
+ *                 size to the value set. Min value that can be set is 1 (i.e. an ON time of 2 PAC size), max value is 15.
+ * @param timeOff - duration of receiver OFF phase, expressed in multiples of 128/125 渭s (~1 渭s). Max value is 255.
  *
  * output parameters
  *
  * no return value
  */
-
-#define DWT_RX_NORMAL (0x0)
-#define DWT_RX_SNIFF  (0x1)
-
-void dwt_setrxmode(int mode, uint8_t rxON, uint8_t rxOFF);
+void dwt_setsniffmode(int enable, uint8_t timeOn, uint8_t timeOff);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setautorxreenable()
- *
- * @brief This call enables the auto RX re-enable feature
- *
- * input parameters
- * @param enable - 1 to enable, 0 to disable the feature
- *
- * output parameters
- *
- * no return value
- */
-void dwt_setautorxreenable(int enable);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setdblrxbuffmode()
- *
  * @brief This call enables the double receive buffer mode
  *
  * input parameters
- * @param enable - 1 to enable, 0 to disable the double buffer mode
+ * @param dbl_buff_state - enum variable for enabling/disabling double buffering mode
+ * @param dbl_buff_mode - enum variable for Receiver Auto-Re-enable
  *
  * output parameters
  *
  * no return value
  */
-void dwt_setdblrxbuffmode(int enable);
+void dwt_setdblrxbuffmode(dwt_dbl_buff_state_e dbl_buff_state, dwt_dbl_buff_mode_e dbl_buff_mode);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setrxtimeout()
+ * @brief This call signal to the chip that the specific RX buff is free for fill
  *
+ * input parameters
+ * @param None
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_signal_rx_buff_free(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This call enables RX timeout (SY_STAT_RFTO event)
  *
  * input parameters
@@ -717,15 +1326,14 @@
  *
  * no return value
  */
-void dwt_setrxtimeout(uint16_t time);
+void dwt_setrxtimeout(uint32_t time);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setpreambledetecttimeout()
- *
  * @brief This call enables preamble timeout (SY_STAT_RXPTO event)
  *
  * input parameters
- * @param  timeout - in PACs
+ * @param  timeout - Preamble detection timeout, expressed in multiples of PAC size. The counter automatically adds 1 PAC
+ *                   size to the value set. Min value that can be set is 1 (i.e. a timeout of 2 PAC size).
  *
  * output parameters
  *
@@ -733,11 +1341,8 @@
  */
 void dwt_setpreambledetecttimeout(uint16_t timeout);
 
-
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_calibratesleepcnt()
- *
- * @brief calibrates the local oscillator as its frequency can vary between 7 and 13kHz depending on temp and voltage
+ * @brief calibrates the local oscillator as its frequency can vary between 15 and 34kHz depending on temp and voltage
  *
  * NOTE: this function needs to be run before dwt_configuresleepcnt, so that we know what the counter units are
  *
@@ -745,13 +1350,11 @@
  *
  * output parameters
  *
- * returns the number of XTAL/2 cycles per low-power oscillator cycle. LP OSC frequency = 19.2 MHz/return value
+ * returns the number of XTAL cycles per low-power oscillator cycle. LP OSC frequency = 38.4 MHz/return value
  */
 uint16_t dwt_calibratesleepcnt(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configuresleepcnt()
- *
  * @brief sets the sleep counter to new value, this function programs the high 16-bits of the 28-bit counter
  *
  * NOTE: this function needs to be run before dwt_configuresleep, also the SPI frequency has to be < 3MHz
@@ -763,11 +1366,9 @@
  *
  * no return value
  */
-void dwt_configuresleepcnt(uint16_t sleepcnt);
+ void dwt_configuresleepcnt(uint16_t sleepcnt);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configuresleep()
- *
  * @brief configures the device for both DEEP_SLEEP and SLEEP modes, and on-wake mode
  * i.e. before entering the sleep, the device should be programmed for TX or RX, then upon "waking up" the TX/RX settings
  * will be preserved and the device can immediately perform the desired action TX/RX
@@ -775,19 +1376,25 @@
  * NOTE: e.g. Tag operation - after deep sleep, the device needs to just load the TX buffer and send the frame
  *
  *
- *      mode: the array and LDE code (OTP/ROM) and LDO tune, and set sleep persist
- *      DWT_PRESRV_SLEEP 0x0100 - preserve sleep
- *      DWT_LOADOPSET    0x0080 - load operating parameter set on wakeup
- *      DWT_CONFIG       0x0040 - download the AON array into the HIF (configuration download)
- *      DWT_LOADEUI      0x0008
- *      DWT_GOTORX       0x0002
- *      DWT_TANDV        0x0001
+ *      mode:
+ *      DWT_PGFCAL       0x0800
+ *      DWT_GOTORX       0x0200
+ *      DWT_GOTOIDLE     0x0100
+ *      DWT_SEL_OPS      0x0040 | 0x0080
+ *      DWT_LOADOPS      0x0020
+ *      DWT_LOADLDO      0x0010
+ *      DWT_LOADDGC      0x0008
+ *      DWT_LOADBIAS     0x0004
+ *      DWT_RUNSAR       0x0002
+ *      DWT_CONFIG       0x0001 - download the AON array into the HIF (configuration download)
  *
  *      wake: wake up parameters
- *      DWT_XTAL_EN      0x10 - keep XTAL running during sleep
- *      DWT_WAKE_SLPCNT  0x8 - wake up after sleep count
- *      DWT_WAKE_CS      0x4 - wake up on chip select
- *      DWT_WAKE_WK      0x2 - wake up on WAKEUP PIN
+ *      DWT_SLP_CNT_RPT  0x40 - sleep counter loop after expiration
+ *      DWT_PRESRVE_SLP  0x20 - allows for SLEEP_EN bit to be "preserved", although it will self-clear on wake up
+ *      DWT_WAKE_WK      0x10 - wake up on WAKEUP PIN
+ *      DWT_WAKE_CS      0x8 - wake up on chip select
+ *      DWT_BR_DET       0x4 - enable brownout detector during sleep/deep sleep
+ *      DWT_SLEEP        0x2 - enable sleep
  *      DWT_SLP_EN       0x1 - enable sleep/deep sleep functionality
  *
  * input parameters
@@ -801,24 +1408,34 @@
 void dwt_configuresleep(uint16_t mode, uint8_t wake);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_entersleep()
- *
- * @brief This function puts the device into deep sleep or sleep. dwt_configuredeepsleep should be called first
+*
+* @brief this function clears the AON configuration in DW3000
+*
+* input parameters:
+*
+* output parameters
+*
+* no return value
+*/
+void dwt_clearaonconfig(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function puts the device into deep sleep or sleep. dwt_configuresleep() should be called first
  * to configure the sleep and on-wake/wake-up parameters
  *
  * input parameters
+ * @param idle_rc - if this is set to DWT_DW_IDLE_RC, the auto INIT2IDLE bit will be cleared prior to going to sleep
+ *                  thus after wakeup device will stay in IDLE_RC state
  *
  * output parameters
  *
  * no return value
  */
-void dwt_entersleep(void);
-
+//void dwt_entersleep(int idle_rc);
+void dwt_entersleep();
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_entersleepaftertx(int enable)
- *
  * @brief sets the auto TX to sleep bit. This means that after a frame
- * transmission the device will enter deep sleep mode. The dwt_setdeepsleep() function
+ * transmission the device will enter deep sleep mode. The dwt_configuresleep() function
  * needs to be called before this to configure the on-wake settings
  *
  * NOTE: the IRQ line has to be low/inactive (i.e. no pending events)
@@ -833,48 +1450,26 @@
 void dwt_entersleepaftertx(int enable);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_spicswakeup()
+ * @brief This function is used to register the different callbacks called when one of the corresponding event occurs.
  *
- * @brief wake up the device from sleep mode using the SPI read,
- * the device will wake up on chip select line going low if the line is held low for at least 500us.
- * To define the length depending on the time one wants to hold
- * the chip select line low, use the following formula:
- *
- *      length (bytes) = time (s) * byte_rate (Hz)
- *
- * where fastest byte_rate is spi_rate (Hz) / 8 if the SPI is sending the bytes back-to-back.
- * To save time and power, a system designer could determine byte_rate value more precisely.
- *
- * NOTE: Alternatively the device can be waken up with WAKE_UP pin if configured for that operation
+ * NOTE: Callbacks can be undefined (set to NULL). In this case, dwt_isr() will process the event as usual but the 'null'
+ * callback will not be called.
  *
  * input parameters
- * @param buff   - this is a pointer to the dummy buffer which will be used in the SPI read transaction used for the WAKE UP of the device
- * @param length - this is the length of the dummy buffer
- *
- * output parameters
- *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
- */
-int dwt_spicswakeup(uint8_t *buff, uint16_t length);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setcallbacks()
- *
- * @brief This is the devices interrupt handler function, it will process/report status events
- *
- * input parameters
- * @param txcallback - the pointer to the TX call-back function
- * @param rxcallback - the pointer to the RX call-back function
+ * @param cbTxDone - the pointer to the TX confirmation event callback function
+ * @param cbRxOk - the pointer to the RX good frame event callback function
+ * @param cbRxTo - the pointer to the RX timeout events callback function
+ * @param cbRxErr - the pointer to the RX error events callback function
+ * @param cbSPIErr - the pointer to the SPI error events callback function
+ * @param cbSPIRdy - the pointer to the SPI ready events callback function
  *
  * output parameters
  *
  * no return value
  */
-void dwt_setcallbacks(void (*txcallback)(const dwt_callback_data_t *), void (*rxcallback)(const dwt_callback_data_t *));
+void dwt_setcallbacks(dwt_cb_t cbTxDone, dwt_cb_t cbRxOk, dwt_cb_t cbRxTo, dwt_cb_t cbRxErr, dwt_cb_t cbSPIErr, dwt_cb_t cbSPIRdy);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_checkIRQ()
- *
  * @brief This function checks if the IRQ line is active - this is used instead of interrupt handler
  *
  * input parameters
@@ -883,18 +1478,35 @@
  *
  * return value is 1 if the IRQS bit is set and 0 otherwise
  */
-uint8_t dwt_checkIRQ(void);
+uint8_t dwt_checkirq(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_isr()
+ * @brief This function checks if the DW3000 is in IDLE_RC state
  *
- * @brief This is the devices interrupt handler function, it will process/report status events
- * Notes:  In PC based system using (Cheetah or ARM) USB to SPI converter there can be no interrupts, however we still need something
- *         to take the place of it and operate in a polled way.
- *         In an embedded system this function should be configured to launch on an interrupt, then it will process the interrupt trigger event and
- *         call a TX or RX call-back function depending on whether the event is a TX or RX event.
- *         The TX call-back will be called when a frame has been sent and the RX call-back when a frame has been received.
+ * input parameters
  *
+ * output parameters
+ *
+ * return value is 1 if the IDLE_RC bit is set and 0 otherwise
+ */
+uint8_t dwt_checkidlerc(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is the DW3000's general Interrupt Service Routine. It will process/report the following events:
+ *          - RXFCG (through cbRxOk callback)
+ *          - TXFRS (through cbTxDone callback)
+ *          - RXRFTO/RXPTO (through cbRxTo callback)
+ *          - RXPHE/RXFCE/RXRFSL/RXSFDTO/AFFREJ/LDEERR (through cbRxErr callback)
+ *        For all events, corresponding interrupts are cleared and necessary resets are performed. In addition, in the RXFCG case,
+ *        received frame information and frame control are read before calling the callback. If double buffering is activated, it
+ *        will also toggle between reception buffers once the reception callback processing has ended.
+ *
+ *        /!\ This version of the ISR supports double buffering but does not support automatic RX re-enabling!
+ *
+ * NOTE:  In PC based system using (Cheetah or ARM) USB to SPI converter there can be no interrupts, however we still need something
+ *        to take the place of it and operate in a polled way. In an embedded system this function should be configured to be triggered
+ *        on any of the interrupts described above.
+
  * input parameters
  *
  * output parameters
@@ -904,34 +1516,24 @@
 void dwt_isr(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn void dwt_setinterrupt()
- *
  * @brief This function enables the specified events to trigger an interrupt.
- * The following events can be enabled:
- * DWT_INT_TFRS         0x00000080          // frame sent
- * DWT_INT_RFCG         0x00004000          // frame received with good CRC
- * DWT_INT_RPHE         0x00001000          // receiver PHY header error
- * DWT_INT_RFCE         0x00008000          // receiver CRC error
- * DWT_INT_RFSL         0x00010000          // receiver sync loss error
- * DWT_INT_RFTO         0x00020000          // frame wait timeout
- * DWT_INT_RXPTO        0x00200000          // preamble detect timeout
- * DWT_INT_SFDT         0x04000000          // SFD timeout
- * DWT_INT_ARFE         0x20000000          // frame rejected (due to frame filtering configuration)
+ * The following events can be found in SYS_ENABLE_LO and SYS_ENABLE_HI registers.
  *
  *
  * input parameters:
- * @param bitmask - sets the events which will generate interrupt
- * @param enable - if set the interrupts are enabled else they are cleared
- *
+ * @param bitmask_lo - sets the events in SYS_ENABLE_LO_ID register which will generate interrupt
+ * @param bitmask_hi - sets the events in SYS_ENABLE_HI_ID register which will generate interrupt
+ * @param operation  - if set to DWT_ENABLE_INT additional interrupts as selected in the bitmask are enabled
+ *                   - if set to DWT_ENABLE_INT_ONLY the interrupts in the bitmask are forced to selected state -
+ *                      i.e. the mask is written to the register directly.
+ *                   - otherwise (if set to DWT_DISABLE_INT) clear the interrupts as selected in the bitmask
  * output parameters
  *
  * no return value
  */
-void dwt_setinterrupt( uint32_t bitmask, uint8_t enable);
+void dwt_setinterrupt(uint32_t bitmask_lo, uint32_t bitmask_hi, dwt_INT_options_e INT_options);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setpanid()
- *
  * @brief This is used to set the PAN ID
  *
  * input parameters
@@ -944,8 +1546,6 @@
 void dwt_setpanid(uint16_t panID);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setaddress16()
- *
  * @brief This is used to set 16-bit (short) address
  *
  * input parameters
@@ -958,8 +1558,6 @@
 void dwt_setaddress16(uint16_t shortAddress);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_seteui()
- *
  * @brief This is used to set the EUI 64-bit (long) address
  *
  * input parameters
@@ -972,9 +1570,7 @@
 void dwt_seteui(uint8_t *eui64);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_geteui()
- *
- * @brief This is used to get the EUI 64-bit from the DW1000
+ * @brief This is used to get the EUI 64-bit from the DW3000
  *
  * input parameters
  * @param eui64 - this is the pointer to a buffer that will contain the read 64-bit EUI value
@@ -986,8 +1582,31 @@
 void dwt_geteui(uint8_t *eui64);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_otpread()
+ * @brief This is used to read from AON memory
  *
+ * input parameters
+ * @param aon_address - this is the address of the memory location to read
+ *
+ * output parameters - None
+ *
+ * returns 8-bits read from given AON memory address
+ */
+uint8_t dwt_aon_read(uint16_t aon_address);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to write to AON memory
+ *
+ * @param aon_address - this is the address of the memory location to write
+ * @param aon_write_data - this is the data to write
+ *
+ * output parameters - None
+ *
+ * no return value
+ *
+ */
+void dwt_aon_write(uint16_t aon_address, uint8_t aon_write_data);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This is used to read the OTP data from given address into provided array
  *
  * input parameters
@@ -999,49 +1618,82 @@
  *
  * no return value
  */
-void dwt_otpread(uint32_t address, uint32_t *array, uint8_t length);
+void dwt_otpread(uint16_t address, uint32_t *array, uint8_t length);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_enableframefilter()
- *
  * @brief This is used to enable the frame filtering - (the default option is to
  * accept any data and ACK frames with correct destination address
  *
  * input parameters
- * @param - bitmask - enables/disables the frame filtering options according to
- *      DWT_FF_NOTYPE_EN        0x000   no frame types allowed
- *      DWT_FF_COORD_EN         0x002   behave as coordinator (can receive frames with no destination address (PAN ID has to match))
- *      DWT_FF_BEACON_EN        0x004   beacon frames allowed
- *      DWT_FF_DATA_EN          0x008   data frames allowed
- *      DWT_FF_ACK_EN           0x010   ack frames allowed
- *      DWT_FF_MAC_EN           0x020   mac control frames allowed
- *      DWT_FF_RSVD_EN          0x040   reserved frame types allowed
+ * @param enabletype (bitmask) - enables/disables the frame filtering and configures 802.15.4 type
+ *       DWT_FF_ENABLE_802_15_4      0x2             // use 802.15.4 filtering rules
+ *       DWT_FF_DISABLE              0x0             // disable FF
+ * @param filtermode (bitmask) - configures the frame filtering options according to
+ *       DWT_FF_BEACON_EN            0x001           // beacon frames allowed
+ *       DWT_FF_DATA_EN              0x002           // data frames allowed
+ *       DWT_FF_ACK_EN               0x004           // ack frames allowed
+ *       DWT_FF_MAC_EN               0x008           // mac control frames allowed
+ *       DWT_FF_RSVD_EN              0x010           // reserved frame types allowed
+ *       DWT_FF_MULTI_EN             0x020           // multipurpose frames allowed
+ *       DWT_FF_FRAG_EN              0x040           // fragmented frame types allowed
+ *       DWT_FF_EXTEND_EN            0x080           // extended frame types allowed
+ *       DWT_FF_COORD_EN             0x100           // behave as coordinator (can receive frames with no dest address (PAN ID has to match))
+ *       DWT_FF_IMPBRCAST_EN         0x200           // allow MAC implicit broadcast
  *
  * output parameters
  *
  * no return value
  */
-void dwt_enableframefilter(uint16_t bitmask);
+void dwt_configureframefilter(uint16_t enabletype, uint16_t filtermode);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_enableautoack()
+ * @brief  this function is used to calculate 8-bit CRC, it uses 100000111 polynomial (i.e. P(x) = x^8+ x^2+ x^1+ x^0)
  *
- * @brief This call enables the auto-ACK feature. If the responseDelayTime (parameter) is 0, the ACK will be sent a.s.a.p.
- * otherwise it will be sent with a programmed delay (in symbols), max is 255.
- * NOTE: needs to have frame filtering enabled as well
+ * input parameters:
+ * @param byteArray     - data to calculate CRC for
+ * @param flen          - length of byteArray
+ * @param crcInit       - initialisation value for CRC calculation
+ *
+ * output parameters
+ *
+ * returns 8-bit calculate CRC value
+ */
+uint8_t dwt_generatecrc8(const uint8_t* byteArray, int flen, uint8_t crcInit);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to enable SPI CRC check in DW3000
  *
  * input parameters
- * @param responseDelayTime - if non-zero the ACK is sent after this delay, max is 255.
+ * @param crc_mode - if set to DWT_SPI_CRC_MODE_WR then SPI CRC checking will be performed in DW3000 on each SPI write
+ *                   last byte of the SPI write transaction needs to be the 8-bit CRC, if it does not match
+ *                   the one calculated by DW3000 SPI CRC ERROR event will be set in the status register (SYS_STATUS_SPICRC)
+ *
+ * @param spireaderr_cb - this needs to contain the callback function pointer which will be called when SPI read error
+ *                        is detected (when the DW3000 generated CRC does not match the one calculated by  dwt_generatecrc8
+ *                        following the SPI read transaction)
  *
  * output parameters
  *
  * no return value
  */
-void dwt_enableautoack(uint8_t responseDelayTime);
+void dwt_enablespicrccheck(dwt_spi_crc_mode_e crc_mode, dwt_spierrcb_t spireaderr_cb);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setrxaftertxdelay()
- *
+* @brief This call enables the auto-ACK feature. If the responseDelayTime (parameter) is 0, the ACK will be sent a.s.a.p.
+* otherwise it will be sent with a programmed delay (in symbols), max is 255.
+* NOTE: needs to have frame filtering enabled as well
+*
+* input parameters
+* @param responseDelayTime - if non-zero the ACK is sent after this delay, max is 255.
+* @param enable - enables or disables the auto-ACK feature
+*
+* output parameters
+*
+* no return value
+*/
+void dwt_enableautoack(uint8_t responseDelayTime, int enable);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief This sets the receiver turn on delay time after a transmission of a frame
  *
  * input parameters
@@ -1054,9 +1706,9 @@
 void dwt_setrxaftertxdelay(uint32_t rxDelayTime);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_rxreset()
+ * @brief this function resets the DW3000
  *
- * @brief this function resets the receiver of the DW1000
+ * NOTE: SPI rate must be <= 7MHz before a call to this function as the device will use FOSC/4 as part of internal reset
  *
  * input parameters:
  *
@@ -1064,24 +1716,9 @@
  *
  * no return value
  */
-void dwt_rxreset(void);
+void dwt_softreset(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_softreset()
- *
- * @brief this function resets the DW1000
- *
- * input parameters:
- *
- * output parameters
- *
- * no return value
- */
-void dwt_softreset(void) ;
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readrxdata()
- *
  * @brief This is used to read the data from the RX buffer, from an offset location give by offset parameter
  *
  * input parameters
@@ -1096,55 +1733,117 @@
 void dwt_readrxdata(uint8_t *buffer, uint16_t length, uint16_t rxBufferOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readaccdata()
- *
- * @brief This is used to read the data from the Accumulator buffer, from an offset location give by offset parameter
+ * @brief This is used to read the data from the RX scratch buffer, from an offset location given by offset parameter.
  *
  * input parameters
  * @param buffer - the buffer into which the data will be read
  * @param length - the length of data to read (in bytes)
- * @param accOffset - the offset in the acc buffer from which to read the data
+ * @param rxBufferOffset - the offset in the rx buffer from which to read the data
  *
  * output parameters
  *
  * no return value
  */
-void dwt_readaccdata(uint8_t *buffer, uint16_t length, uint16_t rxBufferOffset);
+void dwt_read_rx_scratch_data(uint8_t *buffer, uint16_t length, uint16_t rxBufferOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readdiagnostics()
+ * @brief This is used to read the 18 bit data from the Accumulator buffer, from an offset location give by offset parameter
+ *        for 18 bit complex samples, each sample is 6 bytes (3 real and 3 imaginary)
  *
+ *
+ * NOTE: Because of an internal memory access delay when reading the accumulator the first octet output is a dummy octet
+ *       that should be discarded. This is true no matter what sub-index the read begins at.
+ *
+ * input parameters
+ * @param buffer - the buffer into which the data will be read
+ * @param length - the length of data to read (in bytes)
+ * @param accOffset - the offset in the acc buffer from which to read the data, this is a complex sample index
+ *                    e.g. to read 10 samples starting at sample 100
+ *                    buffer would need to be >= 10*6 + 1, length is 61 (1 is for dummy), accOffset is 100
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_readaccdata(uint8_t *buffer, uint16_t len, uint16_t accOffset);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to read the crystal offset (relating to the frequency offset of the far DW3000 device compared to this one)
+ *        Note: the returned signed 16-bit number shoudl be divided by 16 to get ppm offset.
+ *
+ * input parameters - NONE
+ *
+ * return value - the (int12) signed offset value. (s[6:-4])
+ *                A positive value means the local RX clock is running faster than the remote TX device.
+ */
+int16_t dwt_readclockoffset(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to read the RX carrier integrator value (relating to the frequency offset of the TX node)
+ *
+ * input parameters - NONE
+ *
+ * return value - the (int32_t) signed carrier integrator value.
+ *                A positive value means the local RX clock is running faster than the remote TX device.
+ */
+int32_t dwt_readcarrierintegrator(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function enables CIA diagnostic data. When turned on the following registers will be logged:
+ * IP_TOA_LO, IP_TOA_HI, STS_TOA_LO, STS_TOA_HI, STS1_TOA_LO, STS1_TOA_HI, CIA_TDOA_0, CIA_TDOA_1_PDOA, CIA_DIAG_0, CIA_DIAG_1
+ *
+ * input parameters
+ * @param enable_mask :     DW_CIA_DIAG_LOG_MAX (0x8)   //CIA to copy to swinging set a maximum set of diagnostic registers in Double Buffer mode
+ *                          DW_CIA_DIAG_LOG_MID (0x4)   //CIA to copy to swinging set a medium set of diagnostic registers in Double Buffer mode
+ *                          DW_CIA_DIAG_LOG_MIN (0x2)   //CIA to copy to swinging set a minimal set of diagnostic registers in Double Buffer mode
+ *                          DW_CIA_DIAG_LOG_ALL (0x1)   //CIA to log all diagnostic registers
+ *                          DW_CIA_DIAG_LOG_MIN (0x0)   //CIA to log reduced set of diagnostic registers
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configciadiag(uint8_t enable_mask);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function reads the STS signal quality index
+ *
+ * input parameters
+ * @param rxStsQualityIndex - the (int16_t) signed STS quality index value.
+ *
+ * output parameters
+ * return value - >=0 for good and < 0 if bad STS quality.
+ *
+ * Note: For the 64 MHz PRF if value is >= 90% of the STS length then we can assume good STS reception.
+ *       Otherwise the STS timestamp may not be accurate.
+ */
+int dwt_readstsquality(int16_t* rxStsQualityIndex);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function reads the STS status
+ *
+ * input parameters
+ * @param stsstatus - the (uint8_t) STS status value.
+ * @param sts_num   - 0 for 1st STS, 1 for 2nd STS (2nd only valid when PDOA Mode 3 is used)
+ *
+ * output parameters
+ * return value 0 for good/valid STS < 0 if bad STS quality.
+ */
+int dwt_readstsstatus(uint16_t* stsStatus, int sts_num);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief this function reads the RX signal quality diagnostic data
  *
  * input parameters
- * @param diagnostics - diagnostic structure pointer, this will contain the diagnostic data read from the DW1000
+ * @param diagnostics - diagnostic structure pointer, this will contain the diagnostic data read from the DW3000
  *
  * output parameters
  *
  * no return value
  */
-void dwt_readdiagnostics(dwt_rxdiag_t *diagnostics);
+void dwt_readdiagnostics(dwt_rxdiag_t * diagnostics);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_loadopsettabfromotp()
- *
- * @brief This is used to select which Operational Parameter Set table to load from OTP memory
- *
- * input parameters
- * @param - opset table selection
- *                  DWT_OPSET_64LEN = 0x0 - load the operational parameter set table for 64 length preamble configuration
- *                  DWT_OPSET_TIGHT = 0x1 - load the operational parameter set table for tight xtal offsets (<1ppm)
- *                  DWT_OPSET_DEFLT = 0x2 - load the default operational parameter set table (this is loaded from reset)
- *
- * output parameters
- *
- * no return value
- */
-void  dwt_loadopsettabfromotp(uint8_t gtab_sel);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configeventcounters()
- *
  * @brief This is used to enable/disable the event counter in the IC
  *
  * input parameters
@@ -1156,8 +1855,6 @@
 void dwt_configeventcounters(int enable);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readeventcounters()
- *
  * @brief This is used to read the event counters in the IC
  *
  * input parameters
@@ -1170,9 +1867,7 @@
 void dwt_readeventcounters(dwt_deviceentcnts_t *counters);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_otpwriteandverify()
- *
- * @brief This is used to program 32-bit value into the DW1000 OTP memory.
+ * @brief This is used to program 32-bit value into the DW3000 OTP memory.
  *
  * input parameters
  * @param value - this is the 32-bit value to be programmed into OTP
@@ -1182,95 +1877,146 @@
  *
  * returns DWT_SUCCESS for success, or DWT_ERROR for error
  */
-uint32_t dwt_otpwriteandverify(uint32_t value, uint16_t address);
+int dwt_otpwriteandverify(uint32_t value, uint16_t address);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_setleds()
- *
  * @brief This is used to set up Tx/Rx GPIOs which could be used to control LEDs
  * Note: not completely IC dependent, also needs board with LEDS fitted on right I/O lines
  *       this function enables GPIOs 2 and 3 which are connected to LED3 and LED4 on EVB1000
  *
  * input parameters
- * @param test - if 1 the LEDs will be enabled, if 0 the LED control is disabled.
- *             - if value is 2 the LEDs will flash once after enable.
+ * @param mode - this is a bit field interpreted as follows:
+ *          - bit 0: 1 to enable LEDs, 0 to disable them
+ *          - bit 1: 1 to make LEDs blink once on init. Only valid if bit 0 is set (enable LEDs)
+ *          - bit 2 to 7: reserved
+ *
+ * output parameters none
+ *
+ * no return value
+ */
+void dwt_setleds(uint8_t mode);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This is used to adjust the crystal frequency
+ *
+ * input parameters:
+ * @param   value - crystal trim value (in range 0x0 to 0x3F) 64 steps (~1.65ppm per step)
  *
  * output parameters
  *
  * no return value
  */
-void dwt_setleds(uint8_t test);
+void dwt_setxtaltrim(uint8_t value);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_xtaltrim()
+ * @brief This function returns the value of XTAL trim that has been applied during initialisation (dwt_init). This can
+ *        be either the value read in OTP memory or a default value.
  *
- * @brief This is used adjust the crystal frequency
+ * NOTE: The value returned by this function is the initial value only! It is not updated on dwt_setxtaltrim calls.
  *
- * input parameters:
- * @param   value - crystal trim value (in range 0x0 to 0x1F) 31 steps (~1.5ppm per step)
- *
- * @output
- *
- * no return value
- */
-void dwt_xtaltrim(uint8_t value);
-
-/*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configcwmode()
- *
- * @brief this function sets the DW1000 to transmit cw signal at specific channel frequency
- *
- * input parameters:
- * @param chan - specifies the operating channel (e.g. 1, 2, 3, 4, 5, 6 or 7)
+ * input parameters
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * returns the XTAL trim value set upon initialisation
  */
-int dwt_configcwmode(uint8_t chan);
+uint8_t dwt_getxtaltrim(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_configcontinuousframemode()
+ * @brief This function enables repeated frames to be generated given a frame repetition rate.
  *
- * @brief this function sets the DW1000 to continuous tx frame mode for regulatory approvals testing.
+ * input parameters:
+ * @param framerepetitionrate - Value specifying the rate at which frames will be repeated.
+ *                            If the value is less than the frame duration, the frames are sent
+ *                            back-to-back.
+ *
+ * output parameters:
+ * None
+ *
+ * No return value
+ */
+void dwt_repeated_frames(uint32_t framerepetitionrate);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+* @brief This function will enable a repeated continuous waveform on the device
+*
+* input parameters:
+* @param cw_enable: CW mode enable
+* @param cw_mode_config: CW configuration mode.
+*
+* output parameters:
+*
+*/
+void dwt_repeated_cw(int cw_enable, int cw_mode_config);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function sets the DW3000 to transmit cw signal at specific channel frequency
+ *
+ * input parameters: channel - 5 or 9
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configcwmode(uint8_t channel);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function sets the DW3000 to continuous tx frame mode for regulatory approvals testing.
  *
  * input parameters:
  * @param framerepetitionrate - This is a 32-bit value that is used to set the interval between transmissions.
-*  The minimum value is 4. The units are approximately 8 ns. (or more precisely 512/(499.2e6*128) seconds)).
+ *  The minimum value is 4. The units are approximately 8 ns. (or more precisely 512/(499.2e6*128) seconds)).
+ * @param channel - 5 or 9
  *
  * output parameters
  *
  * no return value
  */
-void dwt_configcontinuousframemode(uint32_t framerepetitionrate);
+void dwt_configcontinuousframemode(uint32_t framerepetitionrate, uint8_t channel);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readtempvbat()
+ * @brief this function reads the raw battery voltage and temperature values of the DW IC.
+ * The values read here will be the current values sampled by DW IC AtoD converters.
  *
- * @brief this function reads the battery voltage and temperature of the MP
- * The values read here will be the current values sampled by DW1000 AtoD converters.
- * Note on Temperature: the temperature value needs to be converted to give the real temperature
- * the formula is: 1.13 * reading - 113.0
- * Note on Voltage: the voltage value needs to be converted to give the real voltage
- * the formula is: 0.0057 * reading + 2.3
- *
- * NB: To correctly read the temperature this read should be done with xtal clock
- * however that means that the receiver will be switched off, if receiver needs to be on then
- * the timer is used to make sure the value is stable before reading
  *
  * input parameters:
- * @param fastSPI - set to 1 if SPI rate > than 3MHz is used
  *
  * output parameters
  *
  * returns  (temp_raw<<8)|(vbat_raw)
  */
-uint16_t dwt_readtempvbat(uint8_t fastSPI);
+uint16_t dwt_readtempvbat(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readwakeuptemp()
+ * @brief  this function takes in a raw temperature value and applies the conversion factor
+ * to give true temperature. The dwt_initialise needs to be called before call to this to
+ * ensure pdw3000local->tempP contains the SAR_LTEMP value from OTP.
  *
- * @brief this function reads the temperature of the DW1000 that was sampled
+ * input parameters:
+ * @param raw_temp - this is the 8-bit raw temperature value as read by dwt_readtempvbat
+ *
+ * output parameters:
+ *
+ * returns: temperature sensor value
+ */
+float dwt_convertrawtemperature(uint8_t raw_temp);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function takes in a raw voltage value and applies the conversion factor
+ * to give true voltage. The dwt_initialise needs to be called before call to this to
+ * ensure pdw3000local->vBatP contains the SAR_LVBAT value from OTP
+ *
+ * input parameters:
+ * @param raw_voltage - this is the 8-bit raw voltage value as read by dwt_readtempvbat
+ *
+ * output parameters:
+ *
+ * returns: voltage sensor value
+ */
+float dwt_convertrawvoltage(uint8_t raw_voltage);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function reads the temperature of the DW3000 that was sampled
  * on waking from Sleep/Deepsleep. They are not current values, but read on last
  * wakeup if DWT_TANDV bit is set in mode parameter of dwt_configuresleep
  *
@@ -1280,12 +2026,10 @@
  *
  * returns: 8-bit raw temperature sensor value
  */
-uint8_t dwt_readwakeuptemp(void) ;
+uint8_t dwt_readwakeuptemp(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readwakeupvbat()
- *
- * @brief this function reads the battery voltage of the DW1000 that was sampled
+ * @brief this function reads the battery voltage of the DW3000 that was sampled
  * on waking from Sleep/Deepsleep. They are not current values, but read on last
  * wakeup if DWT_TANDV bit is set in mode parameter of dwt_configuresleep
  *
@@ -1295,19 +2039,50 @@
  *
  * returns: 8-bit raw battery voltage sensor value
  */
-uint8_t dwt_readwakeupvbat(void) ;
+uint8_t dwt_readwakeupvbat(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_writetodevice()
+ * @brief this function determines the adjusted bandwidth setting (PG_DELAY bitfield setting)
+ * of the DW3000. The adjustemnt is a result of DW3000 internal PG cal routine, given a target count value it will try to
+ * find the PG delay which gives the closest count value.
+ * Manual sequencing of TX blocks and TX clocks need to be enabled for either channel 5 or 9.
+ * This function presumes that the PLL is already in the IDLE state. Please configure the PLL to IDLE
+ * state before calling this function, by calling dwt_configure.
  *
- * @brief  this function is used to write to the DW1000 device registers
+ * input parameters:
+ * @param target_count - uint16_t - the PG count target to reach in order to correct the bandwidth
+ * @param channel - int - The channel to configure for the corrected bandwith (5 or 9)
+ *
+ * output parameters:
+ * returns: (uint8_t) The setting that was written to the PG_DELAY register (when calibration completed)
+ */
+uint8_t dwt_calcbandwidthadj(uint16_t target_count, int channel);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this function calculates the value in the pulse generator counter register (PGC_STATUS) for a given PG_DELAY
+ * This is used to take a reference measurement, and the value recorded as the reference is used to adjust the
+ * bandwidth of the device when the temperature changes. This function presumes that the PLL is already in the IDLE
+ * state.
+ *
+ * input parameters:
+ * @param pgdly - uint8_t - the PG_DELAY (max value 63) to set (to control bandwidth), and to find the corresponding count value for
+ * @param channel - int - The channel to configure for the corrected bandwith (5 or 9)
+ *
+ * output parameters:
+ * returns (uint16_t) - The count value calculated from the provided PG_DELAY value (from PGC_STATUS) - used as reference
+ * for later bandwidth adjustments
+ */
+uint16_t dwt_calcpgcount(uint8_t pgdly, int channel);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  this function is used to write to the DW3000 device registers
  * Notes:
  *        1. Firstly we create a header (the first byte is a header byte)
  *        a. check if sub index is used, if subindexing is used - set bit-6 to 1 to signify that the sub-index address follows the register index byte
  *        b. set bit-7 (or with 0x80) for write operation
  *        c. if extended sub address index is used (i.e. if index > 127) set bit-7 of the first sub-index byte following the first header byte
  *
- *        2. Write the header followed by the data bytes to the DW1000 device
+ *        2. Write the header followed by the data bytes to the DW3000 device
  *
  *
  * input parameters:
@@ -1318,27 +2093,25 @@
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * no return value
  */
-int dwt_writetodevice             // returns 0 for success, or, -1 for error.
+void dwt_writetodevice
 (
-    uint16_t      recordNumber,   // input parameter - ID of register file or buffer being accessed
+    uint32_t      recordNumber,   // input parameter - ID of register file or buffer being accessed
     uint16_t      index,          // input parameter - byte index into register file or buffer being accessed
-    uint32_t      length,         // input parameter - number of bytes being written
-     uint8_t *buffer         // input parameter - pointer to buffer containing the 'length' bytes to be written
-) ;
+    uint16_t      length,         // input parameter - number of bytes being written
+    uint8_t       *buffer         // input parameter - pointer to buffer containing the 'length' bytes to be written
+);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_readfromdevice()
- *
- * @brief  this function is used to read from the DW1000 device registers
+ * @brief  this function is used to read from the DW3000 device registers
  * Notes:
  *        1. Firstly we create a header (the first byte is a header byte)
  *        a. check if sub index is used, if subindexing is used - set bit-6 to 1 to signify that the sub-index address follows the register index byte
  *        b. set bit-7 (or with 0x80) for write operation
  *        c. if extended sub address index is used (i.e. if index > 127) set bit-7 of the first sub-index byte following the first header byte
  *
- *        2. Write the header followed by the data bytes to the DW1000 device
+ *        2. Write the header followed by the data bytes to the DW3000 device
  *        3. Store the read data in the input buffer
  *
  * input parameters:
@@ -1349,20 +2122,18 @@
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * no return value
  */
-int dwt_readfromdevice            // returns offset where requested data begins in supplied buffer, or, -1 for error.
+void dwt_readfromdevice
 (
-    uint16_t  recordNumber,       // input parameter - ID of register file or buffer being accessed
+    uint32_t  recordNumber,       // input parameter - ID of register file or buffer being accessed
     uint16_t  index,              // input parameter - byte index into register file or buffer being accessed
-    uint32_t  length,             // input parameter - number of bytes being read
+    uint16_t  length,             // input parameter - number of bytes being read
     uint8_t   *buffer             // input parameter - pointer to buffer in which to return the read data.
-) ;
+);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_read32bitoffsetreg()
- *
- * @brief  this function is used to read 32-bit value from the DW1000 device registers
+ * @brief  this function is used to read 32-bit value from the DW3000 device registers
  *
  * input parameters:
  * @param regFileID - ID of register file or buffer being accessed
@@ -1370,14 +2141,12 @@
  *
  * output parameters
  *
- * returns 32 bit register value (success), or DWT_ERROR for error
+ * returns 32 bit register value
  */
-uint32_t dwt_read32bitoffsetreg(int regFileID, int regOffset) ;
+uint32_t dwt_read32bitoffsetreg(int regFileID, int regOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_write32bitoffsetreg()
- *
- * @brief  this function is used to write 32-bit value to the DW1000 device registers
+ * @brief  this function is used to write 32-bit value to the DW3000 device registers
  *
  * input parameters:
  * @param regFileID - ID of register file or buffer being accessed
@@ -1386,14 +2155,12 @@
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * no return value
  */
-int dwt_write32bitoffsetreg(int regFileID, int regOffset, uint32_t regval);
+void dwt_write32bitoffsetreg(int regFileID, int regOffset, uint32_t regval);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_read16bitoffsetreg()
- *
- * @brief  this function is used to read 16-bit value from the DW1000 device registers
+ * @brief  this function is used to read 16-bit value from the DW3000 device registers
  *
  * input parameters:
  * @param regFileID - ID of register file or buffer being accessed
@@ -1401,14 +2168,12 @@
  *
  * output parameters
  *
- * returns 16 bit register value (success), or DWT_ERROR for error
+ * returns 16 bit register value
  */
 uint16_t dwt_read16bitoffsetreg(int regFileID, int regOffset);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_write16bitoffsetreg()
- *
- * @brief  this function is used to write 16-bit value to the DW1000 device registers
+ * @brief  this function is used to write 16-bit value to the DW3000 device registers
  *
  * input parameters:
  * @param regFileID - ID of register file or buffer being accessed
@@ -1417,16 +2182,187 @@
  *
  * output parameters
  *
- * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ * no return value
  */
-int dwt_write16bitoffsetreg(int regFileID, int regOffset, uint16_t regval) ;
-
-#define dwt_write32bitreg(x,y)	dwt_write32bitoffsetreg(x,0,y)
-#define dwt_read32bitreg(x)		dwt_read32bitoffsetreg(x,0)
+void dwt_write16bitoffsetreg(int regFileID, int regOffset, uint16_t regval);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn writetospi()
+ * @brief  this function is used to read an 8-bit value from the DW3000 device registers
  *
+ * input parameters:
+ * @param regFileID - ID of register file or buffer being accessed
+ * @param regOffset - the index into register file or buffer being accessed
+ *
+ * output parameters
+ *
+ * returns 8-bit register value
+ */
+uint8_t dwt_read8bitoffsetreg(int regFileID, int regOffset);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  this function is used to write an 8-bit value to the DW3000 device registers
+ *
+ * input parameters:
+ * @param regFileID - ID of register file or buffer being accessed
+ * @param regOffset - the index into register file or buffer being accessed
+ * @param regval    - the value to write
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_write8bitoffsetreg(int regFileID, int regOffset, uint8_t regval);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  this function can be used to modify a 32-bit register of DW3000
+ *         Used to optimize SPI transaction when only clear or set of know
+ *         bits in the register is requierd
+ *
+ * input parameters:
+ * @param regFileID - ID of register file or buffer being accessed
+ * @param regOffset - the index into register file or buffer being accessed
+ * @param _and      - the 32-bit value to logically AND register
+ * @param _or       - the 32-bit value to logically OR register after AND operation
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_modify32bitoffsetreg(const int regFileID, const int regOffset, const uint32_t _and, const uint32_t _or);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  this function can be used to modify a 16-bit register of DW3000
+ *         Used to optimize SPI transaction when only clear or set of know
+ *         bits in the register is requierd
+ *
+ * input parameters:
+ * @param regFileID - ID of register file or buffer being accessed
+ * @param regOffset - the index into register file or buffer being accessed
+ * @param _and      - the 16-bit value to logically AND register
+ * @param _or       - the 16-bit value to logically OR register after AND operation
+ *
+ * output parameters
+ *
+ * no return value
+ */
+ void dwt_modify16bitoffsetreg(const int regFileID, const int regOffset, const uint16_t _and, const uint16_t _or);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  this function can be used to modify a 8-bit register of DW3000
+ *         Used to optimize SPI transaction when only clear or set of know
+ *         bits in the register is requierd
+ *
+ * input parameters:
+ * @param regFileID - ID of register file or buffer being accessed
+ * @param regOffset - the index into register file or buffer being accessed
+ * @param _and      - the 8-bit value to logically AND register
+ * @param _or       - the 8-bit value to logically OR register after AND operation
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_modify8bitoffsetreg(const int regFileID, const int regOffset, const uint8_t _and, const uint8_t _or);
+
+/********************************************************************************************************************/
+/*                                                AES BLOCK                                                         */
+/********************************************************************************************************************/
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief   This function provides the API for the configuration of the AES key before first usage.
+ * @param   key - pointer to the key which will be programmed to the Key register
+ *          Note, key register supports only 128-bit keys.
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_set_keyreg_128(const dwt_aes_key_t  *key);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief   This function provides the API for the configuration of the AES block before its first usage.
+ *
+ * input parameters
+ * @param   pCfg - pointer to the configuration structure, which contains the AES configuration data.
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_configure_aes(const dwt_aes_config_t *pCfg);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief   This Gets mic size in bytes and convert it to value to write in AES_CFG
+ * @param   mic_size_in_bytes    - mic size in bytes.
+ *
+ *
+ *
+ * @Return  dwt_mic_size_e - reg value number
+ */
+dwt_mic_size_e dwt_mic_size_from_bytes(uint8_t mic_size_in_bytes);
+
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief   This function provides the API for the job of encript/decript the data block
+ *
+ *          128 bit key shall be pre-loaded with dwt_set_aes_key()
+ *          dwt_configure_aes
+ *
+ *          supports AES_KEY_Src_Register mode only
+ *          packet sizes < 127
+ *          note, the "nonce" shall be unique for every transaction
+ * @param job - pointer to AES job, contains data info and encryption info.
+ * @param core_type - Core type
+ *
+ * @return  AES_STS_ID status bits
+ *
+ *
+ */
+int8_t dwt_do_aes(dwt_aes_job_t *job, dwt_aes_core_type_e core_type);
+
+/****************************************************************************************************************************************************
+ *
+ * Declaration of platform-dependent lower level functions.
+ *
+ ****************************************************************************************************************************************************/
+
+extern void wakeup_device_with_io(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief  This function wakeup device by an IO pin
+ *
+ * @param None
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void dwt_wakeup_ic(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief
+ * NB: In porting this to a particular microprocessor, the implementer needs to define the two low
+ * level abstract functions to write to and read from the SPI the definitions should be in deca_spi.c file.
+ * Low level abstract function to write to the SPI, this should be used when DW3000 SPI CRC mode is used
+ * Takes two separate byte buffers for write header and write data
+ * returns 0 for success, or -1 for error
+ *
+ * Note: The body of this function is defined in deca_spi.c and is platform specific
+ *
+ * input parameters:
+ * @param headerLength  - number of bytes header being written
+ * @param headerBuffer  - pointer to buffer containing the 'headerLength' bytes of header to be written
+ * @param bodylength    - number of bytes data being written
+ * @param bodyBuffer    - pointer to buffer containing the 'bodylength' bytes od data to be written
+ * @param crc8          - 8-bit crc, calculated on the header and data bytes
+ *
+ * output parameters
+ *
+ * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ */
+extern int writetospiwithcrc(uint16_t headerLength, const uint8_t *headerBuffer, uint16_t bodylength, const uint8_t *bodyBuffer, uint8_t crc8);
+
+/*! ------------------------------------------------------------------------------------------------------------------
  * @brief
  * NB: In porting this to a particular microprocessor, the implementer needs to define the two low
  * level abstract functions to write to and read from the SPI the definitions should be in deca_spi.c file.
@@ -1446,6 +2382,7 @@
  *
  * returns DWT_SUCCESS for success, or DWT_ERROR for error
  */
+//extern int writetospi(uint16_t headerLength, const uint8_t *headerBuffer, uint16_t bodylength, const uint8_t *bodyBuffer);
 extern int writetospi                          // returns 0 for success, or, -1 for error.
 (
     uint16_t       headerLength,          // input parameter - number of bytes header being written
@@ -1453,10 +2390,7 @@
     uint32_t       bodylength,            // input parameter - number of bytes data being written
      uint8_t *bodyBuffer             // input parameter - pointer to buffer containing the 'bodylength' bytes od data to be written
 ) ;
-
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn readfromspi()
- *
  * @brief
  * NB: In porting this to a particular microprocessor, the implementer needs to define the two low
  * level abstract functions to write to and read from the SPI the definitions should be in deca_spi.c file.
@@ -1469,13 +2403,14 @@
  * input parameters:
  * @param headerLength  - number of bytes header to write
  * @param headerBuffer  - pointer to buffer containing the 'headerLength' bytes of header to write
- * @param bodylength    - number of bytes data being read
- * @param bodyBuffer    - pointer to buffer containing to return the data (NB: size required = headerLength + readlength)
+ * @param readlength    - number of bytes data being read
+ * @param readBuffer    - pointer to buffer containing to return the data (NB: size required = headerLength + readlength)
  *
  * output parameters
  *
  * returns DWT_SUCCESS for success (and the position in the buffer at which data begins), or DWT_ERROR for error
  */
+//extern int readfromspi(uint16_t headerLength, /*const*/ uint8_t *headerBuffer, uint16_t readlength, uint8_t *readBuffer);
 extern int readfromspi                         // returns offset where requested data begins in supplied buffer, or, -1 for error.
 (
     uint16_t       headerLength,          // input parameter - number of bytes header to write
@@ -1483,23 +2418,17 @@
     uint32_t       readlength,            // input parameter - number of bytes data being read
     uint8_t       *readBuffer             // input parameter - pointer to buffer containing to return the data (NB: size required = headerLength + readlength)
 ) ;
-
+#ifdef STM32F429xx
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn dwt_getrangebias()
- *
- * @brief This function is used to return the range bias correction need for TWR with DW1000 units.
- *
- * input parameters:
- * @param chan  - specifies the operating channel (e.g. 1, 2, 3, 4, 5, 6 or 7)
- * @param range - the calculated distance before correction
- * @param prf   - this is the PRF e.g. DWT_PRF_16M or DWT_PRF_64M
- *
- * output parameters
- *
- * returns correction needed in meters
- */
-double dwt_getrangebias(uint8_t chan, float range, uint8_t prf);
-
+* @brief This function sets the CS to '0' for ms delay and than raises it up
+*
+* input parameters:
+* @param ms_delay - The delay for CS to be in '0' state
+*
+* no return value
+*/
+extern uint16_t spi_cs_low_delay(uint16_t delay_ms);
+#endif //STM32F429xx
 
 // ---------------------------------------------------------------------------
 //
@@ -1507,7 +2436,7 @@
 //     controlling mutual exclusion from critical sections in the code where interrupts and background
 //     processing may interact.  The code using this is kept to a minimum and the disabling time is also
 //     kept to a minimum, so blanket interrupt disable may be the easiest way to provide this.  But at a
-//     minimum those interrupts coming from the decawave device should be disabled/re-enabled by this activity.
+//     minimum those interrupts coming from the Decawave device should be disabled/re-enabled by this activity.
 //
 //     In porting this to a particular microprocessor, the implementer may choose to use #defines here
 //     to map these calls transparently to the target system.  Alternatively the appropriate code may
@@ -1519,8 +2448,6 @@
 
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn decamutexon()
- *
  * @brief This function should disable interrupts. This is called at the start of a critical section
  * It returns the IRQ state before disable, this value is used to re-enable in decamutexoff call
  *
@@ -1530,32 +2457,116 @@
  *
  * output parameters
  *
- * returns the state of the DW1000 interrupt
+ * returns the state of the DW3000 interrupt
  */
-decaIrqStatus_t decamutexon(void) ;
+decaIrqStatus_t decamutexon(void);
 
 /*! ------------------------------------------------------------------------------------------------------------------
- * @fn decamutexoff()
- *
  * @brief This function should re-enable interrupts, or at least restore their state as returned(&saved) by decamutexon
  * This is called at the end of a critical section
  *
  * Note: The body of this function is defined in deca_mutex.c and is platform specific
  *
  * input parameters:
- * @param s - the state of the DW1000 interrupt as returned by decamutexon
+ * @param s - the state of the DW3000 interrupt as returned by decamutexon
  *
  * output parameters
  *
- * returns the state of the DW1000 interrupt
+ * returns the state of the DW3000 interrupt
  */
-void decamutexoff(decaIrqStatus_t s) ;
+void decamutexoff(decaIrqStatus_t s);
 
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief Wait for a given amount of time.
+ * NB: The body of this function is defined in deca_sleep.c and is platform specific
+ *
+ * input parameters:
+ * @param time_ms - time to wait in milliseconds
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void deca_sleep(unsigned int time_ms);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief Wait for a given amount of time.
+ * NB: The body of this function is defined in deca_sleep.c and is platform specific
+ *
+ * input parameters:
+ * @param time_us - time to wait in microseconds
+ *
+ * output parameters
+ *
+ * no return value
+ */
+void deca_usleep(unsigned long time_us);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief this reads the device ID and checks if it is the right one
+ *
+ * input parameters
+ * None
+ *
+ * output parameters
+ *
+ * returns DWT_SUCCESS for success, or DWT_ERROR for error
+ */
+int dwt_check_dev_id(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ *
+ * @brief This function runs the PGF calibration. This is needed prior to reception.
+ * Note: If the RX calibration routine fails the device receiver performance will be severely affected, the application should reset and try again
+ *
+ * input parameters
+ * @param ldoen    -   if set to 1 the function will enable LDOs prior to calibration and disable afterwards.
+ *
+ * return result of PGF calibration (DWT_ERROR/-1 = error)
+ *
+ */
+int dwt_run_pgfcal(void);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function runs the PGF calibration. This is needed prior to reception.
+ *
+ * input parameters
+ * @param ldoen    -   if set to 1 the function will enable LDOs prior to calibration and disable afterwards.
+ *
+ * return result of PGF calibration (0 = error)
+ *
+ */
+int dwt_pgf_cal(int ldoen);
+
+
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ *
+ * @brief   This function is used to write a 16 bit address to a desired Low-Energy device (LE) address. For frame pending to function when
+ * the correct bits are set in the frame filtering configuration via the dwt_configureframefilter. See dwt_configureframefilter for more details.
+ *
+ * @param addr - the address value to be written to the selected LE register
+ * @param leIndex - Low-Energy device (LE) address to write to
+ *
+ * no return value
+ *
+ */
+void dwt_configure_le_address(uint16_t addr, int leIndex);
+
+/*! ------------------------------------------------------------------------------------------------------------------
+ * @brief This function configures SFD type only: e.g. IEEE 4a - 8, DW-8, DW-16, or IEEE 4z -8 (binary)
+ * The dwt_configure should be called prior to this to configure other parameters
+ *
+ * input parameters
+ * @param sfdType    -   e.g. DWT_SFD_IEEE_4A, DWT_SFD_DW_8, DWT_SFD_DW_16, DWT_SFD_IEEE_4Z
+ *
+ * return none
+ *
+ */
+void dwt_configuresfdtype(uint8_t sfdType);
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* _DECA_DEVICE_API_H_ */
-
-

--
Gitblit v1.9.3