#include "driver.h" #include <avr/interrupt.h> #include <util/delay.h> namespace driver { namespace { Mrf24j *mrf; } void init(Mrf24j *mrf) { driver::mrf = mrf; SPI_PORT |= (1<<SPI_CS); //set chip select pin high SPI_DDR |= (1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_CS); // spi sck mosi and chip select outputs RESET_PORT |= (1<<RESET); RESET_DDR |= (1<<RESET); SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //enable SPI , Master, fck/16 #ifdef WAKE_PORT WAKE_PORT &= ~(1<<WAKE_PIN); WAKE_DDR |= (1<<WAKE_PIN); #endif #if defined __AVR_ATmega328P__ EICRA |= (1<<ISC01); EIMSK |= (1<<INT0); SPSR |= (1<< SPI2X); // FOSC/2 #elif defined __AVR_ATmega32__ GICR |= (1<<INT2); #endif sei(); } uint8_t transfer(uint8_t data) { SPDR = data; while(!(SPSR & (1<<SPIF))); //wait for transmition to complete return SPDR; } void reset() { RESET_PORT &= ~(1<<RESET); _delay_ms(10); RESET_PORT |= (1<<RESET); _delay_ms(20); } void wake() { #ifdef WAKE_PORT WAKE_PORT |= (1<<WAKE_PIN); _delay_ms(1); WAKE_PORT &= ~(1<<WAKE_PIN); #endif } INTERRUPT { mrf->interrupt_handler(); // mrf24 object interrupt routine mrf->check_flags(); } }