我们自己开发的单板/程序,使用了CC2530+CC2591的方案。
代码段基本如下:
#pragma vector = RF_VECTOR __interrupt void SmartParkRevIntProc(void) { RfDisableRxInterrupt(); // 关中断
if( RFIRQF0 & IRQ_RXPKTDONE ) { DataRevProc(); // 数据接收
S1CON = 0; // Clear general RF interrupt flag RFIRQF0 &= ~IRQ_RXPKTDONE; // Clear RXPKTDONE interrupt
}
RfEnableRxInterrupt(); // 开中断 }
问题现象:
1、如果发数端隔一段时间发数(比如100ms),则接收端收数不会出现死机情况;
2、如果发数端发数没有间隔(故意如此,专门测试系统是否会死机),则收数端很快死机。即不能接受任何天线过来的数据,但是程序还在运行哈。读取FSM状态寄存器—FSMSTAT0,发现所得值为:RX overflow / 0x11。尝试过添加 ISFLUSHRX 操作,但是已经没有任何效果。
3、我们的疑问是:为什么出现 RX overflow 后,系统再无法恢复?通过什么操作可以规避此种情况出现?收/发端需要如何编程以规避此问题?
请各位专家提供宝贵意见!感谢大家哈
Yue TANG:
1.你或者借鉴SimpliciTI协议,Familiy 6包含CC2530.可以参考他的接收函数做法,有提到
/* Flush must be done twice – datasheet. */#define MRFI_RADIO_FLUSH_RX_BUFFER() {RFST = ISFLUSHRX; RFST = ISFLUSHRX;}
2.如果是点到点通讯,完全可以使用TI-MAC协议栈。不需要从底层射频驱动开始做。