CC1100 CCA(2)

用了两个多月的CC1100,一直只是简单的收发函数,没有用到它比较先进的功能。摸索了好几天,终于把这个CCA功能实现了。为下一步CSMA做准备。
      在网上找了相关的资料,只有一篇有关这方面的,“Dian团队嘉铭标记机软件组Blog ”的一篇《CCA功能验证过程》,经过研究,发现其中有些小错误,而且细节部分没有交代清楚。在此把我的心得体会与大家分享。
一、CS功能验证
      CC1100有载波监听(Carrier Sensor)的功能,可以用来检测空气中是否有相同频率的载波存在。其验证过程如下:
1、开启CS功能
     设置IOCFG2.GDO2_CFG=0x0E,此时GDO2的功能为“Carrier sense.High if RSSI level is above threshold.”,即当空气中相同频率的信号强度大于一定值时,GDO2被置高。在此选择CS Absolute Threshold,即RSSI门限为一绝对值而非相对值。设置AGCCTRL1寄存器的值为0x40。
2.设置RSSI门限
      根据cc1100 datasheet P39 页描述,RSSI绝对门限和以下四个参数有关:
      AGCCTRL2.MAX_LNA_GAIN
      AGCCTRL2.MAX_DVGA_GAIN
      AGCCTRL1.CARRIER_SENSE_ABS_THR
      AGCCTRL2.MAGN_TARGET
       并给出了868MHz下不同AGCCTRL2.MAX_LNA_GAIN和AGCCTRL2.MAX_DVGA_GAIN值下RSSI的门限值。经过实际测试发现,若RSSI门限值太小,则容易将空气中的干扰信号错认为载波信号,此时可以相应地增大AGCCTRL2.MAX_LNA_GAIN和AGCCTRL2.MAX_DVGA_GAIN的值。
3.让单片机一直检测GDO2的值,同时把GDO2的状态反应到LED上。
      以上步骤完成后,可以进行CS功能的检测。让另一个cc1100模块连续发送载波信号,方法是先清空TXFIFO,然后发送命令滤波STX<参见CC1100 datasheet P32 最后一句>。
      执行程序,发现GDO2的值一直为0,经过实验发现,只有当前处于RX模式时,CS功能才有效,所以在之前加入一句:halSpiStrobe(CCxxx0_SRX);   //进入接收状态
      此时,再执行程序,当关掉CC1100的电源时,DGO2为0,打开时,DGO2为1。CS功能验证完毕。

二、CCA功能验证
      CCA功能是建立在CS功能之上的,故先按照之前的步骤设置好CS有关的寄存器。
1.开启CCA功能
       主要是设置MCSM1寄存器,设置MCSM1.CCA_MODE=11,即RSSI below threshold and
not currently receiving a packet。设置RXOFF_MODE为Stay in RX,TXOFF_MODE为RX, 就是让TX和RX结束后,芯片都保持在RX状态。
2.根据CC1100 datasheet P40页的描述,只有当前处于RX状态时,CCA功能才有效。此时若满足clear chanel的要求,则STX命令能够成功。
3.验证
       使用halSpiStrobe(CCxxx0_SRX); 使CC1100首先进入RX状态,然后发布STX命令,间隔至少809us后(从IDLE进入TX不是即时的,而是至少需要809us的时间),读取芯片状态,若成功进入发送状态,则让LED闪烁200ms。
      当有另一模块连续发送载波时,LED不闪烁,说明STX命令无效。关掉该模块电源,LED闪烁,成功进入TX状态。
4.注意:在每次发布STX命令,读取芯片状态之后要执行清TXFIFO命令,否则当打开发送载波模块再关闭后,CC1100无法进入TX状态,原因是TXFIFO出现underflow事件。

你可能感兴趣的:(RFID,CC1100)