关于CCA的一些疑问
小弟初学cc2530,有些地方搞的不太懂
我用的ISTXONCCA立即选通指令,测出FSMSTAT1寄存器的值是0x0A,查了一下数据手册,CCA为0,SAMPLED_CCA为1,TX_ACTIVE为1,表示CCA通过。但是读取了RSSI寄存器的值是0x80,数据手册上说这是无效值。所以我想问,CCA算通过了吗。
如果去掉ISTXONCCA指令,FSMSTAT1的值是0x15,RSSI是0x1e。请问读取的RSSI寄存器值如何转成dB的形式。
最后,最关键的就是我用了while(!(RFIRQF1 & 0x02) ); 语句来检测发送中断,该语句通过了表示产生了Tx中断。是不是表示成功发送了数据。那么为什么我用A,B节点同时给C发送数据,A,B都产生发送中断,而C只能接收到1个(如果A,B不是同时发,有细微时间差,C就能接收到两个),这是否表示发生了冲突,如果发生冲突,为什么CCA却一直显示信道空闲呢?有没有可能是接收端错误
附上发送数据部分的源代码
void rfsend(UINT8* pData,UINT8 length)
{
UINT8 i;
UINT8 s;
RFIRQF1&=~0x02;
ISRFOFF;
ISFLUSHRX;
ISFLUSHRX;
RFIRQF0 = ~0x02;
RFIRQF1 &= ~0x01;
ISFLUSHTX; // Making sure that the TX FIFO is empty.
CCACTRL0=0xF8;
CCACTRL1=0x0A;
RFD = length + 2;
// Inserting data
for(i=0;i<length;i++){
RFD = *(pData+i);
}
UINT8 ccaRetries=4;
while(1)
{
ISRXON;
while(!(RSSISTAT & 0x01));//等待RSSI稳定
s=EA;
EA=0;
ISTXONCCA;
if(FSMSTAT1 & 0x02)
{
//确认发送完成
break;
}
else
{
if (ccaRetries == 0)
{
break;
}
else
{
ccaRetries--;
//关闭Rx模式
// RFIM &= ~0x20;
ISRFOFF;
ISFLUSHRX;
ISFLUSHRX;
// RFIF = ~0x20;
//退避
}
}
}
while(!(RFIRQF1 & 0x02) ); // 等待发送完成
RFIRQF1&=~0x02;
ISRXON;
}
希望能指出错误,不甚感激
ISTXONCCA开启CCA检测以后,应该还需要对CCA的检测结果进行判断,是否可以正常发送
应该FSMSTAT1 & 0x08吧?
如果只有两个节点是同一时刻的话,都没有发送前检测信道空闲,所以同一时刻发送造成丢包的可能是存在的,一般情况下同一时刻发送不太可能,肯定会有时间上的差异的
首先感谢您的回答 FSMSTAT1 & 0x02我是根据simpliciTi协议的Transmit函数跟踪后得到的。 第二句话的意思是即使使用了csma机制,如果两个节点再同一时刻发送,还是可能存在丢包的现象吗? 我还想追问一个问题,当两节点发生碰撞的时候,是指有一个节点数据包发送不出去还是指两数据包都能发送出去,只是接收端没有办法接收2个数据包。也就是说出现丢包的情况怎么验证问题出在发送端还是接收端,CC2530有这个机制吗。
你可以再确认下simpliciTI里的代码。
对的,如果确实是同一时刻的话是有可能的,但是csma在检测信道的时候会检测一段时间的,然后判断信道是否空闲。
碰撞时,两种情况都有可能,但后者居多,你可以用抓包工具捕获空中的所有数据包,就知道有没有发出去还是有没有收到了
好的,谢谢了
我把simpliciTi的代码移植出来后还存在冲突,我怀疑和CCA检测不准确有关,因为我读取RSSI值的时候总是0x80,数据手册上说是无效值。只要用了ISTXONCCA,RSSI就是0x80,否则是0x1e,请问这个情况是怎样造成的。
还有就是RFIRQF1的第2位TXDONE为1并不能说明数据发送成功对吧,如果在没有抓包工具的情况下,能够通过这个寄存器判断发送成功与否吗?
CCA的检测是在打开接收状态下完成的
你先需要把接收打开 RFST = ISRXON;,执行命令的。
产生0x80的原因,是因为你要进行CCA检测了,所以把之前接收数据时留下RSSI清了。所以如果没有CCA检测的话,值还是先前接收数据的值。
是发生成功了,但是无线发送端发送出去了并不代表接收端能够收到。