我发现了问题:传输数据包后无线电没有正确关闭。
transmit()
在文件中的函数结束时,cpu/cc2538/dev/cc2538-rf.c
无线电仅在之前关闭时才关闭。
if(rf_flags & WAS_OFF) {
rf_flags &= ~WAS_OFF;
off();
}
但实际上程序永远不会在这种情况下运行,并且在传输数据包后不会立即关闭无线电。
问题出现是因为函数channel_clear()
(在函数开头transmit()
调用)首先清除了这个标志。因此,该函数transmit()
不再知道无线电在其执行之前已关闭,因此无线电保持打开状态。
为了解决这个问题,我在其中放置了一个局部变量,channel_clear()
它关闭无线电并仅在函数本身内部打开标志时才清除标志。
static int
channel_clear(void)
{
int cca;
/* Fix: local variable */
uint8_t intern_onoff;
intern_onoff = 0;
PRINTF("RF: CCA\n");
/* If we are off, turn on first */
if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) == 0) {
rf_flags |= WAS_OFF;
on();
intern_onoff = 1;
}
/* Wait on RSSI_VALID */
while((REG(RFCORE_XREG_RSSISTAT) & RFCORE_XREG_RSSISTAT_RSSI_VALID) == 0);
if(REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_CCA) {
cca = CC2538_RF_CCA_CLEAR;
} else {
cca = CC2538_RF_CCA_BUSY;
}
/* If we were off, turn back off */
if((rf_flags & WAS_OFF) == WAS_OFF && intern_onoff) {
rf_flags &= ~WAS_OFF;
off();
intern_onoff = 0;
}
return cca;
}
数据包传输期间的电流消耗现在看起来像:
注意:选通时间故意减少到 10 毫秒:
#define STROBE_TIME RTIMER_ARCH_SECOND / 100
这就解释了为什么广播消息只有三个选通传输。
频闪持续时间为 3ms。这意味着数据速率约为 140kbps (?)。