danpianjibb 发表于 2012-12-27 14:40:34

cc1101 rxfifo_overfow

验证CCA功能时:接收端运行一段时间后,读出的寄存器状态为:0x11,对应结果是 rxfifo_overfow。此时读出的接收字节数十65,大于64,好像确实溢出了。可是没接收数据啊???
一个发送载波又没有没有数据,怎么可能接收端数据溢出呢??

还有一个问题:发送载波的那个,发送一段时间后,就不发了。不知道为什么。

所有的测试按照下面的顺序来的。








一、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事件。

danpianjibb 发表于 2012-12-27 14:41:16

{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}

as280711261 发表于 2013-5-6 07:20:18

{:lol:}mark
页: [1]
查看完整版本: cc1101 rxfifo_overfow