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__)
78 #elif defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
86 volatile extern signed char rf230_last_rssi;
92 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
95 #include <avr/interrupt.h>
97 #elif defined(__AVR__)
102 #include <avr/interrupt.h>
104 #define HAL_SPI_TRANSFER_OPEN() { \
105 HAL_ENTER_CRITICAL_REGION(); \
107 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPDR = (to_write))
108 #define HAL_SPI_TRANSFER_WAIT() ({while ((SPSR & (1 << SPIF)) == 0) {;}})
109 #define HAL_SPI_TRANSFER_READ() (SPDR)
110 #define HAL_SPI_TRANSFER_CLOSE() \
112 HAL_LEAVE_CRITICAL_REGION(); \
114 #define HAL_SPI_TRANSFER(to_write) ( \
115 HAL_SPI_TRANSFER_WRITE(to_write), \
116 HAL_SPI_TRANSFER_WAIT(), \
117 HAL_SPI_TRANSFER_READ() )
123 #include "contiki-mulle.h"
126 #define HAL_SPI_TRANSFER_OPEN() { uint8_t spiTemp; \
127 HAL_ENTER_CRITICAL_REGION(); \
129 #define HAL_SPI_TRANSFER_WRITE(to_write) (spiTemp = spiWrite(to_write))
130 #define HAL_SPI_TRANSFER_WAIT() ({0;})
131 #define HAL_SPI_TRANSFER_READ() (spiTemp)
132 #define HAL_SPI_TRANSFER_CLOSE() \
134 HAL_LEAVE_CRITICAL_REGION(); \
136 #define HAL_SPI_TRANSFER(to_write) (spiTemp = spiWrite(to_write))
138 inline uint8_t spiWrite(uint8_t byte)
144 if( (byte & mask) != 0 )
154 }
while( (mask >>= 1) != 0 );
162 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
170 #elif defined(__AVR__)
172 #define HAL_RF230_ISR() ISR(RADIO_VECT)
194 SPCR = (1 << SPE) | (1 << MSTR);
203 #define HAL_RF230_ISR() M16C_INTERRUPT(M16C_INT1)
204 #define HAL_TIME_ISR() M16C_INTERRUPT(M16C_TMRB4)
205 #define HAL_TICK_UPCNT() (0xFFFF-TB4) // TB4 counts down so we need to convert it to upcounting
230 TB3MR.BYTE = 0b00000000;
234 TB4MR.BYTE = 0b10000001;
237 HAL_ENABLE_OVERFLOW_INTERRUPT();
244 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
263 return (_SFR_MEM8(address)&mask)>>position;
271 uint8_t register_value = _SFR_MEM8(address);
272 register_value &= ~mask;
275 value |= register_value;
276 _SFR_MEM8(address) = value;
295 uint8_t register_value;
301 HAL_SPI_TRANSFER_OPEN();
304 HAL_SPI_TRANSFER(address);
305 register_value = HAL_SPI_TRANSFER(0);
307 HAL_SPI_TRANSFER_CLOSE();
309 return register_value;
325 address = 0xc0 | address;
327 HAL_SPI_TRANSFER_OPEN();
330 HAL_SPI_TRANSFER(address);
331 HAL_SPI_TRANSFER(value);
333 HAL_SPI_TRANSFER_CLOSE();
351 register_value &= mask;
352 register_value >>= position;
354 return register_value;
374 register_value &= ~mask;
380 value |= register_value;
401 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
403 uint8_t frame_length,*rx_data,*rx_buffer;
408 frame_length = TST_RX_LENGTH;
413 rx_frame->
crc =
false;
416 rx_frame->
length = frame_length;
419 rx_buffer=(uint8_t *)0x180;
420 rx_data = (rx_frame->
data);
423 *rx_data++ = _SFR_MEM8(rx_buffer++);
424 }
while (--frame_length > 0);
427 rx_frame->
lqi = *rx_buffer;
432 rx_frame->
crc =
true;
436 uint8_t frame_length, *rx_data;
439 HAL_SPI_TRANSFER_OPEN();
440 HAL_SPI_TRANSFER(0x20);
443 frame_length = HAL_SPI_TRANSFER(0);
450 rx_frame->
crc =
false;
453 rx_data = (rx_frame->
data);
454 rx_frame->
length = frame_length;
458 HAL_SPI_TRANSFER_WRITE(0);
459 HAL_SPI_TRANSFER_WAIT();
461 *rx_data++ = HAL_SPI_TRANSFER_READ();
462 HAL_SPI_TRANSFER_WRITE(0);
473 HAL_SPI_TRANSFER_WAIT();
475 }
while (--frame_length > 0);
479 rx_frame->
lqi = HAL_SPI_TRANSFER_READ();
484 rx_frame->
crc =
true;
487 HAL_SPI_TRANSFER_CLOSE();
502 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
504 tx_buffer=(uint8_t *)0x180;
509 _SFR_MEM8(tx_buffer++) = length;
515 #if !RF230_CONF_CHECKSUM
518 do _SFR_MEM8(tx_buffer++)= *write_buffer++;
while (--length);
526 HAL_SPI_TRANSFER_OPEN();
529 HAL_SPI_TRANSFER(0x60);
530 HAL_SPI_TRANSFER(length);
536 #if !RF230_CONF_CHECKSUM
539 do HAL_SPI_TRANSFER(*write_buffer++);
while (--length);
541 HAL_SPI_TRANSFER_CLOSE();
546 #if 0 //Uses 80 bytes (on Raven) omit unless needed
556 hal_sram_read(uint8_t address, uint8_t length, uint8_t *data)
558 HAL_SPI_TRANSFER_OPEN();
561 HAL_SPI_TRANSFER(0x00);
562 HAL_SPI_TRANSFER(address);
564 HAL_SPI_TRANSFER_WRITE(0);
565 HAL_SPI_TRANSFER_WAIT();
569 *data++ = HAL_SPI_TRANSFER_READ();
570 HAL_SPI_TRANSFER_WRITE(0);
571 HAL_SPI_TRANSFER_WAIT();
572 }
while (--length > 0);
574 HAL_SPI_TRANSFER_CLOSE();
578 #if 0 //omit unless needed
591 HAL_SPI_TRANSFER_OPEN();
594 HAL_SPI_TRANSFER(0x40);
597 HAL_SPI_TRANSFER(address);
601 HAL_SPI_TRANSFER(*data++);
602 }
while (--length > 0);
604 HAL_SPI_TRANSFER_CLOSE();
620 void rf230_interrupt(
void);
623 extern uint8_t rxframe_head,rxframe_tail;
628 volatile char rf230interruptflag;
629 #define INTERRUPTDEBUG(arg) rf230interruptflag=arg
631 #define INTERRUPTDEBUG(arg)
634 #if defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega128RFR2__) || defined(__AVR_ATmega256RFR2__)
639 ISR(TRX24_RX_END_vect)
642 #if RF230_CONF_AUTOACK
648 if (rxframe[rxframe_tail].length) {DEBUGFLOW(
'0');}
else ;
650 #ifdef RF230_MIN_RX_POWER
653 if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
659 rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
664 ISR(TRX24_RX_START_vect)
668 #if !RF230_CONF_AUTOACK
675 ISR(TRX24_PLL_LOCK_vect)
681 ISR(TRX24_PLL_UNLOCK_vect)
686 extern volatile uint8_t rf230_wakewait, rf230_txendwait,rf230_ccawait;
689 ISR(TRX24_AWAKE_vect)
696 ISR(TRX24_TX_END_vect)
703 ISR(TRX24_XAH_AMI_vect)
709 ISR(TRX24_CCA_ED_DONE_vect)
719 volatile uint8_t state;
720 uint8_t interrupt_source;
727 HAL_SPI_TRANSFER_OPEN();
733 HAL_SPI_TRANSFER_WAIT();
735 interrupt_source = HAL_SPI_TRANSFER(0);
737 HAL_SPI_TRANSFER_CLOSE();
743 #if !RF230_CONF_AUTOACK
744 #if 0 // 3-clock shift and add is faster on machines with no hardware multiply
747 rf230_last_rssi = (rf230_last_rssi <<1) + rf230_last_rssi;
748 #else // Faster with 1-clock multiply. Raven and Jackdaw have 2-clock multiply so same speed while saving 2 bytes of program memory
761 if (rxframe[rxframe_tail].length) INTERRUPTDEBUG(42);
else INTERRUPTDEBUG(12);
763 #ifdef RF230_MIN_RX_POWER
766 #if RF230_CONF_AUTOACK
770 if (rf230_last_rssi >= RF230_MIN_RX_POWER) {
773 rxframe_tail++;
if (rxframe_tail >= RF230_CONF_RX_BUFFERS) rxframe_tail=0;
775 #ifdef RF230_MIN_RX_POWER
799 trx_isr_mask &= ~HAL_BAT_LOW_MASK;
void hal_init(void)
This function initializes the Hardware Abstraction Layer.
void hal_register_write(uint8_t address, uint8_t value)
This function writes a new value to one of the radio transceiver's registers.
#define HAL_PORT_SPI
The SPI module is located on PORTB.
#define RG_IRQ_MASK
Offset for register IRQ_MASK.
#define HAL_RF230_ISR()
This function initializes the Hardware Abstraction Layer.
#define HAL_DD_SS
Data Direction bit for SS.
This file contains RF230-formatted register definitions for the atmega128rfa1.
#define HAL_SS_PIN
The slave select pin.
#define HAL_SCK_PIN
Data bit for SCK.
uint8_t hal_subregister_read(uint8_t address, uint8_t mask, uint8_t position)
This function reads the value of a specific subregister.
void RADIO_VECT(void)
ISR for the radio IRQ line, triggered by the input capture.
#define SR_RSSI
Access parameters for sub-register RSSI in register RG_PHY_RSSI.
#define HAL_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with HAL_ENTER_CRITICAL_REGION so that interrupts are e...
#define hal_enable_trx_interrupt()
Enable the interrupt from the radio transceiver.
#define BUSY_RX
Constant BUSY_RX for sub-register SR_TRX_STATUS.
#define HAL_DDR_MOSI
Data Direction Register for MISO GPIO pin.
#define HAL_PLL_UNLOCK_MASK
Mask for the PLL_UNLOCK interrupt.
uint8_t length
Length of frame.
#define HAL_DD_SCK
Data Direction bit for SCK.
#define DDR_SLP_TR
Data Direction Register that corresponds to the port where SLP_TR is connected.
#define HAL_PORT_MISO
The SPI module uses GPIO might be split on different ports.
void hal_frame_read(hal_rx_frame_t *rx_frame, rx_callback_t rx_callback)
This function will upload a frame from the radio transceiver's frame buffer.
#define HAL_PLL_LOCK_MASK
Mask for the PLL_LOCK interrupt.
void hal_subregister_write(uint8_t address, uint8_t mask, uint8_t position, uint8_t value)
This function writes a new value to one of the radio transceiver's subregisters.
#define HAL_TRX_UR_MASK
Mask for the TRX_UR interrupt.
#define HAL_MAX_FRAME_LENGTH
A frame should no more than 127 bytes.
#define SR_TRX_STATUS
Access parameters for sub-register TRX_STATUS in register RG_TRX_STATUS.
#define HAL_PORT_MOSI
The SPI module uses GPIO might be split on different ports.
This file contains low-level radio driver code.
uint8_t hal_register_read(uint8_t address)
This function reads data from one of the radio transceiver's registers.
bool crc
Flag - did CRC pass for received frame?
#define DDR_RST
Data Direction Register that corresponds to the port where RST is.
#define HAL_MIN_FRAME_LENGTH
A frame should be at least 3 bytes.
#define RG_IRQ_STATUS
Offset for register IRQ_STATUS.
#define RST
Pin number that corresponds to the RST pin.
#define HAL_DD_MOSI
Data Direction bit for MOSI.
#define BUSY_RX_AACK
Constant BUSY_RX_AACK for sub-register SR_TRX_STATUS.
uint8_t lqi
LQI value for received frame.
void hal_sram_write(uint8_t address, uint8_t length, uint8_t *data)
Write SRAM.
#define HAL_DDR_SS
Data Direction Register for MISO GPIO pin.
#define HAL_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
#define HAL_DDR_SPI
Data Direction Register for PORTB.
#define HAL_DD_MISO
Data Direction bit for MISO.
#define RX_AACK_ON
Constant RX_AACK_ON for sub-register SR_TRX_STATUS.
#define RX_ON
Constant RX_ON for sub-register SR_TRX_STATUS.
#define HAL_BAT_LOW_MASK
Mask for the BAT_LOW interrupt.
#define SLP_TR
Pin number that corresponds to the SLP_TR pin.
void hal_frame_write(uint8_t *write_buffer, uint8_t length)
This function will download a frame to the radio transceiver's frame buffer.
#define HAL_RX_START_MASK
Mask for the RX_START interrupt.
This file contains RF230-formatted register definitions for the atmega128rfa1.
#define HAL_DDR_SCK
Data Direction Register for MISO GPIO pin.
void hal_sram_read(uint8_t address, uint8_t length, uint8_t *data)
Read SRAM.
uint8_t data[HAL_MAX_FRAME_LENGTH]
Actual frame data.
#define RG_PHY_ED_LEVEL
Offset for register PHY_ED_LEVEL.
#define HAL_TRX_END_MASK
Mask for the TRX_END interrupt.
This file contains the register definitions for the AT86RF230.
#define HAL_DDR_MISO
Data Direction Register for MOSI GPIO pin.
This struct defines the rx data container.