最近在学习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--){};