ZHDU116G January 2018 – June 2024 CC1312PSIP , CC1312R , CC1352P , CC1352R , CC2642R , CC2642R-Q1 , CC2652P , CC2652PSIP , CC2652R , CC2652RB , CC2652RSIP , CC2662R-Q1
在主器件或从器件操作开始时,无线电 CPU 应等待启动触发条件。然后,它应根据命令结构的通道参数来编程频率。通道参数不允许设为 37、38 或 39,因为它们不是数据通道。对于低功耗 Bluetooth 5 命令,还应设置 phyMode.mainMode 中给出的 PHY 模式。无线电 CPU 应设置 pParams->accessAddress 中定义的访问地址,并应使用 pParams->crcInit 中定义的 CRC 初始化值。应按照白化参数中的定义设置白化器。然后,无线电 CPU 应配置接收器或传输器。该操作交替进行接收与发送,直至满足某个命令结束条件为止。
当解调器在一条消息上获得同步时,该消息将接收到第一个能够容纳该数据包的可用 RX 缓冲区中。标志 bCrcErr 和 bIgnore 根据表 26-128 进行设置,具体取决于 CRC 结果以及标头中的 SN 字段是否与上次成功接收的数据包的 SN 字段相同。有效载荷长度为 0 的已接收数据包应视为空包,这意味着如果 pParams->rxConfig.bAutoflushEmpty 为 1 且 bCrcErr 和 bIgnore 均为 0,则该数据包将从 RX 缓冲区中被移除。
| CRC 结果 | SN 与前一个不同 | bCrcErr | bIgnore |
|---|---|---|---|
| OK | 是 | 0 | 0 |
| OK | 否 | 0 | 1 |
| NOK | X | 1 | 0 |
如果没有可用的 RX 缓冲区具有足够空间存放收到的数据包,则收到的数据应被丢弃。但是,仍应接收该数据包以便检查 CRC。当数据包收到时,无线电 CPU 应设置序列位,以请求重传丢失的数据包(即 NACK),除非该数据包因 pParams->rxConfig 的设置无论如何都会从 RX 队列中丢弃。
根据低功耗 Bluetooth 规范的要求,如果收到的连续两个数据包都出现 CRC 错误,则命令应结束。
当需要传输或重新传输数据包时,将从 TX 队列中的当前数据条目中读取,除非 TX 队列为空或必须重新发送一个自动空包。无线电 CPU 应按如下方式创建标头。
有许多中断可以在不同的条件下引发。pOutput 结构包含与这些中断对应的多个计数器。表 26-129 列出了递增每个计数器或引发中断的条件。在传输或接收数据包后,可能会满足不止一个条件。在条件列表中,术语确认用于定义成功接收的数据包,其标头中的 NESN 值与上次传输的数据包的 SN 值不同。
| 条件 | 递增的计数器 | 产生的中断 |
|---|---|---|
| 传输了数据包 | nTx | Tx_Done |
| 传输了数据包且收到确认 | nTxAck | Tx_Ack |
| 传输了 LLID = 11b 的数据包 | nTxCtrl | Tx_Ctrl |
| 传输了 LLID = 11b 的数据包且收到确认 | nTxCtrlAck | Tx_Ctrl_Ack |
| 传输了 LLID = 11b 的数据包,收到确认,并且已发送确认 | nTxCtrlAckAck | Tx_Ctrl_Ack_Ack |
| 传输了数据包且其 SN 与前一个已传输数据包相同 | nTxRetrans | Tx_Retrans |
| 传输了带有效载荷的数据包且收到确认 | nTxEntryDone | Tx_Entry_Done |
| 收到 bCrcErr = 0、bIgnore = 0 且有效载荷长度 > 0 的数据包 | nRxOk | Rx_Ok |
| 收到存在 CRC 错误 (bCrcErr = 1) 的数据包 | nRxNok | Rx_Nok |
| 收到 bCrcErr = 0 且 bIgnore = 1 的数据包 | nRxIgnored | Rx_Ignored |
| 收到 bCrcErr = 0、bIgnore = 0 且有效载荷长度 = 0 的数据包 | nRxEmpty | Rx_Empty |
| 收到 LLID = 11b、bCrcErr = 0 且 bIgnore = 0 的数据包 | nRxCtrl | Rx_Ctrl |
| 收到 LLID = 11b、bCrcErr = 0 且 bIgnore = 0 的数据包,并且已发送确认 | nRxCtrlAck | Rx_Ctrl_Ack |
| 收到的数据包无法放入 RX 缓冲区且不应被清除 | nRxBufFull | Rx_Buf_Full |
| RX 队列中的第一个 RX 数据条目将状态更改为“已完成” | — | Rx_Entry_Done |
无线电 CPU 应维护两个计数器:一个数据包计数器 nPkt 和一个 NACK 计数器 nNack。在主器件或从器件无线电操作开始时,两个计数器应分别初始化为 pParams->maxPkt 和 pParams->maxNack。每次传输数据包时,数据包计数器 nPkt 都应递减。如果收到的数据包不包含对上次传输的数据包的确认,则 NACK 计数器 nNack 应递减;否则,如果收到确认,应重置为 pParams->maxNack。如果任一计数器计数到 0,则操作应结束。对于主器件,该操作应在收到一个数据包后发生;对于从器件,应在传输一个数据包后发生。将 pParams->maxPkt 或 pParams->maxNack 设置为 0 将禁用相应的计数器功能。
结束操作的触发条件由 pParams->endTrigger 和 pParams->endTime 设置。如果该参数定义的触发条件发生,无线电操作应尽快结束。无线电操作结束后,任何传输的数据包的 MD 位都应为 0,并且对于从器件,连接事件应在发送下一个数据包后结束;对于主器件,则在收到下一个数据包后结束。如果无线电 CPU 收到即时命令 CMD_STOP,其含义与发生结束触发条件时相同(但结束后,状态代码应为 CMD_DONE_STOPPED)。对于从器件命令,pParams->endTrigger.triggerType 可取值为 BLE_TRIG_REL_SYNC,即 15。此值表示 pParams->endTime 相对于第一个收到的数据包的时间戳。如果没有收到数据包,则结束触发条件不会发生(应使用超时触发条件来处理这种情况)。
寄存器 pParams->seqStat 包含一些位,这些位应由无线电 CPU 在操作期间更新,并应被用于确保 SN、NESN 和重新发送操作的正确性。无线电 CPU 必须遵循的规则如下:
当按照前述列表引发中断时,对应的计数器(如表 26-129 所示)应递增。
在传输的数据包的标头中,应根据以下规则设置 MD 位:
pOutput 结构包含计数器,无线电 CPU 应按照前述列表以及表 26-129 对这些计数器进行更新。无线电 CPU 不会初始化这些字段,因此当需要复位计数器时,必须由系统 CPU 完成此操作。除计数器外,无线电 CPU 还应设置以下字段:
为确保正确操作,命令开始时的 pParams->seqStat 值应与同一连接的上一个操作结束时的值相同。在同一连接上运行的命令之间,TX 队列也应保持不变(只能向队列附加数据包)。