我發現這個問題:傳輸數據包後收音機沒有正確關閉。
在文件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