DWM1000 物理层

UWB 物理层

DW1000设备的物理层(PHY)参数

dwt_config_t config =
{
    2,               /* 通道号,用于无线通信。 */
    DWT_PRF_64M,     /* 脉冲重复频率,设置为64MHz。 */
    DWT_PLEN_1024,   /* 前导码长度,设置为1024个时间单位。 */
    DWT_PAC32,       /* 前导码获取块大小,在接收时使用。 */
    9,               /* 发送前导码,仅在发送时使用。 */
    9,               /* 接收前导码,仅在接收时使用。 */
    1,               /* 使用非标准的SFD,布尔值。 */
    DWT_BR_110K,     /* 数据速率,设置为110kbps。 */
    DWT_PHRMODE_STD, /* PHY头模式,设置为标准。 */
    (1025 + 64 - 32) /* SFD超时设置,根据前导码长度和其他参数计算得出。 */
//    5,               /* (被注释掉的)另一个通道号。 */
//    DWT_PRF_64M,     /* (被注释掉的)相同的脉冲重复频率。 */
//    DWT_PLEN_128,    /* (被注释掉的)不同的前导码长度,设置为128个时间单位。 */
//    DWT_PAC8,        /* (被注释掉的)不同的前导码获取块大小,在接收时使用。 */
//    9,               /* (被注释掉的)相同的发送前导码。 */
//    9,               /* (被注释掉的)相同的接收前导码。 */
//    0,               /* (被注释掉的)使用标准SFD,布尔值。 */
//    DWT_BR_6M8,      /* (被注释掉的)不同的数据速率,设置为6.8Mbps。 */
//    DWT_PHRMODE_STD, /* (被注释掉的)相同的PHY头模式。 */
//    (129 + 8 - 8)    /* (被注释掉的)不同的SFD超时设置。 */
};

这段代码定义了一个结构体dwt_config_t,它被用于配置DW1000设备的物理层(PHY)参数。这些参数对无线通信的性能和可靠性至关重要。以下是各个参数的详细解释:

  1. 通道号(Channel number)

    • 2:指定DW1000设备使用的无线通信通道号为2。
  2. 脉冲重复频率(Pulse repetition frequency)

    • DWT_PRF_64M:设置脉冲重复频率为64兆赫兹(MHz),这是发送脉冲信号的频率。
  3. 前导码长度(Preamble length)

    • DWT_PLEN_1024:前导码长度设为1024,这是帧开始前发送的固定格式码序列的长度,用于帮助接收设备同步。
  4. 前导码获取块大小(Preamble acquisition chunk size)

    • DWT_PAC32:在接收模式下,前导码获取块大小设置为32个时间单位。这是接收器用来锁定前导码的块大小。
  5. 发送前导码(TX preamble code)

    • 9:在发送时使用的前导码代码是9。
  6. 接收前导码(RX preamble code)

    • 9:在接收时使用的前导码代码也是9。
  7. 使用非标准SFD(Use non-standard SFD)

    • 1:表示使用非标准的帧起始分界符(SFD),这是标识帧开始的信号。标准值通常是0,这里设为1表示使用了一个自定义的SFD。
  8. 数据速率(Data rate)

    • DWT_BR_110K:数据传输速率设为110千比特每秒(Kbps)。
  9. 物理层头模式(PHY header mode)

    • DWT_PHRMODE_STD:物理层头模式设置为标准模式。
  10. SFD超时(SFD timeout)

    • (1025 + 64 - 32):SFD超时设置为前导码长度加1加上SFD长度减去PAC大小。这是接收设备等待SFD信号的最大时间。

注释掉的部分显示了另一组可能的配置参数,但在当前的配置中未启用。这些参数包括不同的通道号、前导码长度、PAC大小、数据速率,以及另一种SFD超时设置。这些参数的不同组合可以根据不同的网络需求和环境条件进行配置。

总的来说,这段代码是DW1000的初始化配置,它设置了无线通信的各种物理参数,确保了设备能够正确地发送和接收无线信号。

配置DWM1000

