問題が見つかりました: パケットの送信後、無線が適切にオフにされません。
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;
}
パケット送信中の消費電流は次のようになります。

注: ストロボ時間は意図的に 10ms に短縮されました。
#define STROBE_TIME RTIMER_ARCH_SECOND / 100
これは、ブロードキャスト メッセージの送信ストローブが 3 つしかない理由を説明しています。
ストロボの持続時間は 3ms です。これは、データ レートが ~140kbps (?) であることを意味します。