Compare commits
No commits in common. "pi" and "master" have entirely different histories.
|
@ -1,5 +1,35 @@
|
||||||
all: build run
|
MCU?=atmega328p
|
||||||
|
F_CPU=8000000
|
||||||
|
PROG?=arduino
|
||||||
|
PORT?=COM5
|
||||||
|
CC=avr-g++
|
||||||
|
OBJCOPY=avr-objcopy
|
||||||
|
CFLAGS=-Wall -g -mmcu=${MCU} -DF_CPU=${F_CPU} -I.
|
||||||
|
TARGET=main
|
||||||
|
SRCS= $(wildcard src/*.cpp) test/usart/src/usart.cpp
|
||||||
|
|
||||||
|
all: build flash
|
||||||
|
|
||||||
build:
|
build:
|
||||||
g++ -Wall -pthread -o main test/${MODE}/main.cpp src/*.cpp -lpigpio -lrt
|
${CC} ${CFLAGS} -o bin/${MODE}.bin ${SRCS} test/${MODE}/main.cpp -O2
|
||||||
run:
|
${CC} ${CFLAGS} -o bin/${MODE}.elf ${SRCS} test/${MODE}/main.cpp -O2
|
||||||
sudo ./main
|
${OBJCOPY} -j .text -j .data -O ihex bin/${MODE}.bin bin/${MODE}.hex
|
||||||
|
|
||||||
|
flash:
|
||||||
|
avrdude -p ${MCU} -c ${PROG} -P ${PORT} ${BAUD} -U flash:w:bin/${MODE}.hex
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f bin/*
|
||||||
|
|
||||||
|
term:
|
||||||
|
python3 lib/usart/term.py
|
||||||
|
|
||||||
|
avarice:
|
||||||
|
avarice --program --file bin/main.elf --part atmega32 --dragon :4242
|
||||||
|
|
||||||
|
|
||||||
|
fuse:
|
||||||
|
avrdude -p ${MCU} -c ${PROG} -P ${PORT} -U lfuse:w:0xe4:m -U hfuse:w:0xd2:m
|
||||||
|
|
||||||
|
lock:
|
||||||
|
avrdude -p ${MCU} -c ${PROG} -P ${PORT} -U lock:w:0xC0:m
|
|
@ -1,49 +1,58 @@
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include <pigpio.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
|
||||||
namespace driver
|
namespace driver
|
||||||
{
|
{
|
||||||
namespace {
|
namespace {
|
||||||
Mrf24j *mrf;
|
Mrf24j *mrf;
|
||||||
int spi;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void callback(int gpio, int level, uint32_t tick) {
|
|
||||||
mrf->interrupt_handler();
|
|
||||||
mrf->check_flags();
|
|
||||||
}
|
|
||||||
|
|
||||||
void init(Mrf24j *mrf) {
|
void init(Mrf24j *mrf) {
|
||||||
|
|
||||||
gpioInitialise();
|
|
||||||
driver::mrf = mrf;
|
driver::mrf = mrf;
|
||||||
spi = spiOpen(0, 1000000, 0);
|
SPI_PORT |= (1<<SPI_CS); //set chip select pin high
|
||||||
gpioSetMode(RESET, PI_OUTPUT);
|
SPI_DDR |= (1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_CS); // spi sck mosi and chip select outputs
|
||||||
gpioWrite(RESET, 1);
|
RESET_PORT |= (1<<RESET);
|
||||||
gpioSetMode(SPI_CS, PI_OUTPUT);
|
RESET_DDR |= (1<<RESET);
|
||||||
cs_high();
|
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //enable SPI , Master, fck/16
|
||||||
gpioSetAlertFunc(INT, callback);
|
#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) {
|
uint8_t transfer(uint8_t data) {
|
||||||
char txbuff[1], rxbuff[1];
|
SPDR = data;
|
||||||
txbuff[0] = data;
|
while(!(SPSR & (1<<SPIF))); //wait for transmition to complete
|
||||||
spiXfer(spi, txbuff, rxbuff, 1);
|
return SPDR;
|
||||||
return rxbuff[0];
|
|
||||||
}
|
}
|
||||||
void reset() {
|
void reset() {
|
||||||
gpioWrite(RESET , 0);
|
RESET_PORT &= ~(1<<RESET);
|
||||||
time_sleep(0.01);
|
_delay_ms(10);
|
||||||
gpioWrite(RESET, 1);
|
RESET_PORT |= (1<<RESET);
|
||||||
time_sleep(0.02);
|
_delay_ms(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wake() {
|
void wake() {
|
||||||
|
#ifdef WAKE_PORT
|
||||||
|
WAKE_PORT |= (1<<WAKE_PIN);
|
||||||
|
_delay_ms(1);
|
||||||
|
WAKE_PORT &= ~(1<<WAKE_PIN);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// INTERRUPT {
|
INTERRUPT {
|
||||||
// mrf->interrupt_handler(); // mrf24 object interrupt routine
|
mrf->interrupt_handler(); // mrf24 object interrupt routine
|
||||||
// mrf->check_flags();
|
mrf->check_flags();
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
#include "mrf24j.h"
|
#include "mrf24j.h"
|
||||||
#include <pigpio.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __AVR_ATmega328P__
|
#if defined __AVR_ATmega328P__
|
||||||
|
@ -35,18 +35,14 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RESET 24 //24
|
|
||||||
#define SPI_CS 8 //8
|
|
||||||
#define INT 2 //25
|
|
||||||
|
|
||||||
namespace driver
|
namespace driver
|
||||||
{
|
{
|
||||||
void init(Mrf24j *mrf);
|
void init(Mrf24j *mrf);
|
||||||
uint8_t transfer(uint8_t data);
|
uint8_t transfer(uint8_t data);
|
||||||
|
|
||||||
inline void cs_low() {gpioWrite(SPI_CS, 0);}
|
inline void cs_low() {SPI_PORT &= ~(1<<SPI_CS);}
|
||||||
|
|
||||||
inline void cs_high() {gpioWrite(SPI_CS, 1);}
|
inline void cs_high() {SPI_PORT |= (1<<SPI_CS);}
|
||||||
void wake();
|
void wake();
|
||||||
void reset();
|
void reset();
|
||||||
} // namespace spi
|
} // namespace spi
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
#include "mrf24j.h"
|
#include "mrf24j.h"
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pigpio.h>
|
#include <util/delay.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
// aMaxPHYPacketSize = 127, from the 802.15.4-2006 standard.
|
// aMaxPHYPacketSize = 127, from the 802.15.4-2006 standard.
|
||||||
static uint8_t rx_buf[127];
|
static uint8_t rx_buf[127];
|
||||||
|
@ -189,7 +189,7 @@ void Mrf24j::init(void) {
|
||||||
// Set transmitter power - See “REGISTER 2-62: RF CONTROL 3 REGISTER (ADDRESS: 0x203)”.
|
// Set transmitter power - See “REGISTER 2-62: RF CONTROL 3 REGISTER (ADDRESS: 0x203)”.
|
||||||
write_short(MRF_RFCTL, 0x04); // – Reset RF state machine.
|
write_short(MRF_RFCTL, 0x04); // – Reset RF state machine.
|
||||||
write_short(MRF_RFCTL, 0x00); // part 2
|
write_short(MRF_RFCTL, 0x00); // part 2
|
||||||
gpioSleep(0, 0, 1000); // delay at least 192usec
|
_delay_ms(1); // delay at least 192usec
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -203,6 +203,7 @@ void Mrf24j::interrupt_handler(void) {
|
||||||
if (last_interrupt & MRF_I_RXIF) {
|
if (last_interrupt & MRF_I_RXIF) {
|
||||||
flag_got_rx++;
|
flag_got_rx++;
|
||||||
// read out the packet data...
|
// read out the packet data...
|
||||||
|
cli();
|
||||||
rx_disable();
|
rx_disable();
|
||||||
// read start of rxfifo for, has 2 bytes more added by FCS. frame_length = m + n + 2
|
// read start of rxfifo for, has 2 bytes more added by FCS. frame_length = m + n + 2
|
||||||
uint8_t frame_length = read_long(0x300);
|
uint8_t frame_length = read_long(0x300);
|
||||||
|
@ -229,6 +230,7 @@ void Mrf24j::interrupt_handler(void) {
|
||||||
rx_info.rssi = read_long(0x301 + frame_length + 1);
|
rx_info.rssi = read_long(0x301 + frame_length + 1);
|
||||||
|
|
||||||
rx_enable();
|
rx_enable();
|
||||||
|
sei();
|
||||||
}
|
}
|
||||||
if (last_interrupt & MRF_I_TXNIF) {
|
if (last_interrupt & MRF_I_TXNIF) {
|
||||||
flag_got_tx++;
|
flag_got_tx++;
|
||||||
|
@ -336,7 +338,7 @@ void Mrf24j::wake() {
|
||||||
driver::wake();
|
driver::wake();
|
||||||
write_short(MRF_RFCTL, 0x04); // RF State Machine reset
|
write_short(MRF_RFCTL, 0x04); // RF State Machine reset
|
||||||
write_short(MRF_RFCTL, 0x00);
|
write_short(MRF_RFCTL, 0x00);
|
||||||
gpioSleep(0, 0 ,2000); // Delay 2 ms to allow 20 MHz main oscillator time to stabilize before transmitting or receiving.
|
_delay_ms(2); // Delay 2 ms to allow 20 MHz main oscillator time to stabilize before transmitting or receiving.
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::turbo() {
|
void Mrf24j::turbo() {
|
||||||
|
|
|
@ -3,10 +3,11 @@
|
||||||
* copyright Karl Palsson, karlp@tweak.net.au, 2011
|
* copyright Karl Palsson, karlp@tweak.net.au, 2011
|
||||||
* modified BSD License / apache license
|
* modified BSD License / apache license
|
||||||
*/
|
*/
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
|
|
||||||
typedef unsigned char byte;
|
#include <avr/io.h>
|
||||||
typedef unsigned int word;
|
|
||||||
|
typedef uint8_t byte;
|
||||||
|
typedef uint16_t word;
|
||||||
typedef bool boolean;
|
typedef bool boolean;
|
||||||
|
|
||||||
#ifndef LIB_MRF24J_H
|
#ifndef LIB_MRF24J_H
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
#define F_CPU 8000000UL
|
#define F_CPU 8000000UL
|
||||||
#include "../../src/mrf24j.h"
|
#include "../../src/mrf24j.h"
|
||||||
#include "../usart/src/usart.h"
|
#include "../usart/src/usart.h"
|
||||||
#include <pigpio.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
Mrf24j mrf;
|
Mrf24j mrf;
|
||||||
|
|
||||||
|
@ -17,6 +18,8 @@ void handle_rx();
|
||||||
void handle_tx();
|
void handle_tx();
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
usart::init(1000000);
|
||||||
|
|
||||||
mrf.reset();
|
mrf.reset();
|
||||||
mrf.init();
|
mrf.init();
|
||||||
|
|
||||||
|
@ -27,17 +30,22 @@ int main() {
|
||||||
mrf.handlers(&handle_rx, &handle_tx);
|
mrf.handlers(&handle_rx, &handle_tx);
|
||||||
//mrf.turbo();
|
//mrf.turbo();
|
||||||
|
|
||||||
|
sei();
|
||||||
|
DDRD |= (1<<PD4) | (1<<PD5);
|
||||||
printf("Started");
|
printf("Started");
|
||||||
while(1) {
|
while(1) {
|
||||||
printf("Hello\n\r");
|
//printf("txxxing...\n\r");
|
||||||
_delay_ms(2000);
|
//mrf.send16(0x4201, "abcd");
|
||||||
|
//_delay_ms(5000);
|
||||||
|
PORTD ^= (1<<PD5);
|
||||||
|
_delay_ms(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void handle_rx() {
|
void handle_rx() {
|
||||||
|
PORTD |= (1<<PD4);
|
||||||
printf("------------------------------------------------------\n\r");
|
printf("------------------------------------------------------\n\r");
|
||||||
printf("received a packet %i bytes long\n\r", mrf.get_rxinfo()->frame_length);
|
printf("received a packet %i bytes long\n\r", mrf.get_rxinfo()->frame_length);
|
||||||
|
|
||||||
|
@ -50,11 +58,12 @@ void handle_rx() {
|
||||||
|
|
||||||
printf("\r\nASCII data (relevant data): ");
|
printf("\r\nASCII data (relevant data): ");
|
||||||
for (int i = 0; i < mrf.rx_datalength(); i++) {
|
for (int i = 0; i < mrf.rx_datalength(); i++) {
|
||||||
putchar(mrf.get_rxinfo()->rx_data[i]);
|
usart::put(mrf.get_rxinfo()->rx_data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("LQI/RSSI=");
|
printf("LQI/RSSI=");
|
||||||
printf("%i/%i\n\r", mrf.get_rxinfo()->lqi, mrf.get_rxinfo()->rssi);
|
printf("%i/%i\n\r", mrf.get_rxinfo()->lqi, mrf.get_rxinfo()->rssi);
|
||||||
|
PORTD &= ~(1<<PD4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_tx() {
|
void handle_tx() {
|
||||||
|
|
|
@ -9,9 +9,11 @@
|
||||||
|
|
||||||
#define F_CPU 8000000UL
|
#define F_CPU 8000000UL
|
||||||
#include "../../src/mrf24j.h"
|
#include "../../src/mrf24j.h"
|
||||||
|
#include "../usart/src/usart.h"
|
||||||
#include "../../src/driver.h"
|
#include "../../src/driver.h"
|
||||||
#include <stdio.h>
|
#include <avr/interrupt.h>
|
||||||
#include <pigpio.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Mrf24j mrf;
|
Mrf24j mrf;
|
||||||
|
@ -21,22 +23,22 @@ void handle_rx();
|
||||||
void handle_tx();
|
void handle_tx();
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
usart::init(1000000);
|
||||||
|
|
||||||
mrf.reset();
|
mrf.reset();
|
||||||
mrf.init();
|
mrf.init();
|
||||||
time_sleep(1);
|
|
||||||
|
|
||||||
mrf.set_pan(0xcafe);
|
mrf.set_pan(0xcafe);
|
||||||
// This is _our_ address
|
// This is _our_ address
|
||||||
mrf.address16_write(0x4201);
|
mrf.address16_write(0x4201);
|
||||||
mrf.handlers(&handle_rx, &handle_tx);
|
mrf.handlers(&handle_rx, &handle_tx);
|
||||||
printf("Pan id: %x\n\r", mrf.get_pan());
|
|
||||||
//mrf.enable_wake();
|
//mrf.enable_wake();
|
||||||
//mrf.set_bufferPHY(true);
|
//mrf.set_bufferPHY(true);
|
||||||
//mrf.turbo();
|
//mrf.turbo();
|
||||||
//mrf.set_power(0b1100000);
|
//mrf.set_power(0b1100000);
|
||||||
//mrf.sleep();
|
//mrf.sleep();
|
||||||
|
|
||||||
|
sei();
|
||||||
printf("Started\n\r");
|
printf("Started\n\r");
|
||||||
|
|
||||||
char tmp[20];
|
char tmp[20];
|
||||||
|
@ -47,7 +49,7 @@ int main() {
|
||||||
sprintf(tmp,"Received %i\n\r", i);
|
sprintf(tmp,"Received %i\n\r", i);
|
||||||
mrf.send_str(0x4202, tmp);
|
mrf.send_str(0x4202, tmp);
|
||||||
|
|
||||||
time_sleep(2);
|
_delay_ms(2000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 05034f925671f06abe15097326b05eceeef0bc1e
|
Loading…
Reference in New Issue