63 extern uint8_t debugflowsize, debugflow[DEBUGFLOWSIZE];
64 #define DEBUGFLOW(c) if(debugflowsize < (DEBUGFLOWSIZE - 1)) debugflow[debugflowsize++] = c
85 #define HAL_DUMMY_READ (0x00)
87 #define HAL_TRX_CMD_RW (0xC0)
88 #define HAL_TRX_CMD_RR (0x80)
89 #define HAL_TRX_CMD_FW (0x60)
90 #define HAL_TRX_CMD_FR (0x20)
91 #define HAL_TRX_CMD_SW (0x40)
92 #define HAL_TRX_CMD_SR (0x00)
93 #define HAL_TRX_CMD_RADDRM (0x7F)
95 #define HAL_CALCULATED_CRC_OK (0)
109 volatile extern signed char rf230_last_rssi;
141 #include <avr/interrupt.h>
143 #define HAL_SPI_TRANSFER_OPEN()
145 #define HAL_SPI_TRANSFER_WAIT()
146 #define HAL_SPI_TRANSFER_READ() (SPDR)
147 #define HAL_SPI_TRANSFER_CLOSE()
149 #define HAL_SPI_TRANSFER(to_write) ( \
150 HAL_SPI_TRANSFER_WRITE(to_write), \
151 HAL_SPI_TRANSFER_WAIT(), \
152 HAL_SPI_TRANSFER_READ())
154 #elif defined(__AVR__)
159 #include <avr/interrupt.h>
161 #define HAL_SPI_TRANSFER_OPEN() { \
162 HAL_ENTER_CRITICAL_REGION(); \
164 #define HAL_SPI_TRANSFER_WRITE(to_write) (SPDR = (to_write))
165 #define HAL_SPI_TRANSFER_WAIT() ({ while((SPSR & (1 << SPIF)) == 0) {; } })
166 #define HAL_SPI_TRANSFER_READ() (SPDR)
167 #define HAL_SPI_TRANSFER_CLOSE() \
169 HAL_LEAVE_CRITICAL_REGION(); \
171 #define HAL_SPI_TRANSFER(to_write) ( \
172 HAL_SPI_TRANSFER_WRITE(to_write), \
173 HAL_SPI_TRANSFER_WAIT(), \
174 HAL_SPI_TRANSFER_READ())
180 #include "contiki-mulle.h"
183 #define HAL_SPI_TRANSFER_OPEN() { uint8_t spiTemp; \
184 HAL_ENTER_CRITICAL_REGION(); \
186 #define HAL_SPI_TRANSFER_WRITE(to_write) (spiTemp = spiWrite(to_write))
187 #define HAL_SPI_TRANSFER_WAIT() ({ 0; })
188 #define HAL_SPI_TRANSFER_READ() (spiTemp)
189 #define HAL_SPI_TRANSFER_CLOSE() \
191 HAL_LEAVE_CRITICAL_REGION(); \
193 #define HAL_SPI_TRANSFER(to_write) (spiTemp = spiWrite(to_write))
196 spiWrite(uint8_t byte)
201 if((byte & mask) != 0) {
212 }
while((mask >>= 1) != 0);
220 #define HAL_SPI_TRANSFER_OPEN() HAL_ENTER_CRITICAL_REGION();
224 #define HAL_SPI_TRANSFER_CLOSE() HAL_LEAVE_CRITICAL_REGION();
229 hal_spi_send(uint8_t data,
int cont)
233 SPI0->PUSHR = SPI_PUSHR_PCS((1 <<
HAL_SS_PIN)) | SPI_PUSHR_CONT_MASK | data;
237 SPI0->SR |= SPI_SR_TCF_MASK;
238 while(!(
SPI0->SR & SPI_SR_TCF_MASK)) ;
241 SPI0->SR |= SPI_SR_TCF_MASK;
242 data = (0xFF &
SPI0->POPR);
245 static inline uint8_t
246 hal_spi_receive(
int cont)
250 SPI0->PUSHR = SPI_PUSHR_PCS((1 <<
HAL_SS_PIN)) | SPI_PUSHR_CONT_MASK;
254 SPI0->SR |= SPI_SR_TCF_MASK;
255 while(!(
SPI0->SR & SPI_SR_TCF_MASK)) ;
258 SPI0->SR |= SPI_SR_TCF_MASK;
259 return 0xFF &
SPI0->POPR;
261 #ifdef MULLE_IRQ_PATCH
262 #define HAL_RF230_ISR() void __attribute__((interrupt)) _isr_portc_pin_detect(void)
264 #define HAL_RF230_ISR() void __attribute__((interrupt)) _isr_portb_pin_detect(void)
275 SIM->SCGC5 |= SIM_SCGC5_PORTD_MASK;
276 SIM->SCGC5 |= SIM_SCGC5_PORTE_MASK;
278 PORTE->PCR[6] |= 0x0100;
279 PORTD->PCR[7] |= 0x0100;
284 #ifdef MULLE_IRQ_PATCH
285 SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK;
286 PORTC->PCR[1] |= 0x00090100;
287 llwu_enable_wakeup_source(LLWU_WAKEUP_SOURCE_P6_RISING);
289 SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK;
290 PORTB->PCR[9] |= 0x00090100;
298 PORTD->PCR[4] |= 0x0200;
299 PORTD->PCR[2] |= 0x0200;
300 PORTD->PCR[1] |= 0x0200;
301 PORTD->PCR[3] |= 0x0200;
304 SIM->SCGC6 |= SIM_SCGC6_SPI0_MASK;
307 SPI0->MCR = 0x803F3000;
308 SPI0->CTAR[0] = 0x38002224;
326 uint8_t register_value = 0;
335 hal_spi_send(address,
true);
336 register_value = hal_spi_receive(
false);
340 return register_value;
360 hal_spi_send(address,
true);
361 hal_spi_send(value,
false);
381 register_value &= mask;
382 register_value >>= position;
384 return register_value;
404 register_value &= ~mask;
410 value |= register_value;
431 uint8_t frame_length;
439 frame_length = hal_spi_receive(
true);
446 rx_frame->
crc =
false;
448 rx_data = (rx_frame->
data);
449 rx_frame->
length = frame_length;
453 *rx_data++ = hal_spi_receive(
true);
454 }
while(--frame_length > 0);
457 rx_frame->
lqi = *rx_data++ = hal_spi_receive(
false);
462 rx_frame->
crc =
true;
467 uint8_t frame_length, *rx_data;
471 HAL_SPI_TRANSFER(0x20);
474 frame_length = HAL_SPI_TRANSFER(0);
481 rx_frame->
crc =
false;
483 rx_data = (rx_frame->
data);
484 rx_frame->
length = frame_length;
488 HAL_SPI_TRANSFER_WRITE(0);
489 HAL_SPI_TRANSFER_WAIT();
491 *rx_data++ = HAL_SPI_TRANSFER_READ();
492 HAL_SPI_TRANSFER_WRITE(0);
503 HAL_SPI_TRANSFER_WAIT();
504 }
while(--frame_length > 0);
507 rx_frame->
lqi = HAL_SPI_TRANSFER_READ();
512 rx_frame->
crc =
true;
515 HAL_SPI_TRANSFER_CLOSE();
532 for(i = 0; i < length; i++) {
533 printf(
"%02x ", write_buffer[i]);
534 if((i + 1) % 16 == 0) {
547 hal_spi_send(length,
true);
553 #if !RF230_CONF_CHECKSUM
559 hal_spi_send(*write_buffer++,
false);
561 hal_spi_send(*write_buffer++,
true);
578 void rf230_interrupt(
void);
581 extern uint8_t rxframe_head, rxframe_tail;
586 volatile char rf230interruptflag;
587 #define INTERRUPTDEBUG(arg) rf230interruptflag = arg
589 #define INTERRUPTDEBUG(arg)
595 volatile uint8_t state;
596 uint8_t interrupt_source;
599 #ifdef MULLE_IRQ_PATCH
600 PORTC->PCR[1] |= 0x01000000;
603 PORTB->PCR[9] |= 0x01000000;
616 #if !RF230_CONF_AUTOACK
626 if(rxframe[rxframe_tail].length) {
628 }
else { INTERRUPTDEBUG(12);
631 #ifdef RF230_MIN_RX_POWER
634 #if RF230_CONF_AUTOACK
637 if(rf230_last_rssi >= RF230_MIN_RX_POWER) {
640 rxframe[rxframe_tail].rssi = rf230_last_rssi;
642 if(rxframe_tail >= RF230_CONF_RX_BUFFERS) {
646 #ifdef RF230_MIN_RX_POWER
661 trx_isr_mask &= ~HAL_BAT_LOW_MASK;
681 volatile uint8_t state;
682 uint8_t interrupt_source;
701 HAL_SPI_TRANSFER_WAIT();
704 interrupt_source = HAL_SPI_TRANSFER_READ();
706 interrupt_source = HAL_SPI_TRANSFER(interrupt_source);
708 interrupt_source = HAL_SPI_TRANSFER(0);
710 HAL_SPI_TRANSFER_CLOSE();
713 if((interrupt_source & HAL_RX_START_MASK)) {
716 #if !RF230_CONF_AUTOACK
720 rf230_last_rssi = (rf230_last_rssi << 1) + rf230_last_rssi;
735 }
else if(interrupt_source & HAL_TRX_END_MASK) {
746 if(rxframe[rxframe_tail].length) {
748 }
else { INTERRUPTDEBUG(12);
751 #ifdef RF230_MIN_RX_POWER
754 #if RF230_CONF_AUTOACK
758 if(rf230_last_rssi >= RF230_MIN_RX_POWER) {
762 if(rxframe_tail >= RF230_CONF_RX_BUFFERS) {
767 #ifdef RF230_MIN_RX_POWER
771 }
else if(interrupt_source & HAL_TRX_UR_MASK) {
773 }
else if(interrupt_source & HAL_PLL_UNLOCK_MASK) {
775 }
else if(interrupt_source & HAL_PLL_LOCK_MASK) {
783 trx_isr_mask &= ~HAL_BAT_LOW_MASK;
#define RX_ON
Constant RX_ON for sub-register SR_TRX_STATUS.
#define SR_TRX_STATUS
Access parameters for sub-register TRX_STATUS in register RG_TRX_STATUS.
#define HAL_TRX_CMD_FW
Frame Transmit Mode (long mode).
uint8_t lqi
LQI value for received frame.
#define RG_IRQ_MASK
Offset for register IRQ_MASK.
#define hal_enable_trx_interrupt()
Enable the interrupt from the radio transceiver.
uint8_t hal_register_read(uint8_t address)
This function reads data from one of the radio transceiver's registers.
#define HAL_PORT_MOSI
The SPI module uses GPIO might be split on different ports.
#define RG_IRQ_STATUS
Offset for register IRQ_STATUS.
#define HAL_BAT_LOW_MASK
Mask for the BAT_LOW interrupt.
#define RX_AACK_ON
Constant RX_AACK_ON for sub-register SR_TRX_STATUS.
#define PORTE
Peripheral PORTE base pointer.
#define PTD
Peripheral PTD base pointer.
#define RG_PHY_ED_LEVEL
Offset for register PHY_ED_LEVEL.
#define HAL_SS_PIN
The slave select pin.
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
Clear Pending Interrupt.
#define PORTB
Peripheral PORTB base pointer.
uint8_t length
Length of frame.
#define hal_set_pwr_high()
This macro pulls the RST pin high.
uint8_t hal_subregister_read(uint8_t address, uint8_t mask, uint8_t position)
This function reads the value of a specific subregister.
void hal_init(void)
This function initializes the Hardware Abstraction Layer.
This struct defines the rx data container.
#define SIM
Peripheral SIM base pointer.
#define SPI0
Peripheral SPI0 base pointer.
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.
uint8_t data[HAL_MAX_FRAME_LENGTH]
Actual frame data.
#define PTE
Peripheral PTE base pointer.
#define BUSY_RX
Constant BUSY_RX for sub-register SR_TRX_STATUS.
This file contains low-level radio driver code.
bool crc
Flag - did CRC pass for received frame?
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_TRX_CMD_RR
Register Read (short mode).
K60 hardware register header wrapper.
#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_PLL_LOCK_MASK
Mask for the PLL_LOCK interrupt.
#define HAL_RX_START_MASK
Mask for the RX_START interrupt.
#define HAL_SPI_TRANSFER_OPEN()
This function is called when a rx_start interrupt is signaled.
#define HAL_TRX_UR_MASK
Mask for the TRX_UR interrupt.
#define HAL_TRX_CMD_RADDRM
Register Address Mask.
#define HAL_PORT_MISO
The SPI module uses GPIO might be split on different ports.
#define SR_RSSI
Access parameters for sub-register RSSI in register RG_PHY_RSSI.
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_RF230_ISR()
This function initializes the Hardware Abstraction Layer.
Provide common UART routines for MK60DZ10.
#define BUSY_RX_AACK
Constant BUSY_RX_AACK for sub-register SR_TRX_STATUS.
#define HAL_TRX_CMD_RW
Register Write (short mode).
#define HAL_PLL_UNLOCK_MASK
Mask for the PLL_UNLOCK interrupt.
void RADIO_VECT(void)
ISR for the radio IRQ line, triggered by the input capture.
#define PORTC
Peripheral PORTC base pointer.
#define HAL_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
#define HAL_MAX_FRAME_LENGTH
A frame should no more than 127 bytes.
#define HAL_TRX_CMD_FR
Frame Receive Mode (long mode).
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_SCK_PIN
Data bit for SCK.
#define PORTD
Peripheral PORTD base pointer.
#define HAL_MIN_FRAME_LENGTH
A frame should be at least 3 bytes.
#define HAL_TRX_END_MASK
Mask for the TRX_END interrupt.
This file contains the register definitions for the AT86RF230.