您好!
我在 CC1101接收超大数据包时遇到问题、因此我已经实现了一个代码、应该是这样
被照顾的人。 显示面板(用户界面)在两端使用 CC1101与控制单元进行通信。
显示面板使用 RTOS、其中 GDO0定期轮询在自己的任务中完成。 当 SW 检测到新的射频数据包时
接收到(RTOS_CHECKNewPacket 函 数)时、它会命令芯片空闲、然后通过首先检查数据包的长度来处理它(CC_DataReady 函数)。 如果数据包大于60字节(超大数据包)、则 FIFO 中的字节
仍在本地 RAM 阵列中读取、无线电设置为空闲、Rx 和 TX FIFO 均被清空、并循环为无线电芯片供电(Vdd)。 电流
无线电经过初始化和校准、并设置为 RX。 当接收到一个大小正确的数据包时、一个数据包从 FIFO 读取到本地 RAM 阵列。
读取数据后、对讲机被检查为处于空闲状态、然后清空 RX FIFO。 冲洗后、FIFO 大小被检查为零。
否则、芯片将设置为空闲、FIFO 将再次清空。 在接收功能结束时、芯片被设定为 RX。 问题是我的代码是否已正确实现?
尤其是 RX FIFO 刷写? 在我的实现中、命令之间是否需要任何延迟? 是否有报告称 RX FIFO 的刷新失败?
当多个并行显示/控制单元在同一射频范围内进行通信时、我将偶尔在 FIFO 中获得超过60字节的数据包、并且我必须为无线电提供一个功率循环。
使用较少的并行系统、我将得到更少的超大数据包。
我已经读出、CRC 正常时、读取 FIFO 就足够了、FIFO 清空也不是强制性的。 我是对的吗? 显示单元还有 USB 记忆棒、RTOS 在空闲任务中运行。
软件会定期轮询 USB 记忆棒以查看是否已连接。 有时甚至将 USB 记忆棒插入 HW 也会在 RX FIFO 中生成超大的数据包、但并非总是如此。
感谢您的帮助!
此致、
Mikko
以下是我的代码:
轮询新数据包:
静态空 RTOS_checkNewPacket (空)
{
if (get_GD0 ())
{
cc_enter_idle();//在读取 RX FIFO 之前将 CC1101设置为空闲,并拒绝新的数据包
CC_WriteStrobe (CC_SNOP);//写入 NOP 以获得正确的 CC1101状态
cc_DataReady();//从 RX FIFO 读取数据包
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
新数据包的处理:
空 CC_DataReady (空)
{
taskENTER_critical ();
uint8_t FifoSize = CC_ReadRegister (CC_RXBYTES);//!读取数据包长度
IF (FifoSize > 60)
{
CC_ReadRX (&CC.RX_PktArray[0]、FifoSize);//! 读取所有数据
taskEXIT_critical ();
RFNW_PowercycleRadio();
返回;
}
如果(FifoSize >0)则为其他值
{//!如果接收到数据...
CC_ReadRX (&CC.RX_PktArray[0]、FifoSize);//! 读取所有数据
CC.RSSI = CC_ConvRSSI (CC.RX_PktArray[FifoSize - 2]);//! 获取此接收的 RSSI 值
cc.RX_len = FifoSize;//!Store data length for future use
irqFixTaskSted.CC_RX = true;//! 新数据包已获取、稍后处理;
}
否则{
cc.RX_len = 0;
}
CC_GET_STATE ();//Get Radio 状态
while (CC.State!= CC_STB_IDLE)//在刷新 RX FIFO 之前确保 CC1101处于空闲状态
cc_flush_RX_FIFO ();//刷新 RX FIFO
CC_WriteStrobe (CC_SNOP);//在进入 RX 状态之前写入 NOP (只是为了产生一些延迟)
FifoSize = CC_ReadRegister (CC_RXBYTES);//!读取数据包长度
if (FifoSize){
cc_enter_idle();
CC_WriteStrobe (CC_SNOP);//保持短延迟以从 CC1101获得正确的状态
CC_GET_STATE ();//Get Radio 状态
while (CC.State!= CC_STB_IDLE)//在刷新 RX FIFO 之前确保 CC1101处于空闲状态
cc_flush_RX_FIFO ();//刷新 RX FIFO
}
CC_ENTER_RX ();//!重新进入 RX
taskEXIT_critical ();
}