请选择 进入手机版 | 继续访问电脑版
查看: 792|回复: 0

[技术交流] RF模块之CS和CCA比较

[复制链接]

74

主题

169

帖子

573

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
573
发表于 2022-10-17 09:40:11 | 显示全部楼层 |阅读模式
  背景

  CS(载波监听)和CCA(空闲信道评估)都是用来评估当前信道的使用情况的,而且都是以实时的RSSI值和预先设定好的参考阈值为参考的。当CS选择为以绝对信号强度为参考时(相对于以相对信号强度参考来说),设定CS信号当RSSI值高于设定阈值时置位(表示有载波),低于阈值时复位(表示无载波),CCA信号当RSSI值低于设定阈值时置位(表示信道空余),高于阈值时复位(表示信道被占用)。那么可知理论上CS和CCA在引脚上输出的电平是互补的,即CS为高时CCA为低,CS为低时CCA为高,而且应该是同时进行电平变化的,不应该出现有滞后的现象,本笔记就是测试CS和CCA信号在引脚上的输出在时域上的一些特性。测试CS和CCA那个反应的更加灵敏,以及这两个信号的变化情况是否和理论分析的相符合。

  过程

  一、术语说明和基本概念

  1、关于CCA

  CCA 的英文全称为Clear Channel Assessment,习惯翻译成空闲信道评估,也有翻译做空余(洁净)信道检测。CCA主要用来评估当前信道的质量的,就是想知道当前信道的被占用的情况或者被干扰的情况。把这个情况都统计好,就可以决定当前信道是否可用。CCA主要用于发送前的信道检测,看看当前信道是否空余,如果空余就发送信息,如果信道忙,就继续检测,直到信道空余后再发送数据,这个应用主要用在要发送数据之前。

  空闲信道评估 (CCA) 用于表明当前信道是空闲还是忙碌。通过设置IOCFGx.GDOx_CFG = 0x09 ,可在所有 GDO 引脚上看到当前 CCA 状态。确定 CCA 时,MCSM1.CCA_MODE 选用该模式。CC1100E 处于 RX 状态下,当发出 STX 或 SFSTXON 指令选通脉冲时,只有满足空闲信道要求的情况下才会进入 TX 或 FSTXON 状态。否则,芯片就会保持 RX 状态不变。如果随后信道可用,那么在通过 SPI 发送一条新的指令选通脉冲以前该无线电设备都不会进入 TX 或 FSTXON 状态。这种特性被称为“TX-if-CCA”。可对 4 种 CCA 要求进行如下编程:
  1、总是保持一种模式(CCA 关闭,总是进入 TX)
  2、若 RSSI 低于阈值
  3、除非当前接收一个数据包
  4、上述二者(RSSI 低于阈值,当前没有接收一个数据包)

  2、关于波特率

  Baud(波特,信号传输速度的一种单位,等于每秒内离散状态或信号事件的数量。例如,1波特在二进制 信号序列中等于每秒1比特;在八种不同状态中任选一种状态的信号序列中等于每秒1个3位值。异步传输中调制速率的单位,相当于每秒一个单位间隔。也就是说,如果单位间隔的宽度 是20毫秒,则调制速率是50波特。)

  3、关于dBm

  dBm(分贝毫瓦简写为dBm或dBmW,是一个表示绝对功率的量。其计算公式为 x = 10lg(P/1mW),用dB表达测量功率与1mW的比值。由于dBm可以方便的表示从很小的功率(如-100dBm = 0.1pW)到很大功率(如90dBm = 1MW)范围内的所有功率,因此它常被用于无线电,微波和光缆通讯中。0dBm = 1mW ,每增加3dBm表示功率翻倍,同理,每减少3dBm表示测量功率减半。 相关公式为:x = 10lg(P/1mW) = 10lg(1000P) = 10lgP + 10lg1000 = 10lgP + 30 ;功率翻倍:x’ = 10lg(2P/1mW) = 10lgP + 30 + 10lg2 = (10lgP + 30) + 3 ;功率减半:x’’ = 10lg((1/2)P/1mW) = 10lgP + 30 - 10lg2 = (10lgP + 30) - 3)【注:log是以任何数为底,lg是以10为底,ln是以e为底】

  4、关于CS

  CS 的英文全称为Carrier Sense,译为载波监听。载波监听 (CS) 可用作一个同步字限定符,也可用于空闲信道评估。基于下面 2种能够单独调节的条件便可判断 CS 是否有效:

  当 RSSI 大于可编程绝对阈值时 CS 有效,而 RSSI 小于该可编程绝对阈值(有滞后)时则 CS 无效。

  在 RSSI 采样值从一个到下一个采样值过程中 RSSI 增加可编程 dB 数时置位 CS;在 RSSI 降低至相同的 dB 数时则取消 CS。该设置不依赖于绝对信号电平,因此,在具有时变噪声底限的环境中对检测信号十分有用。载波监听可用作一个同步字限定符,该限定符要求信号电平要高于能允许同步字搜索进行的阈值,并且通过设置 MDMCFG2 来设定该阈值。将IOCFGx.GDOx_CFG 设置为 14,便可在其中的一个 GDO 引脚上和状态寄存器位PKTSTATUS.CS 中观测到该载波监听信号。载波监听的其它用途包括 TX-if-CCA 功能和可选快速 RX 终止。CS 可用于避免 ISM 频带中其它 RF 源的干扰

  二、系统概述

  1、概  述

  CCA以CS(载波监听)为基础,在启动相关功能后,每做一次载波监听就会在某个引脚或者某个寄存器的某一位上反映出来CCA的结果(表现就是某个寄存器的某一位置位或者复位,或者是某个引脚变成高电平或者变成低电平,其含义就是本次CCA的结果是当前信道被占用或者没被占用,或者说当前信道的当时的信号强度是否在门限阈值之下)。同样CS结果也可以从GSOx引脚上反应出来。 本测试主要通过示波器捕捉反应在GDO0引脚上输出的CS的信号和在GDO2引脚上输出的CCA信号,并且观察它们在时域上的变化情况。

  2、引脚上的CS和CCA信号变化的测试现象
  在本应用中,需要双机通信,主机不断的重复如下循环:
  进入IDLE状态;à延时2毫秒;à进入TX状态;à延时2毫秒;
  从机进入RX状态后,进入while(1)循环,该while(1)循环里没有任何语句。
  从机把GDO0配置为CS输出,把GDO2配置成CCA输出。
  然后把示波器的ch1和ch2的测试探头接到GDO0和GDO2上。
  示波器上:黄色曲线=CH1=GDO2=CCA,蓝色曲线=CH2=GDO2=CS

  在示波器上就会看到CS信号周期性的反转,CCA信号也周期性的反转,但是CS信号和CCA信号总是不会同时为高也不会同时为低。当CS变高时时,CCA变低;当CS变低时,CCA变高。

  3、示波器观测结果

  以下部分为示波器观察到的图像的屏幕截图:
  如上图所示,是在每个横坐标的大格代表2.50ms的状态下的检测到的CS信号(蓝)和CCA信号(黄)的变化情况。可以看到在这样波形放大倍数较低的情况下,CS信号和CCA信号基本是有互异的态势的,就是说CS信号(蓝)变高则CCA信号(黄)变低,CS信号(蓝)变低则CCA信号(黄)变高。但是在信号反转过程中那个信号先变那个信号后变,还要在更大的波形放大倍数下仔细观察。
  如上图所示,是在每个横坐标的大格代表500us的状态下的检测到的CS信号(蓝)和CCA信号(黄)的变化情况。可以看到在这样波形放大倍数稍大的情况下,CS信号和CCA信号也是有互异的态势的,就是说CS信号(蓝)变高则CCA信号(黄)变低,CS信号(蓝)变低则CCA信号(黄)变高。信号反转过程中那个信号先变那个信号后变,还要在更大的波形放大倍数下仔细观察。
  如上图所示,是在每个横坐标的大格代表500us的状态下的检测到的CS信号(蓝)和CCA信号(黄)的变化情况。可以看到在这样波形放大倍数稍大的情况下,CS信号和CCA信号也是有互异的态势的,就是说CS信号(蓝)变高则CCA信号(黄)变低,CS信号(蓝)变低则CCA信号(黄)变高。信号反转过程中那个信号先变那个信号后变,还要在更大的波形放大倍数下仔细观察。
  通过对比可以发现反向后的CCA信号和CS信号重合度很好。

  结论:由以上现象可以初步得到结论,CS和CCA的信号产生可以认为是同时的,在示波器可捕捉到的时限内可认为反应灵速度是相同的。

  三、关于测试代码

  1、程 序

  关于文件:

  工程中主要包括如下文件(附带说明):
  (1)main.c文件
  本文件为该工程的主函数文件。
  (2)CC1100-CC2500.c文件
  本文件功能是CC1100/CC2500编程,包括初始化设定调用,发送数据包和接收数据包
  (3)CC_spi.c文件
  本文件功能是实现MSP430单片机通过SPI总线读写CC1100/CC2500的寄存器
  (4)CC1100-CC2500.h文件
  本文件功能是为CC1100-CC2500.c声明函数
  (5)include.h文件
  本文件列出其他包含文件的高级包含文件
  (6)CC_CC1000-CC2500.h文件
  本文件详细定义CC1100/2500芯片, 包括寄存器位置和使用这些寄存器的常用值
  (7)CC_hardware_board.h文件
  本文件除了端口是特定为实验板配置的其他的定义和使用底板的特殊宏定义; 这是MSP430和CC1100/2500之间的连接,比如GDO引脚。SPI 接口没有在这里定义因为他们已经在CC_MSP430.h里定义过了。这个文件定义一般板级接口(需要改成本模块的实际引脚配置)
  (8)CC_msp430.h文件
  本文件MSP430芯片的特定宏定义;主要的是SPI接口的引脚使用。包括USART0/1, USCI_A0/1/2/3,USCI_B0/1/2/3,USI和bit-banging的宏定义。另外,labels被定义用来做RF_SER_INTF系统变量使用。这用来为CCxxxx SPI 接口选择使用
  (9)CC_spi.h文件
  本文件功能是为CC_spi.c声明函数
  (10)LCD.h文件
  本文件功能是为LCD.c声明函数
  (10)LCD.c文件
  本文件功能是为LCD液晶的各种驱动函数
  (11)TEST_CS_and_CCA.c
  本文件功能是为CS和CCA的一些初始化函数
  (12)TEST_CS_and_CCA.h
  本文件功能是为TEST_CS_and_CCA.c声明函数

  关于在主机主函数中调用到的一些函数:
  void TI_CC_SPISetup(void)函数
  主要用来完成MSP430F2132单片机的串口的配置,包括串口工作在4线SPI方式,串口的时钟来源等。
  TI_CC_PowerupResetCCxxxx()函数
  主要用来复位CCxxxx芯片
  writeRFSettings()函数
  主要用来写入配置寄存器RF设置,
  TI_CC_SPIWriteBurstReg()函数
  主要用来完成CCxxxx的功率配置Write PATABLE
  TI_CC_SPIStrobe()函数
  主要用来发送各种选通脉冲命令
  RFSendPacket()函数
  主要用来发送数据包,固定数据包和可变数据包都可以用这个函数发送
  前面带LCD标识的函数
  比如LCDShowMessage();这样以LCD开头的函数都是LCD显示的驱动函数

  2、一些CS和CCA的相关配置

  关于CCA的配置

  在使用CCA的过程中建议把可能影响到CCA的中断全部关闭,比如和GDOx有关的中断(当然定时器之类的中断是可以适当打开的),如果有可能的话推闭全局中断是更好的选择。比如在void RFCCAInit(void)和void RFCCAEnable(void)中就有禁止中断的一些语句。

  void RFCCAInit(void)
  {
      TI_CC_GDO0_PxIE  &= ~TI_CC_GDO0_PIN;         //禁止GDO0中断
      TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);            //退出RX/TX状态
      TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 ,   0x00); //
      TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0xFE); //配置门限值
      TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x40); //配置门限值
      TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2,   0x09); //GDO2 output pin config.RSSI值低于门限值输出高电平
  }

  void RFCCAEnable(void)
  {
     TI_CC_GDO2_PxIE  &= ~TI_CC_GDO2_PIN;          //禁止GDO2中断
     TI_CC_GDO0_PxIE  &= ~TI_CC_GDO0_PIN;          //禁止GDO0中断
     TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);             //退出RX/TX状态
     TI_CC_SPIStrobe(TI_CCxxx0_SFRX);              //手动清空RX FIFO        
     TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 , 0x1C);    //
     TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2, 0x09);    //配置GDO2工作方式
     TI_CC_SPIStrobe(TI_CCxxx0_SRX);               //进入RX模式
  }

  另外需要注意在修改配置寄存器时要先进入IDLE状态,比如在void RFCCAInit(void)和void RFCCAEnable(void)中在修改CCxxxx的配置寄存器之前都有一句TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);因为在本应用中想用GDO2映射出CCA的结果,所以要配置一下IOCFG2配置寄存器,本方案配置成了0x09,其具体含义如下图
  “空闲信道评估时RSSI 电平低于阈值时为高(取决于当前 CCA_MODE 设置)”。

  关于GDOx引脚功能的其他配置详情,要了解更多请看\参考资料\关于CC1100E\文件夹里的cc1100e.pdf文件的 第 55 页 我们还可知道在配置成0x09之后还要配置CCA_MODE,它的位置在MCSM1配置寄存器的[5:4]位上,其具体含义如下图所示,要了解更多请看cc1100e.pdf文件的 第 74 页
  在 void RFCCAInit(void) 函数中先配置成了0x00,在void RFCCAEnable(void)中又配置成了0x1C,变成2进制就是 00011100(二进制),第[5:4]位的值为01(二进制),所以其含义就是“若RSSI在阈值之下”,另外如果要使用CCA的话在配置MCSM1时还要注意如下图中所示:
  使用CCA时不能将RXOFF_MODE配置成TX或FSTXON,就是说MCSM1的[3:2]两位不能配置成01或者10,本方案配置成了11即RX之后自动进入RX模式。
  使用将TXOFF_MODE= MCSM1的[1:0]配置成00(二进制),就是本方案配置成了TX之后自动进入IDLE模式。

  上面有个加粗了的绿色的词,叫阈值,下面就说说这个阈值的问题

  参考的阈值主要设置如下四个寄存器,这四个配置寄存器一定要配置好(要了解更多请看cc1100e.pdf文件的 第 78-79 页 )
  AGCCTRL2.MAX_LNA_GAIN = AGCCTRL2[5:3]
  AGCCTRL2.MAX_DVGA_GAIN = AGCCTRL2[7:6]
  AGCCTRL1.CARRIER_SENSE_ABS_THR = AGCCTRL1[3:0]
  AGCCTRL2.MAGN_TARGET = AGCCTRL2[2:0]

  本方案在 void RFCCAInit(void)函数中有   
  TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0xFE);
  TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x40); 两句,那么可知
  AGCCTRL1 = 01000000(二进制)
  AGCCTRL2 = 11111110(二进制)

  所以可知:
  AGCCTRL2.MAX_LNA_GAIN = AGCCTRL2[5:3] = 111(二进制)
  AGCCTRL2.MAX_DVGA_GAIN = AGCCTRL2[7:6] = 11(二进制)
  AGCCTRL1.CARRIER_SENSE_ABS_THR = AGCCTRL1[3:0] = 0000(二进制)
  对于给定的AGCCTRL2.MAX_LNA_GAIN和AGCCTRL2.MAX_DVGA_GAIN设置而言,利用CARRIER_SENSE_ABS_THR可对该绝对阈值以1dB 步长进行±7dB 调节。如果给定信道频段和收发速率话,就会存在一个阈值关于AGCCTRL2.MAX_LNA_GAIN和AGCCTRL2.MAX_DVGA_GAIN设置相对应的表,类似于下图这样的表格(下图是针对955MHz频段,250kBaud下的表,如果用其他频段比如470MHz,或者其他收发速率比如38.4kBaud会有其他不同的表格)
  查表确定一个阈值后,在通过设置AGCCTRL1.CARRIER_SENSE_ABS_THR进行±7dB 的调节。

  AGCCTRL2.MAGN_TARGET = AGCCTRL2[2:0] = 110(二进制)—40dB
  MAGN_TARGET 设置是阻断容差/选择性和灵敏度之间的一个折衷。该值对进入解调器的信道中的理想信号电平进行设置。增加该值可降低阻断空间,从而提高灵敏度。强烈推荐使用 SmartRF® Studio [8] 来生成正确的 MAGN_TARGET 设置。

  关于CS的配置

  void RFCSInit(void)
  {
      TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);                      //退出RX/TX状态
      TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 ,   0x00);
      TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0xFE);
      TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x40);
  TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0,   0x0E);          // GDO0输出CS RSSI值高于
  //门限值输出高电平
  }
  void RFCSEnable(void)
  {
     TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);                      //退出RX/TX状态
     TI_CC_SPIStrobe(TI_CCxxx0_SFRX);                       //手动清空RX FIFO        
     TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 ,   0x1C);
     TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0,   0x0E);  
     TI_CC_SPIStrobe(TI_CCxxx0_SRX);
  }

  CS 初始化和CS使能函数中的大部分配置语句在前面已经说过,此处需要注意IOCFG0配置成 0x0E,表示把GDO0引脚作为CS输出。

  注意:CCA和CS要在RX状态下才能稳定的应用,所以在要使用CCA的时候一定要确认CCxxxx已经工作在RX模式下的。

  关于MCSM1的配置

  如果把从机MCSM1配置成0x10,那么在RX之后从机进入IDLE状态,如果不手动进入RX状态的话,CS和CCA都将只有一次有效,下图为主机周期性的给从机发送60字节的数据包,而从机MCSM1配置成0x10,且没有手动进入RX状态的示波器截图,可以看到从机的CCA(黄)和CS(蓝)只有一次有效,就始终为低电平(失效)。
  另外如果让从机周期性的进入RX,延时后再进入IDLE,然后再延时再进入RX,如此循环,而主机周期性的进入TX,延时后再进入IDLE,然后再延时再进入TX,如此循环,在从机段就会得到如下的示波器截图,可以看到CS(蓝)信号和CCA(黄)信号都被IDLE周期,打断成一个一个的脉冲,这样就不能做到随时都能取用CCA信号或者CS信号
  由于上述原因,建议MCSM1配置成0x1C,如果想进入IDLE状态时(或者想清除FIFO时),再手动发出进入IDLE状态的指令。

  结论

  CS是CCA的基础,但是核心都是检测当前信道的实时信号强度。主要作用都是为射频通信防止碰撞来服务的。

  附件为本文所对应的调试代码。
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表