|
楼主 |
发表于 2012-7-26 09:21:15
|
显示全部楼层
dzymushi 发表于 2012-7-25 21:51
这个得看你接收端数据包是怎么配置的,如果你设置了那两个字节附在数据包后面,应该还是会产生这两个字节 ...
昨天按照你的建议修改过程序后,今天发现还是不行,心跳包发了一个晚上就死掉,估计还是死在里面了,程序跑不出来,然后看门狗也不会复位,我刚刚试过,故意在txModeOn函数里面加了个while(1),单片机是会重启的。底层驱动我改为下面的函数。同时,在发送心跳包之前,读取RSSI信号强度来作为判断信道是否占用的参考,过程如下:
低功耗下唤醒->进入RX模式->等待1ms->读取RSSI值->然后回到低功耗。 如果判断信道被占用,则在低功耗状态下随机延时一段时间,再重复上述过程。 你觉得这样行吗? 还是用CS CCA比较好?我觉得直接读RSSI比设置CS CCA来得直观
void sendMsg(lockMSG *msg, uint8_t msgType)
{
_DINT();
startWDT();
if(msg == NULL)
{
return;
}
if(msgType == WSN_MSG)
{
halRfSendPacket((INT8U *)msg, msg->pktLen);
}
P2IFG &= ~BIT6;
_EINT();
}
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
idleModeOn();
clearTxFifo();
TI_CC_SPIWriteReg(TI_CCxxx0_TXFIFO, size);
writeBurstReg(TI_CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
txModeOn();
clearTxFifo();
}
void idleModeOn(void)
{
halSpiStrobe(TI_CCxxx0_SIDLE);
while(readCCstatus()!= STATE_IDLE);
}
INT8U readCCstatus(void)
{
INT8U state;
state=halSpiReadStatus(TI_CCxxx0_MARCSTATE);
return state;
}
void clearTxFifo(void)
{
halSpiStrobe(TI_CCxxx0_SFTX);
while(readCCstatus() != STATE_IDLE);
}
void txModeOn(void)
{
halSpiStrobe(TI_CCxxx0_STX); //进入发送模式发送数据
while(1);
while(readCCstatus() != STATE_IDLE)
{
extern INT8U test;
test=0xbe;
if(readCCstatus() == STATE_TX_UNDERFLOW)
{
halSpiStrobe(TI_CCxxx0_SFTX);
}
}
}
void clearTxFifo(void)
{
halSpiStrobe(TI_CCxxx0_SFTX);
while(readCCstatus() != STATE_IDLE);
} |
|