diff --git a/cpu/avr/radio/rf230bb/halbb.c b/cpu/avr/radio/rf230bb/halbb.c index 20b236aba..8e3e8f3bf 100644 --- a/cpu/avr/radio/rf230bb/halbb.c +++ b/cpu/avr/radio/rf230bb/halbb.c @@ -952,7 +952,7 @@ HAL_RF230_ISR() /* Save RSSI for this packet if not in extended mode, scaling to 1dB resolution */ #if !RF230_CONF_AUTOACK #if 0 // 3-clock shift and add is faster on machines with no hardware multiply - // While the compiler should use similar code for multiply by 3 there may be a bug with -Os in avr-gcc that calls the general subroutine + // With -Os avr-gcc saves a byte by using the general routine for multiply by 3 rf230_last_rssi = hal_subregister_read(SR_RSSI); rf230_last_rssi = (rf230_last_rssi <<1) + rf230_last_rssi; #else // Faster with 1-clock multiply. Raven and Jackdaw have 2-clock multiply so same speed while saving 2 bytes of program memory diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index 27d75a779..5a63c6cb5 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -47,7 +47,7 @@ //#define delay_us( us ) ( _delay_us( ( us ) ) ) //_delay_loop_2(uint16_t count) is 4 CPU cycles per iteration, up to 32 milliseconds at 8MHz #include -#define delay_us( us ) ( _delay_loop_2(1+(us*F_CPU)/4000000UL) ) +#define delay_us( us ) ( _delay_loop_2(1+((unsigned long long)us*F_CPU)/4000000UL) ) #include #elif defined(__MSP430__) @@ -104,6 +104,10 @@ static bool is_promiscuous; * RF230_INSERTACK will generate one based on the hardware result. * This is triggered when the read routine is called with a buffer * length of three (the ack length). + * In extended nmode it can be enabled by default to support either + * method. In nonextended mode it would pass an extra ACK to RDCs + * that use the TX_OK result to signal a successful ACK. + * Adds 100 bytes of program flash and two bytes of RAM. */ #if RF320_CONF_INSERTACK && RF230_CONF_AUTORETRIES #define RF230_INSERTACK 1 @@ -527,15 +531,17 @@ on(void) hal_set_slptr_low(); while (rf230_interruptwait) {} #else -/* SPI based radios. The wake time depends on board capacitance, use 2x the nominal value for safety */ - uint8_t sreg = SREG; - cli(); +/* SPI based radios. The wake time depends on board capacitance. + * Make sure the delay is long enough, as using SPI too soon will reset the MCU! + * Use 2x the nominal value for safety. 1.5x is not long enough for Raven! + */ +// uint8_t sreg = SREG;cli(); hal_set_slptr_low(); - delay_us(TIME_SLEEP_TO_TRX_OFF * 2); - SREG=sreg; + delay_us(2*TIME_SLEEP_TO_TRX_OFF); +// delay_us(TIME_SLEEP_TO_TRX_OFF+TIME_SLEEP_TO_TRX_OFF/2); +// SREG=sreg; #endif } - rf230_waitidle(); #if RF230_CONF_AUTOACK // radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON); @@ -543,6 +549,7 @@ on(void) #else radio_set_trx_state(RX_ON); #endif + rf230_waitidle(); } static void off(void) @@ -874,8 +881,8 @@ rf230_transmit(unsigned short payload_len) #else hal_set_slptr_low(); DEBUGFLOW('j'); - delay_us(TIME_SLEEP_TO_TRX_OFF); - delay_us(TIME_SLEEP_TO_TRX_OFF); //extra delay depends on board capacitance + delay_us(2*TIME_SLEEP_TO_TRX_OFF); //extra delay depends on board capacitance +// delay_us(TIME_SLEEP_TO_TRX_OFF+TIME_SLEEP_TO_TRX_OFF/2); #endif } else { @@ -1613,7 +1620,6 @@ rf230_cca(void) { uint8_t cca=0; uint8_t radio_was_off = 0; - uint8_t volatile saved_sreg = SREG; /* If the radio is locked by an underlying thread (because we are being invoked through an interrupt), we preted that the coast is @@ -1639,8 +1645,7 @@ rf230_cca(void) radio_was_off = 1; rf230_on(); } - /* Don't allow interrupts! */ -// cli(); + ENERGEST_ON(ENERGEST_TYPE_LED_YELLOW); /* CCA Mode Mode 1=Energy above threshold 2=Carrier sense only 3=Both 0=Either (RF231 only) */ /* Use the current mode. Note triggering a manual CCA is not recommended in extended mode */ @@ -1684,13 +1689,19 @@ rf230_cca(void) #else /* RF230, RF231 */ + /* Don't allow interrupts! */ /* Start the CCA, wait till done, return result */ /* Note reading the TRX_STATUS register clears both CCA_STATUS and CCA_DONE bits */ +{ uint8_t volatile saved_sreg = SREG; + cli(); + rf230_waitidle(); hal_subregister_write(SR_CCA_REQUEST,1); delay_us(TIME_CCA); while ((cca & 0x80) == 0 ) { cca=hal_register_read(RG_TRX_STATUS); } + SREG=saved_sreg; +} #endif ENERGEST_OFF(ENERGEST_TYPE_LED_YELLOW); if(radio_was_off) { @@ -1699,12 +1710,10 @@ rf230_cca(void) // if (cca & 0x40) {/*DEBUGFLOW('3')*/;} else {rf230_pending=1;DEBUGFLOW('4');} if (cca & 0x40) { // DEBUGFLOW('5'); - SREG=saved_sreg; return 1; } else { // DEBUGFLOW('6'); busyexit: - SREG=saved_sreg; return 0; } } diff --git a/cpu/avr/radio/rf230bb/rf230bb.h b/cpu/avr/radio/rf230bb/rf230bb.h index 33be07373..2cadfa6e7 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.h +++ b/cpu/avr/radio/rf230bb/rf230bb.h @@ -66,13 +66,15 @@ #define RF230_REVA ( 1 ) #define RF230_REVB ( 2 ) #define SUPPORTED_MANUFACTURER_ID ( 31 ) -/* RF230 does not support RX_START interrupts in extended mode, but it seems harmless to always enable it. */ -/* In non-extended mode this allows RX_START to sample the RF rssi at the end of the preamble */ -//#define RF230_SUPPORTED_INTERRUPT_MASK ( 0x0C ) //disable RX_START + #if defined(__AVR_ATmega128RFA1__) #define RF230_SUPPORTED_INTERRUPT_MASK ( 0xFF ) #else -#define RF230_SUPPORTED_INTERRUPT_MASK ( 0x0F ) +/* RF230 does not support RX_START interrupts in extended mode, but it seems harmless to always enable it. */ +/* In non-extended mode this allows RX_START to sample the RF rssi at the end of the preamble */ +//#define RF230_SUPPORTED_INTERRUPT_MASK ( 0x08 ) //enable trx end only +//#define RF230_SUPPORTED_INTERRUPT_MASK ( 0x0F ) //disable bat low, trx underrun +#define RF230_SUPPORTED_INTERRUPT_MASK ( 0x0C ) //disable bat low, trx underrun, pll lock/unlock #endif #define RF230_MIN_CHANNEL ( 11 )