UWB-DW1000 在8位单片机上移植使用

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值