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)参数。这些参数对无线通信的性能和可靠性至关重要。以下是各个参数的详细解释:
-
通道号(Channel number):
2
:指定DW1000设备使用的无线通信通道号为2。
-
脉冲重复频率(Pulse repetition frequency):
DWT_PRF_64M
:设置脉冲重复频率为64兆赫兹(MHz),这是发送脉冲信号的频率。
-
前导码长度(Preamble length):
DWT_PLEN_1024
:前导码长度设为1024,这是帧开始前发送的固定格式码序列的长度,用于帮助接收设备同步。
-
前导码获取块大小(Preamble acquisition chunk size):
DWT_PAC32
:在接收模式下,前导码获取块大小设置为32个时间单位。这是接收器用来锁定前导码的块大小。
-
发送前导码(TX preamble code):
9
:在发送时使用的前导码代码是9。
-
接收前导码(RX preamble code):
9
:在接收时使用的前导码代码也是9。
-
使用非标准SFD(Use non-standard SFD):
1
:表示使用非标准的帧起始分界符(SFD),这是标识帧开始的信号。标准值通常是0,这里设为1表示使用了一个自定义的SFD。
-
数据速率(Data rate):
DWT_BR_110K
:数据传输速率设为110千比特每秒(Kbps)。
-
物理层头模式(PHY header mode):
DWT_PHRMODE_STD
:物理层头模式设置为标准模式。
-
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 设备)的多个参数。代码结构清晰,包含了参数检查、条件配置、硬件寄存器操作等多个方面。通过这种方式,可以灵活地根据输入参数调整硬件行为,以适应不同的使用场景和性能要求。