Merge pull request #946 from e120guru/hotfix-radio-driver-error-reinit
CC2538 RF driver issues x3
This commit is contained in:
commit
a4e7cc29e8
1 changed files with 27 additions and 3 deletions
|
@ -122,6 +122,7 @@ static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; /** Snif */
|
|||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uint8_t rf_flags;
|
||||
static uint8_t rf_channel = CC2538_RF_CHANNEL;
|
||||
|
||||
static int on(void);
|
||||
static int off(void);
|
||||
|
@ -186,10 +187,22 @@ set_channel(uint8_t channel)
|
|||
}
|
||||
|
||||
/* Changes to FREQCTRL take effect after the next recalibration */
|
||||
off();
|
||||
|
||||
/* If we are off, save state, otherwise switch off and save state */
|
||||
if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) == 0) {
|
||||
rf_flags |= WAS_OFF;
|
||||
} else {
|
||||
rf_flags &= ~WAS_OFF;
|
||||
off();
|
||||
}
|
||||
REG(RFCORE_XREG_FREQCTRL) = (CC2538_RF_CHANNEL_MIN
|
||||
+ (channel - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING);
|
||||
on();
|
||||
/* switch radio back on only if radio was on before - otherwise will turn on radio foor sleepy nodes */
|
||||
if((rf_flags & WAS_OFF) != WAS_OFF) {
|
||||
on();
|
||||
}
|
||||
|
||||
rf_channel = channel;
|
||||
|
||||
return (int8_t) channel;
|
||||
}
|
||||
|
@ -445,7 +458,7 @@ init(void)
|
|||
/* Set TX Power */
|
||||
REG(RFCORE_XREG_TXPOWER) = CC2538_RF_TX_POWER;
|
||||
|
||||
set_channel(CC2538_RF_CHANNEL);
|
||||
set_channel(rf_channel);
|
||||
|
||||
/* Acknowledge RF interrupts, FIFOP only */
|
||||
REG(RFCORE_XREG_RFIRQM0) |= RFCORE_XREG_RFIRQM0_FIFOP;
|
||||
|
@ -951,10 +964,21 @@ PROCESS_THREAD(cc2538_rf_process, ev, data)
|
|||
|
||||
/* If we were polled due to an RF error, reset the transceiver */
|
||||
if(rf_flags & RF_MUST_RESET) {
|
||||
uint8_t was_on;
|
||||
rf_flags = 0;
|
||||
|
||||
/* save state so we know if to switch on again after re-init */
|
||||
if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) == 0) {
|
||||
was_on = 0;
|
||||
} else {
|
||||
was_on = 1;
|
||||
}
|
||||
off();
|
||||
init();
|
||||
if(was_on) {
|
||||
/* switch back on */
|
||||
on();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue