天天看點

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

系列文章

  • DW1000開發筆記(一)DW1000晶片概覽
  • DW1000開發筆記(二)使用STM32硬體SPI+STM32cubeMX+HAL庫測試DW1000通信
  • DW1000開發筆記(三)基于STM32 HAL庫裸機工程移植DW1000官方驅動

一、移植官方示例

1. 複制官方示例檔案

将官方驅動庫中example下的第一個示例移植過來:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

複制到之前移植的STM32CubeMX生成的工程檔案中,并重命名檔案為simple_tx_example.c:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

将其添加到MDK工程中:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

2. 修改官方示例檔案

① 修改替換頭檔案:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

② 修改函數名,修改列印和延時函數:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

添加兩處列印資訊:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料
DW1000開發筆記(四)DW1000使用輪詢方式發送資料

修改完成。

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. 移植結果

編譯、下載下傳程式,在序列槽助手中檢視列印日志:

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

示例程式移植成功。

二、示例程式分析

1. 輪詢方式發送流程

DW1000開發筆記(四)DW1000使用輪詢方式發送資料

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);