59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
#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();
|
|
}
|
|
}
|
|
|