打印
[其他]

CC1100E程序卡在中断里了,求大神帮忙,搞掂私人发红包

[复制链接]
4125|34
手机看帖
扫描二维码
随时随地手机跟帖
楼主
现象描述】:在单机发送中,要求该机发送完成后转入接收状态,等待接收。不管有没有接收到语音数据,若发送时刻到来,则必须启动发送。现在的问题是有时发送一会语音数据就不能正常发送了,正常工作的持续时间长短不一。测试发现,PC指针原来是一直停留在了while(!GDO0);这条语句上了。该条语句的功能是判断是不是开始发送数据,当GDO0有上升沿出现的时候,表示开始发送数据。

【解决方法】在开始发送数据之前,先向CC1100写SIDLE命令使无线芯片CC1100转入空闲状态。然后再往TX FIFO里写入数据。数据写完后,写命令STX转发送状态开始发送。

【结果分析】用该方法后,发现带有状态转换的单机发送能够持续成功发送了。仔细研究CC1100数据手册后发现,写指令STX,在两种情况下可以成功转入到发送状态。一:在空闲状态。此种情况下可直接转入发送态。二:在接收态,并且要求是CCA使能。此种情况有个条件才能成功转入发送态,就是当信道清除时。
由此可以理解为什么之前的非正常现象了。虽然在MCSM1寄存器中的RXOFF-MODE位为00,表示接收完成后自动转入到空闲态。但是在程序中,在接收态一直等待接收,如果没有接收到数据,就不能转入空闲态了。因此再发送数据需要满足上面的第二个条件。

使用特权

评论回复
沙发
gaoyang9992006| | 2020-1-24 15:12 | 显示全部楼层
加油吧威基基 发表于 2020-1-24 13:50
好的,谢谢哥指点,我晚上再试试,今天过节回一下老家,晚上回去搞搞试试看,祝您新春快乐。 ...

嗯嗯,不要串门走亲戚,最近周边都封村了。

使用特权

评论回复
板凳
gaoyang9992006| | 2020-1-25 12:44 | 显示全部楼层
void halRfSendPacket(uint8 *txBuffer, uint8 size)

{
halSpiStrobe(CCxxx0_SIDLE);
//首先执行SIDLE滤波命令强制芯片进入空闲状态,
//wwt delayms_rf(2);
//发送数据后延迟一会,等待数据全部发送出去
halSpiStrobe(CCxxx0_SFTX); //清空TX FIFO缓冲区内容。
halSpiWriteReg(CCxxx0_TXFIFO, size); //写入缓冲地址、发送的数据个数
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入缓冲地址、发送的数据
//MARCSTATE_Flag=halSpiReadReg(CCxxx0_MARCSTA TE);//测试,读状态机状态
//while(MARCSTA TE_Flag==0x01);//=0x01(IDLE模式),判断是否退出IDLE模式,附加P2IE &= ~BIT6; //_DINT();//禁止中断//P2.3禁止中断
halSpiStrobe(CCxxx0_STX); //进入发送模式,发送数据
//由于模式寄存器已配置,发送结束后会继续保持在接收模式下
//发送不使用中断信号GDO0,接收使用中断信号GDO0
while (!GDO0);// Wait for GDO0 to be set -> sync transmitted
while (GDO0); // Wait for GDO0 to be cleared -> end of packet
P2IFG&=~BIT6;//软件清零GDO0,发送数据不产生中断
P2IE |= BIT6;//使能总中断_EINT(); //P2.3允许中断
delayms_rf(2);//发送数据后延迟一会,等待数据全部发送出去
halSpiStrobe(CCxxx0_SIDLE);//首先执行SIDLE滤波命令强制芯片进入空闲状态,//wwt halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

}

//***************************************************************************** ************

//函数名:uint8 halRfReceivePacket(uint8 *rxBuffer, uint8 *length)

//输入:

//输出:0:错误

// 1:正确

// 功能描述:接收数据包

// 当需要接收数据时, 首先将CC1100配置成接收状态,

// 一旦收到符合要求的数据, CC1100就会把收到的数据存入接收FIFO ,

// 同时引脚GDO0 会有一个脉冲出现, 这个脉冲可以用来通知

// MCU 有一个数据包已被CC1100 收到, MCU 就可以通过SPI口将CC1100 收到的数据取出来。

// GDO0_____|-----|______

//***************************************************************************** ************

uint8 halRfReceivePacket(uint8 *rxBuffer, uint8 length)

{

uint8 status[2];

uint8 packetLength = 0;

delayms_rf(2);//发送数据后延迟一会,等待数据全部发送出去

if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0(先读RXBYTES状态寄存器,再&0x7F)

{

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校验位

//RSSI_dec1=status[0];

halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

RF_Length=length;//wwt

return (status[1] & CRC_OK);//如果校验成功返回接收成功

}

else

{

length = packetLength;

halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

return 0;

}

}

else

{

halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

return 0;

}

}

使用特权

评论回复
地板
gaoyang9992006| | 2020-1-25 12:44 | 显示全部楼层
给你参考一下代码。
IDLE后紧接着用STX试试看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则