DW1000的API函数库中,在32位单片机移植使用,并不需要特殊处理
而在8位单片机中使用,需要注意以下几点
1、单片机大小端(一般都是大端)
2、数据移位问题(库函数内有一些涉及32位的移位处理)
3、const 与 code 的问题
4、变量命名问题 不能出现 data,API中有data,需要修改为dat,以规避命名问题
主要更改点有以下几点
以DW1000 API版本号 V04.00.06 以例
2、数据移位问题
主要涉及文件为:decadriver\deca_device.c
涉及的函数为:void dwt_configure(dwt_config_t *config)
pdw1000local->sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (config->phrMode << SYS_CFG_PHR_MODE_SHFT));
需要修改为
regval = config->phrMode;
regval <<= SYS_CFG_PHR_MODE_SHFT;
regval &= SYS_CFG_PHR_MODE_11;
pdw1000local->sysCFGreg |= regval;
将数据进行分段移位处理
其内部有一段配置通道号等参数的
uint32 TempRegVal;
#if MCU_32BIT //8位机这里处理不一样
regval = (CHAN_CTRL_TX_CHAN_MASK & (chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel
(CHAN_CTRL_RX_CHAN_MASK & (chan << CHAN_CTRL_RX_CHAN_SHIFT)) | // Receive Channel
(CHAN_CTRL_RXFPRF_MASK & (config->prf << CHAN_CTRL_RXFPRF_SHIFT)) | // RX PRF
((CHAN_CTRL_TNSSFD | CHAN_CTRL_RNSSFD) & (nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) | // nsSFD enable RX&TX
(CHAN_CTRL_DWSFD & (useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) | // Use DW nsSFD
(CHAN_CTRL_TX_PCOD_MASK & (config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) | // TX Preamble Code
(CHAN_CTRL_RX_PCOD_MASK & (config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT)) ; // RX Preamble Code
dwt_write32bitreg(CHAN_CTRL_ID, regval) ;
// Set up TX Preamble Size, PRF and Data Rate
pdw1000local->txFCTRL = ((config->txPreambLength | config->prf) << TX_FCTRL_TXPRF_SHFT) | (config->dataRate << TX_FCTRL_TXBR_SHFT);
dwt_write32bitreg(TX_FCTRL_ID, pdw1000local->txFCTRL);
#else
//第一段数据处理
regval = (CHAN_CTRL_TX_CHAN_MASK & (chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel
(CHAN_CTRL_RX_CHAN_MASK & (chan << CHAN_CTRL_RX_CHAN_SHIFT)); // Receive Channel
TempRegVal = config->prf;
TempRegVal <<= CHAN_CTRL_RXFPRF_SHIFT;
TempRegVal &= CHAN_CTRL_RXFPRF_MASK;
regval |= TempRegVal;
TempRegVal = nsSfd_result;
TempRegVal <<= CHAN_CTRL_TNSSFD_SHIFT;
TempRegVal &= (CHAN_CTRL_TNSSFD | CHAN_CTRL_RNSSFD);
regval |= TempRegVal;
TempRegVal = useDWnsSFD;
TempRegVal <<= CHAN_CTRL_DWSFD_SHIFT;
TempRegVal &= CHAN_CTRL_DWSFD;
regval |= TempRegVal;
TempRegVal = config->txCode;
TempRegVal <<= CHAN_CTRL_TX_PCOD_SHIFT;
TempRegVal &= CHAN_CTRL_TX_PCOD_MASK;
regval |= TempRegVal;
TempRegVal = config->rxCode;
TempRegVal <<= CHAN_CTRL_RX_PCOD_SHIFT;
TempRegVal &= CHAN_CTRL_RX_PCOD_MASK;
regval |= TempRegVal;
dwt_write32bitreg(CHAN_CTRL_ID, regval) ;
//第二段数据处理
regval = config->txPreambLength | config->prf;
regval <<= TX_FCTRL_TXPRF_SHFT;
pdw1000local->txFCTRL = regval;
regval = config->dataRate;
regval <<= TX_FCTRL_TXBR_SHFT;
pdw1000local->txFCTRL |= regval;
dwt_write32bitreg(TX_FCTRL_ID, pdw1000local->txFCTRL);
#endif
里面直接是使用数据移位的处理方法,这种方式在32位的单片机,是没有任何问题的,在8位单片机,只要移位数据超过16位,则会出现问题
需要修改为先使用一个32位的变量,逐一进行赋值处理
3、const 与 code 问题
8位单片机上,使用const貌似不能把变量变成ROM代码,只有使用code才能解决
主要涉及修改文件 decadriver\deca_params_init.c
把整个文件中的 const 修改为 code
同时修改 decadriver\deca_param_types.h 文件中的 const 为 code
4、修改 data 命名为 dat
文件:decadriver\deca_device.c
uint32 _dwt_otpprogword32(uint32 data, uint16 address);
修改为
uint32 _dwt_otpprogword32(uint32 dat, uint16 address);