当前位置: 代码迷 >> 单片机 >> CC1101接收部分
  详细解决方案

CC1101接收部分

热度:109   发布时间:2016-04-28 14:51:04.0
CC1101接收部分求助.
本帖最后由 libin55 于 2014-10-23 20:36:47 编辑
最近在学习CC1101,看了大半天数据手册有点眉头,就看了网上看了别人的配置程序。
在接收部分没看懂
 

INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)   
{
   INT8U  status[2];
    INT8U  packetLength;
     INT8U  i=leng*4;    //  具体多少要根据datarate 和length 来决定 
                                                                   **** (这里没看懂)***
     halSpi Strobe( CCxxx0_ SRX);     // 进入接收状态 
    delay(2);  
     while(GDO0)             
    {
delay(2);  
--i;
if(i<1)               //****(这个i一定要根据数据长度来定吗)****
return 0;      
     }
 

          **下面这句判断语句没看懂,CCxxx0_RXBYTES是状态寄存器,
            地址是0x3B,-RX FIFO 中的下溢和比特数
            BYTES_IN_RXFIFO为0x7F,为接收缓冲器的有效字节数**
          

  if (( halSpiReadStatus( CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) // 如果接的字节数不为0  
           { 
               packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度 
               if (packetLength <= *length)     // 如果所要的有效数据长度小于等于接收到的数据包的长度 
               { 
                    halSpiReadBurstReg(CCx xx0_RXFIFO, rxBuffer, packetLength); // 读出所有接收到的数据 
                   *length = packetLength;         // 把接收数据长度的修改为当前数据的长度 
                     halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);    // 读出CRC 校验位 
                     halSpi Strobe( CCxxx0_ SFRX);    // 清洗接收缓冲区 
                     return (status[1] & CRC_ OK);       // 如果校验成功返回接收成功 
                } 
            else   
               { 
                 *length = packetLength;  
                    halSpi Strobe( CCxxx0_ SFRX);    // 清洗接收缓冲区
                  return 0;  
               } 
     }   
    else  
   return 0;  
}
 

上面两个问题能解锁下吗?
还有一个问题,就是每次片选信号拉点使能后,都得等SO跳变低电平稳定后才能继续,这里我看是用while等待;
我是这么处理的,利用和上面i变量一样的用法,超时直接return了,不知道有没有更好的方法!

------解决思路----------------------
延时可以定义一个变量如 i  
用while (i--){};
  相关解决方案