【经验】应用技巧:如何轻松实现无线收发器硬件CRC校验?

2017-01-10 世强 刘云

【摘要】在数据传输过程中,差错总是不可避免,CRC校验是检查错误数据帧的方法之一。本文以变长包为例,分析了Si446x硬件CRC的设置。

在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的数据出现比特差错,从而使接收方接收到错误的数据。如何快速的检查出这些错误的数据帧?CRC校验是一个非常常用的办法。Silicon labs 公司提供的Si446x无线收发器支持硬件CRC校验,在WDS软件中点点鼠标就能快速完成CRC相关的设置,本文以变长包的范例,来做Si446x硬件CRC的设置。

CRC的基本配置步骤
1)打开WDS软件,选择empty工程,除CRC以外的参数按照实际应用配置好。
2)在WDS的“packet”选项卡中,变长包第一字节的长度连同数据部分一起计算CRC。如图1所示,长度字节部分只勾选CRC使能项“enable CRC over this field”。


图1:变长包长度字节计算CRC


如图2所示,设置好CRC计算因式和CRC seed,一般都是全1,如果有其他的特殊需求,请按照实际来设置。Field2数据部分勾选3个勾, “Transmit CRC at the end of this field”、 “check CRC at the end of this field ”、“enable CRC over this field”这样就把长度和数据一起计算了CRC。数据发送的时候会把CRC计算好并发送出去,接收端会收到这个CRC并完成校验。


图2:配置CRC设置


3)配置好了CRC设置,还需要把CRC的中断使能。如图3所示,在“Interrupt”选项卡中,勾选上CRCE,使能CRC中断。当发生CRC校验错误的时候,CRCE 这个位会被置1,同时Nirq引脚会从高电平变成低电平,及时的通知到MCU关于CRC的校验结果。


图3:使能CRC中断


4)在check TX RX的函数中添加CRC代码:

  if(Si446xCmd.GET_INT_STATUS.PH_PEND& SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT)
      {
        /* Packet RX */
        /* Get payload length */
        si446x_fifo_info(0x00);
        si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, &customRadioPacket[0]);
        return SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT;
      }
      //CRC 错误中断
      if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT)
      {
          /* Reset FIFO */
          si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_FIFO_RX_BIT);
        //如果需要重新接收数据,可在这里添加重新开启接收的代码。
        //主要视start RX函数里面的3个状态参数和实际应用来决定CRC中断之后需要做的事情
      }


除CRC基本配置以外,以下为扩展阅读。

从图4可以看出,B版本默认的CRC种子是全1,也就是FF。

但是C版本默认的CRC种子是全0。所以在配置C版本的芯片要和B版本通讯时,CRC的种子要设置为FF FF FF FF(全1)即可。


图4:B版本和C版本的CRC设置对比


C版本的正确配置如下:


图5:C版本的正确配置


当然,如果B版本配置的种子是全0,C版本的种子也要配置全0。其他的地方都可以不改,但是WDS中有以下几项会和CRC有关,请注意检查是否一致:


图6:WDS中和CRC的相关项设置

  • +1 赞(0)
  • 收藏

评论

登录   |    立即注册

提交评论

最新评论

暂无评论