微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 关于CCA的一些疑问

关于CCA的一些疑问

时间:10-02 整理:3721RD 点击:

小弟初学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检测的话,值还是先前接收数据的值。

是发生成功了,但是无线发送端发送出去了并不代表接收端能够收到。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top