利用stm32f1做了一个发,一个收的实验,最初还能正常接收数据,中间对芯片电路进行插拔后,造成无法接收,(halSpiReadStatus(CCxxx0_RXBYTES)读出的长度为0。功率为采用0dm,波长为433。芯片更换了四五个都是无法接收。 GDO0发生跳变是否代表程序发送成功?
发送程序
void halRfSendPacket(INT8U *txBuffer, INT8U size){
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!GDO0);
// Wait for GDO0 to be cleared -> end of packet
while (GDO0);
halSpiStrobe(CCxxx0_SFTX);
}
接收程序
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length){
INT8U status[2];
INT8U packetLength;
INT8U i=(*length)*4; // 具体多少要根据datarate和length来决定
halSpiStrobe(CCxxx0_SRX); //进入接收状态
//delay(5);
//while (!GDO1);
//while (GDO1);
delay(2);
while (GDO0)
{
delay(2);
–i;
if(i<1)
return 0; } if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度
{
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 {
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return 0;
}
} else
return 0;
}
Barbara Wu:
有点不明白什么是"中间对芯片电路进行插拔后"
GDO0通常是连接外部MCU作为中断或者数据的口,可以用寄存器来配置的,如果有跳变,说明口上是有数据的,具体是CC1101这边给的数据还是MCU这边的,可以确认一下。
如果“中间对芯片电路进行插拔后”是指在通讯过程中,重新插拔了CC1101芯片,相当于芯片的配置都丢失了,再次插上需要重新对寄存器配置,这样才能正常工作。
wei wang42:
回复 Barbara Wu:
采用杜邦线焊接的电路,与IO口连接时需要手动插在一起,
配置丢失,把MCU复位后是对CC1101寄存器重新配置,但还是无法正常工作,
GDO0配置为0x06 ,单步调试时发送端的GDO0有跳变,单步调试接收端是GDO0也有跳变,采用while(GDO0);读取该引脚状态。
接收端查询接收长度时为0 ,即执行CCxxx0_RXBYTES,从SPI中返回的值为0.。
jacky Pu:
回复 wei wang42:
我也是同样的问题,就是接收不到任何数据。读状态每次都是0;
read_status = halSpiReadStatus(CCxxx0_RXBYTES);
有什么寄存器可以读CC1101的接收状态吗?
Barbara Wu:
回复 wei wang42:
MCU复位之后,建议将CC1101也复位,配置也应该通过SPI配置,如果SPI read有问题,怎么确认是否配置也正确执行了