|
买了两块CC1101模块做无线通信,51单片机控制,发现问题,接收端收到一帧空的数据,然后收到一帧正确的数据,如此重复,看图
![](http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_645628ZXLS5G.jpg)
串口监视数据 (原文件名:数据.jpg)
发送端每秒发送一帧数据,0xf0,0xf1,0xf2和0x0a是我加的测试信息,
大虾们帮忙分析分析
代码在下面:
send_byte()和send_string()是通过串口发送数据函数
主循环部分:
while(1) {
if(set_flag)
{
set_flag = 0;
send_string("send test data\n",sizeof("send test data\n"));
halRFSendPacket(test_data,sizeof(test_data)-1);
halSpiStrobe(CCxxx0_SRX); //进入接收状态
}
if(int1_flag)
{
int1_flag = 0; //清标志位
i = MAXSIZE_BUF;
if(halRfReceivePacket(tx_buf,&i))
{
send_string(tx_buf,i);
send_byte('\n');
}
send_byte('\n');
}
}
用中断判断是否收到数据,GDO0配置为0x06,接单片机的外部中断1,下降沿触发:
void exint1(void) interrupt 2 using 1
{
int1_flag = 1;
TXLED = ~TXLED;
}
发送和接受子函数:
void halRfSendPacket(uchar *txBuffer, uchar size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
while(~int1_flag);
halSpiStrobe(CCxxx0_SFTX);
int1_flag = 0; //清标志位
}
uchar halRfReceivePacket(uchar *rxBuffer, uchar *length)
{
uchar status[2];
uchar packetLength;
halSpiStrobe(CCxxx0_SRX);//进入接收状态
send_byte(0xf0);
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
{
send_byte(0xf1);
packetLength = halSpiReadReg(CCxxx0_RXFIFO); //读出第一个字节,此字节为该帧数据长度
if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度
{
send_byte(0xf2);
halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
*length = packetLength; //把接收数据长度的修改为当前数据的长度
// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return (status[1] & CRC_OK); //如果校验成功返回接收成功
}
else
{
send_byte(0xf3);
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return 0;
}
}
else
return 0;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|