62 #include "contiki-conf.h"
64 extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
65 #define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c
76 #if defined(__AVR_ATmega128RFA1__)
85 volatile extern signed char rf230_last_rssi;
91 #if defined(__AVR_ATmega128RFA1__)
94 #include <avr/interrupt.h>
96 #elif defined(__AVR_XMEGA__)
98 #include <avr/interrupt.h>
100 #define HAL_SPI_TRANSFER_OPEN() { \
101 HAL_ENTER_CRITICAL_REGION(); \
105 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPIC.DATA = (to_write))
108 #define HAL_SPI_TRANSFER_WAIT() ({while((SPIC.STATUS & SPI_IF_bm) == 0) {;}})
110 #define HAL_SPI_TRANSFER_READ() (SPIC.DATA)
112 #define HAL_SPI_TRANSFER_CLOSE() \
114 HAL_LEAVE_CRITICAL_REGION(); \
117 #define HAL_SPI_TRANSFER(to_write) ( \
118 HAL_SPI_TRANSFER_WRITE(to_write), \
119 HAL_SPI_TRANSFER_WAIT(), \
120 HAL_SPI_TRANSFER_READ() )
122 #elif defined(__AVR__)
127 #include <avr/interrupt.h>
129 #define HAL_SPI_TRANSFER_OPEN() { \
130 HAL_ENTER_CRITICAL_REGION(); \
132 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPDR = (to_write))
133 #define HAL_SPI_TRANSFER_WAIT() ({while ((SPSR & (1 << SPIF)) == 0) {;}})
134 #define HAL_SPI_TRANSFER_READ() (SPDR)
135 #define HAL_SPI_TRANSFER_CLOSE() \
137 HAL_LEAVE_CRITICAL_REGION(); \
139 #define HAL_SPI_TRANSFER(to_write) ( \
140 HAL_SPI_TRANSFER_WRITE(to_write), \
141 HAL_SPI_TRANSFER_WAIT(), \
142 HAL_SPI_TRANSFER_READ() )
148 #include "contiki-mulle.h"
151 #define HAL_SPI_TRANSFER_OPEN() { uint8_t spiTemp; \
152 HAL_ENTER_CRITICAL_REGION(); \
154 #define HAL_SPI_TRANSFER_WRITE(to_write) (spiTemp = spiWrite(to_write))
155 #define HAL_SPI_TRANSFER_WAIT() ({0;})
156 #define HAL_SPI_TRANSFER_READ() (spiTemp)
157 #define HAL_SPI_TRANSFER_CLOSE() \
159 HAL_LEAVE_CRITICAL_REGION(); \
161 #define HAL_SPI_TRANSFER(to_write) (spiTemp = spiWrite(to_write))
163 inline uint8_t spiWrite(uint8_t byte)
169 if( (byte & mask) != 0 )
179 }
while( (mask >>= 1) != 0 );
187 #if defined(__AVR_ATmega128RFA1__)
196 #elif defined(__AVR_XMEGA__)
198 #define HAL_RF230_ISR() ISR(RADIO_VECT)
199 #define HAL_TIME_ISR() ()
200 #define HAL_TICK_UPCNT() ()
219 PORTC.DIR = (1 << SSPIN) | (1 << MOSIPIN) | (1 << SCKPIN) | (1 << RSTPIN) | (1 << SLPTRPIN);
220 PORTC.OUT |= (1 << SSPIN);
222 SPIC.CTRL |= SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | RADIO_PRESCALER;
232 #elif defined(__AVR__)
234 #define HAL_RF230_ISR() ISR(RADIO_VECT)
256 SPCR = (1 << SPE) | (1 << MSTR);
265 #define HAL_RF230_ISR() M16C_INTERRUPT(M16C_INT1)
266 #define HAL_TIME_ISR() M16C_INTERRUPT(M16C_TMRB4)
267 #define HAL_TICK_UPCNT() (0xFFFF-TB4) // TB4 counts down so we need to convert it to upcounting
292 TB3MR.BYTE = 0b00000000;
296 TB4MR.BYTE = 0b10000001;
299 HAL_ENABLE_OVERFLOW_INTERRUPT();
307 #if defined(__AVR_ATmega128RFA1__)
326 return (_SFR_MEM8(address)&mask)>>position;
334 uint8_t register_value = _SFR_MEM8(address);
335 register_value &= ~mask;
338 value |= register_value;
339 _SFR_MEM8(address) = value;
344 #elif defined(__AVR_XMEGA__)
349 uint8_t register_value;
355 HAL_SPI_TRANSFER_OPEN();
358 HAL_SPI_TRANSFER(address);
359 register_value = HAL_SPI_TRANSFER(0);
361 HAL_SPI_TRANSFER_CLOSE();
363 return register_value;
370 address = 0xc0 | address;
374 HAL_SPI_TRANSFER_OPEN();
377 HAL_SPI_TRANSFER(address);
379 HAL_SPI_TRANSFER(value);
381 HAL_SPI_TRANSFER_CLOSE();
391 register_value &= mask;
392 register_value >>= position;
394 return register_value;
403 register_value &= ~mask;
409 value |= register_value;
429 uint8_t register_value;
435 HAL_SPI_TRANSFER_OPEN();
438 HAL_SPI_TRANSFER(address);
439 register_value = HAL_SPI_TRANSFER(0);
441 HAL_SPI_TRANSFER_CLOSE();
443 return register_value;
459 address = 0xc0 | address;
461 HAL_SPI_TRANSFER_OPEN();
464 HAL_SPI_TRANSFER(address);
465 HAL_SPI_TRANSFER(value);
467 HAL_SPI_TRANSFER_CLOSE();
485 register_value &= mask;
486 register_value >>= position;
488 return register_value;
508 register_value &= ~mask;
514 value |= register_value;
535 #if defined(__AVR_ATmega128RFA1__)
537 uint8_t frame_length,*rx_data,*rx_buffer;
542 frame_length = TST_RX_LENGTH;
547 rx_frame->
crc =
false;
550 rx_frame->
length = frame_length;
553 rx_buffer=(uint8_t *)0x180;
554 rx_data = (rx_frame->
data);
557 *rx_data++ = _SFR_MEM8(rx_buffer++);
558 }
while (--frame_length > 0);
561 rx_frame->
lqi = *rx_buffer;
566 rx_frame->
crc =
true;
570 uint8_t frame_length, *rx_data;
573 HAL_SPI_TRANSFER_OPEN();
574 HAL_SPI_TRANSFER(0x20);
577 frame_length = HAL_SPI_TRANSFER(0);
584 rx_frame->
crc =
false;
587 rx_data = (rx_frame->
data);
588 rx_frame->
length = frame_length;
592 HAL_SPI_TRANSFER_WRITE(0);
593 HAL_SPI_TRANSFER_WAIT();
595 *rx_data++ = HAL_SPI_TRANSFER_READ();
596 HAL_SPI_TRANSFER_WRITE(0);
607 HAL_SPI_TRANSFER_WAIT();
609 }
while (--frame_length > 0);
613 rx_frame->
lqi = HAL_SPI_TRANSFER_READ();
618 rx_frame->
crc =
true;
621 HAL_SPI_TRANSFER_CLOSE();
636 #if defined(__AVR_ATmega128RFA1__)
638 tx_buffer=(uint8_t *)0x180;
643 _SFR_MEM8(tx_buffer++) = length;
649 #if !RF230_CONF_CHECKSUM
652 do _SFR_MEM8(tx_buffer++)= *write_buffer++;
while (--length);
660 HAL_SPI_TRANSFER_OPEN();
663 HAL_SPI_TRANSFER(0x60);
664 HAL_SPI_TRANSFER(length);
670 #if !RF230_CONF_CHECKSUM
673 do HAL_SPI_TRANSFER(*write_buffer++);
while (--length);
675 HAL_SPI_TRANSFER_CLOSE();
688 #if 0 //Uses 80 bytes (on Raven) omit unless needed
690 hal_sram_read(uint8_t address, uint8_t length, uint8_t *data)
692 HAL_SPI_TRANSFER_OPEN();
695 HAL_SPI_TRANSFER(0x00);
696 HAL_SPI_TRANSFER(address);
698 HAL_SPI_TRANSFER_WRITE(0);
699 HAL_SPI_TRANSFER_WAIT();
703 *data++ = HAL_SPI_TRANSFER_READ();
704 HAL_SPI_TRANSFER_WRITE(0);
705 HAL_SPI_TRANSFER_WAIT();
706 }
while (--length > 0);
708 HAL_SPI_TRANSFER_CLOSE();
721 #if 0 //omit unless needed
725 HAL_SPI_TRANSFER_OPEN();
728 HAL_SPI_TRANSFER(0x40);
731 HAL_SPI_TRANSFER(address);
735 HAL_SPI_TRANSFER(*data++);
736 }
while (--length > 0);
738 HAL_SPI_TRANSFER_CLOSE();
754 void rf230_interrupt(
void);
757 extern uint8_t rxframe_head,rxframe_tail;
762 volatile char rf230interruptflag;
763 #define INTERRUPTDEBUG(arg) rf230interruptflag=arg
765 #define INTERRUPTDEBUG(arg)
768 #if defined(__AVR_ATmega128RFA1__)
773 ISR(TRX24_RX_END_vect)
776 #if RF230_CONF_AUTOACK
782 if (rxframe[rxframe_tail].length) {DEBUGFLOW(
'0');}
else ;
784 #ifdef RF230_MIN_RX_POWER
787 if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
793 rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
798 ISR(TRX24_RX_START_vect)
802 #if !RF230_CONF_AUTOACK
809 ISR(TRX24_PLL_LOCK_vect)
815 ISR(TRX24_PLL_UNLOCK_vect)
820 extern volatile uint8_t rf230_wakewait, rf230_txendwait,rf230_ccawait;
823 ISR(TRX24_AWAKE_vect)
830 ISR(TRX24_TX_END_vect)
837 ISR(TRX24_XAH_AMI_vect)
843 ISR(TRX24_CCA_ED_DONE_vect)
853 volatile uint8_t state;
854 uint8_t interrupt_source;
861 HAL_SPI_TRANSFER_OPEN();
867 HAL_SPI_TRANSFER_WAIT();
869 interrupt_source = HAL_SPI_TRANSFER(0);
871 HAL_SPI_TRANSFER_CLOSE();
877 #if !RF230_CONF_AUTOACK
878 #if 0 // 3-clock shift and add is faster on machines with no hardware multiply
881 rf230_last_rssi = (rf230_last_rssi <<1) + rf230_last_rssi;
882 #else // Faster with 1-clock multiply. Raven and Jackdaw have 2-clock multiply so same speed while saving 2 bytes of program memory
894 if (rxframe[rxframe_tail].length) INTERRUPTDEBUG(42);
else INTERRUPTDEBUG(12);
896 #ifdef RF230_MIN_RX_POWER
899 #if RF230_CONF_AUTOACK
903 if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
906 rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
908 #ifdef RF230_MIN_RX_POWER
928 trx_isr_mask &= ~HAL_BAT_LOW_MASK;