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事件。
{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:}{:handshake:} {:lol:}mark
页:
[1]