int dwt_configure(dwt_config_t *config)
{
    // 定义局部变量
    uint8 nsSfd_result  = 0;
    uint8 useDWnsSFD = 0;
    uint8 chan = config->chan;
    uint32 regval;
    uint16 reg16 = lde_replicaCoeff[config->rxCode];
    uint8 prfIndex = dw1000local.prfIndex = config->prf - DWT_PRF_16M;
    // 根据通道选择宽带或窄带
    uint8 bw = ((chan == 4) || (chan == 7)) ? 1 : 0;

    // 存储通道号到本地变量
    dw1000local.chan = config->chan;

#ifdef DWT_API_ERROR_CHECK
    // 参数检查,确保数据速率、脉冲重复频率、PAC大小和通道号在有效范围内
    // 如果参数无效,则返回错误码
    if (config->dataRate > DWT_BR_6M8)
    {
        return DWT_ERROR;
    }
    if ((config->prf > DWT_PRF_64M) || (config->prf < DWT_PRF_16M))
    {
        return DWT_ERROR;
    }
    if (config->rxPAC > DWT_PAC64)
    {
        return DWT_ERROR;
    }
    if ((chan < 1) || (chan > 7) || (6 == chan))
    {
        return DWT_ERROR;
    }
    // 确保前导码的选择对应于PRF
    if (config->prf == DWT_PRF_64M)
    {
        // 如果PRF为64M,则前导码编号应在9到27之间
    }
    else
    {
        // 如果PRF为16M,则前导码编号应在0到8之间
    }
    // 确保前导码长度参数有效
    switch (config->txPreambLength)
    {
        // 如果前导码长度不在以下列表中,则返回错误
        default:
            return DWT_ERROR;
    }

    if(config->phrMode > DWT_PHRMODE_EXT)
    {
        return DWT_ERROR;
    }
#endif

    // 如果数据速率为110kbps,需要特殊配置
    if(DWT_BR_110K == config->dataRate)
    {
        // 设置对应于110kbps的系统配置寄存器标志
        dw1000local.sysCFGreg |= SYS_CFG_RXM110K;
        // 调整lde_replicaCoeff值
        reg16 >>= 3;
    }
    else
    {
        // 清除110kbps的配置标志
        dw1000local.sysCFGreg &= (~SYS_CFG_RXM110K);
    }

    // 存储PHY头模式到本地变量
    dw1000local.longFrames = config->phrMode;

    // 设置PHY头模式相关的系统配置寄存器标志
    dw1000local.sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (config->phrMode << 16));

    // 写入系统配置寄存器
    dwt_write32bitreg(SYS_CFG_ID,dw1000local.sysCFGreg);
    // 设置LDE复制系数
    dwt_write16bitoffsetreg(LDE_IF_ID, LDE_REPC_OFFSET, reg16);

    // 调用内部函数配置LDE
    _dwt_configlde(prfIndex);

    // 根据选择的通道配置PLL2/RF PLL块
    dwt_writetodevice(FS_CTRL_ID, FS_PLLCFG_OFFSET, 5, &pll2_config[chan_idx[chan]][0]);

    // 配置接收RF块
    dwt_writetodevice(RF_CONF_ID, RF_RXCTRLH_OFFSET, 1, &rx_config[bw]);

    // 配置发射RF块
    dwt_write32bitoffsetreg(RF_CONF_ID, RF_TXCTRL_OFFSET, tx_config[chan_idx[chan]]);

    // 配置基带参数
    // 设置DTUNE0
    dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_TUNE0b_OFFSET, sftsh[config->dataRate][config->nsSFD]);

    // 设置DTUNE1
    dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_TUNE1a_OFFSET, dtune1[prfIndex]);

    // 根据数据速率和前导码长度配置DTUNE1b和相关寄存器
    if(config->dataRate == DWT_BR_110K)
    {
        // 配置特定于110kbps的DTUNE1b
        dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_TUNE1b_OFFSET, 0x64);
    }
    else
    {
        if(config->txPreambLength == DWT_PLEN_64)
        {
            // 配置特定于64长度前导码的DTUNE1b
            dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_TUNE1b_OFFSET, 0x10);
            dwt_writetodevice(DRX_CONF_ID, 0x26, 1, &temp);
        }
        else
        {
            // 配置其他前导码长度的DTUNE1b
            dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_TUNE1b_OFFSET, 0x20);
            dwt_writetodevice(DRX_CONF_ID, 0x26, 1, &temp);
        }
    }

    // 配置DTUNE2
    dwt_write32bitoffsetreg(DRX_CONF_ID, DRX_TUNE2_OFFSET, digital_bb_config[prfIndex][config->rxPAC]);

    // 配置DTUNE3(SFD超时),确保SFD超时始终启用
    if(config->sfdTO == 0)
    {
        config->sfdTO = DWT_SFDTOC_DEF;
    }
    dwt_write16bitoffsetreg(DRX_CONF_ID, DRX_SFDTOC_OFFSET, config->sfdTO);

    // 配置自动增益控制(AGC)参数
    dwt_write32bitoffsetreg(AGC_CFG_STS_ID, 0xC, agc_config.lo32);
    dwt_write16bitoffsetreg(AGC_CFG_STS_ID, 0x4, agc_config.target[prfIndex]);

    // 如果启用了非标准的SFD,设置用户SFD以提高性能
    if(config->nsSFD)
    {
        // 写入非标准SFD长度
        dwt_writetodevice(USR_SFD_ID,0x00,1,&dwnsSFDlen[config->dataRate]);
        nsSfd_result = 3;
        useDWnsSFD = 1;
    }
    // 配置通道控制寄存器,包括通道、PRF、SFD等设置
    regval =  (CHAN_CTRL_TX_CHAN_MASK & (chan << CHAN_CTRL_TX_CHAN_SHIFT)) |
              (CHAN_CTRL_RX_CHAN_MASK & (chan << CHAN_CTRL_RX_CHAN_SHIFT)) |
              (CHAN_CTRL_RXFPRF_MASK & (config->prf << CHAN_CTRL_RXFPRF_SHIFT)) |
              ((CHAN_CTRL_TNSSFD|CHAN_CTRL_RNSSFD) & (nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) |
              (CHAN_CTRL_DWSFD & (useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) |
              (CHAN_CTRL_TX_PCOD_MASK & (config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) |
              (CHAN_CTRL_RX_PCOD_MASK & (config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT));

    // 写入通道控制寄存器
    dwt_write32bitreg(CHAN_CTRL_ID,regval);

    // 设置TX前导码大小和PRF
    // 设置TX测距位和数据速率
    dw1000local.txFCTRL = (config->txPreambLength | config->prf) << 16;
    // 始终设置测距位!!!
    dw1000local.txFCTRL |= (config->dataRate << TX_FCTRL_TXBR_SHFT) | TX_FCTRL_TR;
    // 写入TX帧控制寄存器
    dwt_write32bitoffsetreg(TX_FCTRL_ID,0,dw1000local.txFCTRL);

    // 配置成功完成,返回成功码
    return DWT_SUCCESS;

} // 结束 dwt_configure()

这段代码是一个函数 dwt_configure(dwt_config_t *config) 的实现,显然是用于配置一个无线通信设备,很可能是一个 UWB (Ultra-Wideband) 设备,如 Decawave 的 DW1000。代码中的注释使用中文,提供了对代码块的基本解释。我会详细解释每个部分的功能和作用。

函数定义
  • int dwt_configure(dwt_config_t *config): 定义了一个函数,它接受一个指向 dwt_config_t 类型的指针,返回一个整数。这种设计常用于配置函数,其中返回值通常表示配置成功或错误代码。
局部变量定义
  • 定义了一系列局部变量,用于存储配置参数和中间计算结果。
参数检查
  • #ifdef DWT_API_ERROR_CHECK: 这部分代码在编译时决定是否包含参数检查。这是一种常见的做法,用于调试或确保输入参数的有效性。
  • 检查数据速率、脉冲重复频率 (PRF)、前导码 (PAC) 大小和通道号是否在有效范围内,不在则返回错误。
配置特定参数
  • 根据数据速率、通道等配置特定参数,如系统配置寄存器、PHY头模式、前导码长度等。
  • 对于不同的数据速率(如 110kbps),有特殊的配置逻辑。
写入配置到设备寄存器
  • 使用 dwt_write* 函数将配置写入设备的不同寄存器。这些函数可能是专门用于与硬件通信的低级函数。
  • 涉及多个配置方面,如系统配置、LDE复制系数、PLL配置、RF配置、基带配置、自动增益控制 (AGC) 参数等。
结束
  • 最后返回 DWT_SUCCESS,表明配置过程成功完成。
总结

这段代码是一个典型的硬件配置函数,用于设置特定硬件(如 UWB 设备)的多个参数。代码结构清晰,包含了参数检查、条件配置、硬件寄存器操作等多个方面。通过这种方式,可以灵活地根据输入参数调整硬件行为,以适应不同的使用场景和性能要求。

你可能感兴趣的:(网络,UWB,物理层,stm32,嵌入式硬件,单片机)