系列文章
- DW1000開發筆記(一)DW1000晶片概覽
- DW1000開發筆記(二)使用STM32硬體SPI+STM32cubeMX+HAL庫測試DW1000通信
- DW1000開發筆記(三)基于STM32 HAL庫裸機工程移植DW1000官方驅動
一、移植官方示例
1. 複制官方示例檔案
将官方驅動庫中example下的第一個示例移植過來:

複制到之前移植的STM32CubeMX生成的工程檔案中,并重命名檔案為simple_tx_example.c:
将其添加到MDK工程中:
2. 修改官方示例檔案
① 修改替換頭檔案:
② 修改函數名,修改列印和延時函數:
添加兩處列印資訊:
修改完成。
3. 調用示例代碼
修改main.c,移除我們之前自己添加的所有測試代碼。
接着先引入外部定義:
/* USER CODE BEGIN PFP */
extern int example_application_entry(void);
/* USER CODE END PFP */
然後在main函數中調用:
/* USER CODE BEGIN 2 */
printf("DW1000 UWB ic port on BearPi board By Mculover666\r\n");
example_application_entry();
/* USER CODE END 2 */
需要注意:
① 此函數需要在GPIO、USART、SPI外設初始化完成之後調用;
② 此函數中已經包含while(1)循環,是以此函數之後的代碼無效。
4. 移植結果
編譯、下載下傳程式,在序列槽助手中檢視列印日志:
示例程式移植成功。
二、示例程式分析
1. 輪詢方式發送流程
2. 寫入資料到緩沖區API
DW1000配置API的定義在deca_device_api.h中,實作在deca_device.c中,其原型如下:
int dwt_writetxdata(uint16 txFrameLength, uint8 *txFrameBytes, uint16 txBufferOffset) ;
該函數将使用者提供的待發送資料寫入DW1000發送緩沖區。
入參有三個,意義如下表:
參數 | 意義 |
---|---|
txFrameLength | 發送資料幀的總大小,包括兩個位元組的CRC校驗資料,最大1023,标準PHR模式允許最多127位元組 |
txFrameBytes | 指向使用者待發送資料 |
txBufferOffset | 指定DW1000 發送緩沖區中開始寫入資料的偏移量 |
傳回值也有兩個:
傳回值 | 意義 |
---|---|
DWT_SUCCESS | 寫入成功 |
DWT_ERROR | 寫入錯誤 |
在本示例中,發送的幀是802.15.4e标準閃爍,包含12個位元組:
static uint8 tx_msg[] = {0xC5, 0, 'D', 'E', 'C', 'A', 'W', 'A', 'V', 'E', 0, 0};
- 第0個位元組:幀類型(0xc5表示閃爍)
- 第1個位元組:幀序列号,随着每次的新幀遞增;
- 第2-9個位元組:Device ID(實際産品中應該唯一);
- 第10-11個位元組:CRC校驗值,由DW1000自動設定;
3. 配置發送幀控制寄存器API
該API的定義在deca_device_api.h中,實作在deca_device.c中,其原型如下:
void dwt_writetxfctrl(uint16 txFrameLength, uint16 txBufferOffset, int ranging)
該函數用來在發送之前配置發送幀控制寄存器。
入參有三個,意義如下表:
參數 | 意義 |
---|---|
txFrameLength | 發送資料幀的總大小,包括兩個位元組的CRC校驗資料,最大1023,标準PHR模式允許最多127位元組 |
txBufferOffset | 指定DW1000 發送緩沖區中開始寫入資料的偏移量 |
ranging | 如果這是一個範圍幀,為1,否則為0 |
4. 立即開始發送資料API
該API的定義在deca_device_api.h中,實作在deca_device.c中,其原型如下:
int dwt_starttx(uint8 mode)
該函數用來立即開始一次發送。
入參隻有一個,意義如下表:
值 | 意義 |
---|---|
立即發送,不期待回應 | |
1 | 延遲發送,不期待回應 |
2 | 立即發送,期待回應(是以在發送完成之後自動打開接收器) |
3 | 延遲發送,期待回應(是以在發送完成之後自動打開接收器) |
這些值都有對應的宏定義:
// 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
傳回值也有兩個:
傳回值 | 意義 |
---|---|
DWT_SUCCESS | 發送成功 |
DWT_ERROR | 發送錯誤(如果延遲時間已過,則延遲發送失敗) |
5. 查詢中斷标志寄存器
while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS)) { };
dwt_read32bitreg
用來讀取DW1000中一個32位的寄存器,SYS_STATUS_ID表示系統狀态寄存器(System event Status Register)的ID:
#define SYS_STATUS_ID 0x0F /* System event Status Register */
#define SYS_STATUS_TXFRS 0x00000080UL /* Transmit Frame Sent: This is set when the transmitter has completed the sending of a frame */
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);