Compare commits

...

No commits in common. "pi" and "master" have entirely different histories.
pi ... master

11 changed files with 114 additions and 64 deletions

6
.gitignore vendored Executable file → Normal file
View File

@ -1,3 +1,3 @@
*.hex *.hex
*.elf *.elf
*.bin *.bin

6
.gitmodules vendored Executable file → Normal file
View File

@ -1,3 +1,3 @@
[submodule "test/usart"] [submodule "test/usart"]
path = test/usart path = test/usart
url = git@git.chch.tech:avr/usart.git url = git@git.chch.tech:avr/usart.git

BIN
main

Binary file not shown.

40
makefile Executable file → Normal file
View File

@ -1,5 +1,35 @@
all: build run MCU?=atmega328p
build: F_CPU=8000000
g++ -Wall -pthread -o main test/${MODE}/main.cpp src/*.cpp -lpigpio -lrt PROG?=arduino
run: PORT?=COM5
sudo ./main 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:
${CC} ${CFLAGS} -o bin/${MODE}.bin ${SRCS} test/${MODE}/main.cpp -O2
${CC} ${CFLAGS} -o bin/${MODE}.elf ${SRCS} test/${MODE}/main.cpp -O2
${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

65
src/driver.cpp Executable file → Normal file
View File

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

10
src/driver.h Executable file → Normal file
View File

@ -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

10
src/mrf24j.cpp Executable file → Normal file
View File

@ -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() {

7
src/mrf24j.h Executable file → Normal file
View File

@ -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

19
test/rx/main.cpp Executable file → Normal file
View File

@ -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() {

14
test/tx/main.cpp Executable file → Normal file
View File

@ -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;
@ -20,23 +22,23 @@ int i = 0;
void handle_rx(); 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);
} }
} }

1
test/usart Submodule

@ -0,0 +1 @@
Subproject commit 05034f925671f06abe15097326b05eceeef0bc1e