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();
|
||
|
}
|
||
|
}
|
||
|
|