我发现这个问题:传输数据包后收音机没有正确关闭。
在文件cpu/cc2538/dev/cc2538-rf.c
中功能transmit()
的末尾,无线电仅在之前关闭时关闭。
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;
}
一个分组传输期间的电流消耗现在看起来像:
注:选通时间被有意降低到10ms与:
#define STROBE_TIME RTIMER_ARCH_SECOND/100
这解释为什么广播消息只有三个传输频闪。
频闪持续时间为3ms。这意味着数据速率是〜140kbps(?)。
谢谢您的完整描述。我已经怀疑8Hz的CCA检查,因为250ms的持续时间是双周期。它似乎是收音机没有正常关闭,它必须等待下一次无线电检查,然后再试。 – 2014-10-07 07:12:50