commit 0a48d7b3c7de1231afae0ccb306f74b04292839c Author: Jimmy Date: Fri Aug 21 10:27:08 2020 +1200 It works diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..b57f039 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,20 @@ +{ + "configurations": [ + { + "name": "linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/lib/avr/include/" + ], + "defines": [ + "__AVR_ATmega32__", + "F_CPU 8000000" + ], + "compilerPath": "/usr/bin/avr-g++", + "cStandard": "gnu11", + "cppStandard": "gnu++14", + "intelliSenseMode": "clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3b66410 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/lib/mrf24j.cpp b/lib/mrf24j.cpp new file mode 100644 index 0000000..c3bf419 --- /dev/null +++ b/lib/mrf24j.cpp @@ -0,0 +1,318 @@ +/** + * mrf24j.cpp, Karl Palsson, 2011, karlp@tweak.net.au + * modified bsd license / apache license + */ + +#include "mrf24j.h" +#include +#include +#include +#include +#include "spi.h" + + +// aMaxPHYPacketSize = 127, from the 802.15.4-2006 standard. +static uint8_t rx_buf[127]; + +// essential for obtaining the data frame only +// bytes_MHR = 2 Frame control + 1 sequence number + 2 panid + 2 shortAddr Destination + 2 shortAddr Source +static int bytes_MHR = 9; +static int bytes_FCS = 2; // FCS length = 2 +static int bytes_nodata = bytes_MHR + bytes_FCS; // no_data bytes in PHY payload, header length + FCS + +static int ignoreBytes = 0; // bytes to ignore, some modules behaviour. + +static bool bufPHY = false; // flag to buffer all bytes in PHY Payload, or not + +volatile uint8_t flag_got_rx; +volatile uint8_t flag_got_tx; + +static rx_info_t rx_info; +static tx_info_t tx_info; + + +void Mrf24j::reset(void) { + RESET_PORT &= ~(1<> 3; + byte alow = address << 5; + spi::transfer(0x80 | ahigh); // high bit for long + spi::transfer(alow); + byte ret = spi::transfer(0); + spi::cs_high(); + return ret; +} + + +void Mrf24j::write_short(byte address, byte data) { + spi::cs_low(); + // 0 for top short address, 1 bottom for write + spi::transfer((address<<1 & 0b01111110) | 0x01); + spi::transfer(data); + spi::cs_high(); +} + +void Mrf24j::write_long(word address, byte data) { + spi::cs_low(); + byte ahigh = address >> 3; + byte alow = address << 5; + spi::transfer(0x80 | ahigh); // high bit for long + spi::transfer(alow | 0x10); // last bit for write + spi::transfer(data); + spi::cs_high(); +} + +word Mrf24j::get_pan(void) { + byte panh = read_short(MRF_PANIDH); + return panh << 8 | read_short(MRF_PANIDL); +} + +void Mrf24j::set_pan(word panid) { + write_short(MRF_PANIDH, panid >> 8); + write_short(MRF_PANIDL, panid & 0xff); +} + +void Mrf24j::address16_write(word address16) { + write_short(MRF_SADRH, address16 >> 8); + write_short(MRF_SADRL, address16 & 0xff); +} + +word Mrf24j::address16_read(void) { + byte a16h = read_short(MRF_SADRH); + return a16h << 8 | read_short(MRF_SADRL); +} + +/** + * Simple send 16, with acks, not much of anything.. assumes src16 and local pan only. + * @param data + */ +void Mrf24j::send16(word dest16, char * data) { + byte len = strlen(data); // get the length of the char* array + int i = 0; + write_long(i++, bytes_MHR); // header length + // +ignoreBytes is because some module seems to ignore 2 bytes after the header?!. + // default: ignoreBytes = 0; + write_long(i++, bytes_MHR+ignoreBytes+len); + + // 0 | pan compression | ack | no security | no data pending | data frame[3 bits] + write_long(i++, 0b01100001); // first byte of Frame Control + // 16 bit source, 802.15.4 (2003), 16 bit dest, + write_long(i++, 0b10001000); // second byte of frame control + write_long(i++, 1); // sequence number 1 + + word panid = get_pan(); + + write_long(i++, panid & 0xff); // dest panid + write_long(i++, panid >> 8); + write_long(i++, dest16 & 0xff); // dest16 low + write_long(i++, dest16 >> 8); // dest16 high + + word src16 = address16_read(); + write_long(i++, src16 & 0xff); // src16 low + write_long(i++, src16 >> 8); // src16 high + + // All testing seems to indicate that the next two bytes are ignored. + //2 bytes on FCS appended by TXMAC + i+=ignoreBytes; + for (int q = 0; q < len; q++) { + write_long(i++, data[q]); + } + // ack on, and go! + write_short(MRF_TXNCON, (1<> 6; + tx_info.channel_busy = (tmp & (1 << CCAFAIL)); + } +} + + +/** + * Call this function periodically, it will invoke your nominated handlers + */ +void Mrf24j::check_flags(void (*rx_handler)(void), void (*tx_handler)(void)){ + // TODO - we could check whether the flags are > 1 here, indicating data was lost? + if (flag_got_rx) { + flag_got_rx = 0; + rx_handler(); + } + if (flag_got_tx) { + flag_got_tx = 0; + tx_handler(); + } +} + +/** + * Set RX mode to promiscuous, or normal + */ +void Mrf24j::set_promiscuous(boolean enabled) { + if (enabled) { + write_short(MRF_RXMCR, 0x01); + } else { + write_short(MRF_RXMCR, 0x00); + } +} + +rx_info_t * Mrf24j::get_rxinfo(void) { + return &rx_info; +} + +tx_info_t * Mrf24j::get_txinfo(void) { + return &tx_info; +} + +uint8_t * Mrf24j::get_rxbuf(void) { + return rx_buf; +} + +int Mrf24j::rx_datalength(void) { + return rx_info.frame_length - bytes_nodata; +} + +void Mrf24j::set_ignoreBytes(int ib) { + // some modules behaviour + ignoreBytes = ib; +} + +/** + * Set bufPHY flag to buffer all bytes in PHY Payload, or not + */ +void Mrf24j::set_bufferPHY(boolean bp) { + bufPHY = bp; +} + +boolean Mrf24j::get_bufferPHY(void) { + return bufPHY; +} + +/** + * Set PA/LNA external control + */ +void Mrf24j::set_palna(boolean enabled) { + if (enabled) { + write_long(MRF_TESTMODE, 0x07); // Enable PA/LNA on MRF24J40MB module. + }else{ + write_long(MRF_TESTMODE, 0x00); // Disable PA/LNA on MRF24J40MB module. + } +} + +void Mrf24j::rx_flush(void) { + write_short(MRF_RXFLUSH, 0x01); +} + +void Mrf24j::rx_disable(void) { + write_short(MRF_BBREG1, 0x04); // RXDECINV - disable receiver +} + +void Mrf24j::rx_enable(void) { + write_short(MRF_BBREG1, 0x00); // RXDECINV - enable receiver +} + diff --git a/lib/mrf24j.h b/lib/mrf24j.h new file mode 100644 index 0000000..d6ba63f --- /dev/null +++ b/lib/mrf24j.h @@ -0,0 +1,238 @@ +/* + * File: mrf24j.h + * copyright Karl Palsson, karlp@tweak.net.au, 2011 + * modified BSD License / apache license + */ + +#pragma once + +#include + +#define byte uint8_t +#define boolean bool +#define word uint16_t + + + +#define RESET_DDR DDRB +#define RESET_PORT PORTB +#define RESET_PIN PB0 + +#define MRF_RXMCR 0x00 +#define MRF_PANIDL 0x01 +#define MRF_PANIDH 0x02 +#define MRF_SADRL 0x03 +#define MRF_SADRH 0x04 +#define MRF_EADR0 0x05 +#define MRF_EADR1 0x06 +#define MRF_EADR2 0x07 +#define MRF_EADR3 0x08 +#define MRF_EADR4 0x09 +#define MRF_EADR5 0x0A +#define MRF_EADR6 0x0B +#define MRF_EADR7 0x0C +#define MRF_RXFLUSH 0x0D +//#define MRF_Reserved 0x0E +//#define MRF_Reserved 0x0F +#define MRF_ORDER 0x10 +#define MRF_TXMCR 0x11 +#define MRF_ACKTMOUT 0x12 +#define MRF_ESLOTG1 0x13 +#define MRF_SYMTICKL 0x14 +#define MRF_SYMTICKH 0x15 +#define MRF_PACON0 0x16 +#define MRF_PACON1 0x17 +#define MRF_PACON2 0x18 +//#define MRF_Reserved 0x19 +#define MRF_TXBCON0 0x1A + +// TXNCON: TRANSMIT NORMAL FIFO CONTROL REGISTER (ADDRESS: 0x1B) +#define MRF_TXNCON 0x1B +#define MRF_TXNTRIG 0 +#define MRF_TXNSECEN 1 +#define MRF_TXNACKREQ 2 +#define MRF_INDIRECT 3 +#define MRF_FPSTAT 4 + +#define MRF_TXG1CON 0x1C +#define MRF_TXG2CON 0x1D +#define MRF_ESLOTG23 0x1E +#define MRF_ESLOTG45 0x1F +#define MRF_ESLOTG67 0x20 +#define MRF_TXPEND 0x21 +#define MRF_WAKECON 0x22 +#define MRF_FRMOFFSET 0x23 +// TXSTAT: TX MAC STATUS REGISTER (ADDRESS: 0x24) +#define MRF_TXSTAT 0x24 +#define TXNRETRY1 7 +#define TXNRETRY0 6 +#define CCAFAIL 5 +#define TXG2FNT 4 +#define TXG1FNT 3 +#define TXG2STAT 2 +#define TXG1STAT 1 +#define TXNSTAT 0 + +#define MRF_TXBCON1 0x25 +#define MRF_GATECLK 0x26 +#define MRF_TXTIME 0x27 +#define MRF_HSYMTMRL 0x28 +#define MRF_HSYMTMRH 0x29 +#define MRF_SOFTRST 0x2A +//#define MRF_Reserved 0x2B +#define MRF_SECCON0 0x2C +#define MRF_SECCON1 0x2D +#define MRF_TXSTBL 0x2E +//#define MRF_Reserved 0x2F +#define MRF_RXSR 0x30 +#define MRF_INTSTAT 0x31 +#define MRF_INTCON 0x32 +#define MRF_GPIO 0x33 +#define MRF_TRISGPIO 0x34 +#define MRF_SLPACK 0x35 +#define MRF_RFCTL 0x36 +#define MRF_SECCR2 0x37 +#define MRF_BBREG0 0x38 +#define MRF_BBREG1 0x39 +#define MRF_BBREG2 0x3A +#define MRF_BBREG3 0x3B +#define MRF_BBREG4 0x3C +//#define MRF_Reserved 0x3D +#define MRF_BBREG6 0x3E +#define MRF_CCAEDTH 0x3F + +#define MRF_RFCON0 0x200 +#define MRF_RFCON1 0x201 +#define MRF_RFCON2 0x202 +#define MRF_RFCON3 0x203 +#define MRF_RFCON5 0x205 +#define MRF_RFCON6 0x206 +#define MRF_RFCON7 0x207 +#define MRF_RFCON8 0x208 +#define MRF_SLPCAL0 0x209 +#define MRF_SLPCAL1 0x20A +#define MRF_SLPCAL2 0x20B +#define MRF_RSSI 0x210 +#define MRF_SLPCON0 0x211 +#define MRF_SLPCON1 0x220 +#define MRF_WAKETIMEL 0x222 +#define MRF_WAKETIMEH 0x223 +#define MRF_REMCNTL 0x224 +#define MRF_REMCNTH 0x225 +#define MRF_MAINCNT0 0x226 +#define MRF_MAINCNT1 0x227 +#define MRF_MAINCNT2 0x228 +#define MRF_MAINCNT3 0x229 +#define MRF_TESTMODE 0x22F +#define MRF_ASSOEADR1 0x231 +#define MRF_ASSOEADR2 0x232 +#define MRF_ASSOEADR3 0x233 +#define MRF_ASSOEADR4 0x234 +#define MRF_ASSOEADR5 0x235 +#define MRF_ASSOEADR6 0x236 +#define MRF_ASSOEADR7 0x237 +#define MRF_ASSOSADR0 0x238 +#define MRF_ASSOSADR1 0x239 +#define MRF_UPNONCE0 0x240 +#define MRF_UPNONCE1 0x241 +#define MRF_UPNONCE2 0x242 +#define MRF_UPNONCE3 0x243 +#define MRF_UPNONCE4 0x244 +#define MRF_UPNONCE5 0x245 +#define MRF_UPNONCE6 0x246 +#define MRF_UPNONCE7 0x247 +#define MRF_UPNONCE8 0x248 +#define MRF_UPNONCE9 0x249 +#define MRF_UPNONCE10 0x24A +#define MRF_UPNONCE11 0x24B +#define MRF_UPNONCE12 0x24C + +#define MRF_I_RXIF 0b00001000 +#define MRF_I_TXNIF 0b00000001 + +typedef struct _rx_info_t{ + uint8_t frame_length; + uint8_t rx_data[116]; //max data length = (127 aMaxPHYPacketSize - 2 Frame control - 1 sequence number - 2 panid - 2 shortAddr Destination - 2 shortAddr Source - 2 FCS) + uint8_t lqi; + uint8_t rssi; +} rx_info_t; + +/** + * Based on the TXSTAT register, but "better" + */ +typedef struct _tx_info_t{ + uint8_t tx_ok:1; + uint8_t retries:2; + uint8_t channel_busy:1; +} tx_info_t; + +class Mrf24j +{ + public: + void reset(void); + void init(void); + + byte read_short(byte address); + byte read_long(word address); + + void write_short(byte address, byte data); + void write_long(word address, byte data); + + word get_pan(void); + void set_pan(word panid); + + void address16_write(word address16); + word address16_read(void); + + void set_interrupts(void); + + void set_promiscuous(boolean enabled); + + /** + * Set the channel, using 802.15.4 channel numbers (11..26) + */ + void set_channel(byte channel); + + void rx_enable(void); + void rx_disable(void); + + /** If you want to throw away rx data */ + void rx_flush(void); + + rx_info_t * get_rxinfo(void); + + tx_info_t * get_txinfo(void); + + uint8_t * get_rxbuf(void); + + int rx_datalength(void); + + void set_ignoreBytes(int ib); + + /** + * Set bufPHY flag to buffer all bytes in PHY Payload, or not + */ + void set_bufferPHY(boolean bp); + + boolean get_bufferPHY(void); + + /** + * Set PA/LNA external control + */ + void set_palna(boolean enabled); + + void send16(word dest16, char * data); + + void interrupt_handler(void); + + void check_flags(void (*rx_handler)(void), void (*tx_handler)(void)); + + private: + int _pin_reset; + int _pin_cs; + int _pin_int; +}; + + + + diff --git a/lib/spi.cpp b/lib/spi.cpp new file mode 100644 index 0000000..01d7872 --- /dev/null +++ b/lib/spi.cpp @@ -0,0 +1,35 @@ +#include "spi.h" + + +namespace spi +{ + void init() { + SPI_PORT |= (1< + + + +#define SPI_PORT PORTB +#define SPI_DDR DDRB +#define SPI_SCK PB7 +#define SPI_MOSI PB5 +#define SPI_CS PB4 + +namespace spi +{ + void init(); + uint8_t transfer(uint8_t data); + + inline void cs_low() {SPI_PORT &= ~(1< +#include +#include "usart.h" + +namespace usart +{ + namespace { + static FILE mystdout; + } + + void init( unsigned long baud) { + fdev_setup_stream(&mystdout, put_printf, NULL, _FDEV_SETUP_WRITE); + stdout = &mystdout; + const unsigned int ubrr = F_CPU/16/baud-1; + + /*Set baud rate */ + UBRRH = (unsigned char)(ubrr>>8); + UBRRL = (unsigned char)ubrr; + //Enable receiver and transmitter + UCSRB = (1< + +namespace usart +{ + void init(unsigned long baud); + void put(char data ); + char get(); + int put_printf(char var, FILE *stream); +} // namespace usart + + + diff --git a/rx/bin/main.bin b/rx/bin/main.bin new file mode 100644 index 0000000..b14578b Binary files /dev/null and b/rx/bin/main.bin differ diff --git a/rx/bin/main.elf b/rx/bin/main.elf new file mode 100644 index 0000000..b14578b Binary files /dev/null and b/rx/bin/main.elf differ diff --git a/rx/bin/main.hex b/rx/bin/main.hex new file mode 100644 index 0000000..cff4be5 --- /dev/null +++ b/rx/bin/main.hex @@ -0,0 +1,234 @@ +:100000000C942B000C948D000C9453000C94530012 +:100010000C9453000C9453000C9453000C94530014 +:100020000C9453000C9453000C9453000C94530004 +:100030000C9453000C9453000C9453000C945300F4 +:100040000C9453000C9453000C9453000C945300E4 +:100050000C945300E00311241FBECFE5D8E0DEBFAF +:10006000CDBF10E0A0E6B0E0ECE4FEE002C00590F9 +:100070000D92A03AB107D9F721E0A0EAB0E001C0A3 +:100080001D92A83BB207E1F710E0CBE2D0E004C03C +:100090002197FE010E940904CA32D107C9F70E94C4 +:1000A000AF030C9424070C9400000895CF93DF93C2 +:1000B000D89A80EA90E00E949202FC0180811F920F +:1000C0008F9380E690E09F938F930E940F0482E8C5 +:1000D00090E00E942C040F900F900F900F90C0E0C2 +:1000E000D0E080EA90E00E949B02C817D9076CF428 +:1000F00080EA90E00E9492028C0F9D1FFC0181819A +:1001000090E00E9425042196ECCF80E890E00E94C8 +:100110002C04D898DF91CF9108951F920F920FB6BB +:100120000F9211242F933F934F935F936F937F937D +:100130008F939F93AF93BF93EF93FF9380EA90E0E9 +:100140000E94C502FF91EF91BF91AF919F918F9156 +:100150007F916F915F914F913F912F910F900FBEC3 +:100160000F901F901895C0988FE19EE40197F1F7CA +:1001700000C00000C09A8FE39CE90197F1F700C02E +:1001800000000895CF93C62F0E94DC038C2F880FA8 +:100190008E770E946E0380E00E946E03C82F0E943B +:1001A000DE030E94DE038C2FCF910895CF93DF935F +:1001B000EB010E94DC03CE0123E0969587952A95FA +:1001C000E1F780680E946E038C2F8295880F807EF5 +:1001D0000E946E0380E00E946E03C82F0E94DE031F +:1001E0008C2FDF91CF910895CF93DF93C62FD42F1B +:1001F0000E94DC038C2F880F8E7781600E946E0333 +:100200008D2F0E946E03DF91CF910C94DE031F931C +:10021000CF93DF93EB01142F0E94DC03CE0123E088 +:10022000969587952A95E1F780680E946E038C2F3A +:100230008295880F807E80610E946E03812F0E94CC +:100240006E03DF91CF911F910C94DE030F931F93E8 +:10025000CF938C0162E00E94C200C82F61E0C80108 +:100260000E94C2002C2F30E0322F2227A901482BF8 +:10027000CA01CF911F910F9108951F93CF93DF93E0 +:10028000EC01162F472F62E00E94F400412F61E03D +:10029000CE01DF91CF911F910C94F4001F93CF9367 +:1002A000DF93EC01162F472F64E00E94F400412FEA +:1002B00063E0CE01DF91CF911F910C94F4000F9376 +:1002C0001F93CF938C0164E00E94C200C82F63E0AB +:1002D000C8010E94C2002C2F30E0322F2227A90132 +:1002E000482BCA01CF911F910F910895AF92BF92F1 +:1002F000CF92DF92EF92FF920F931F93CF93DF93F2 +:10030000EC017B016A01FA0101900020E9F73197C5 +:100310008F01041B150B49E060E070E00E940701AB +:1003200040912101475F400F61E070E0CE010E94E3 +:10033000070141E662E070E0CE010E94070148E853 +:1003400063E070E0CE010E94070141E064E070E0EC +:10035000CE010E940701CE010E942601B92E482F2E +:1003600065E070E0CE010E9407014B2D66E070E071 +:10037000CE010E9407014E2D67E070E0CE010E9481 +:1003800007014F2D68E070E0CE010E940701CE0109 +:100390000E945F01F92E482F69E070E0CE010E94B3 +:1003A00007014F2D6AE070E0CE010E940701E09046 +:1003B0002101F09022018BE0E80EF11C560111277B +:1003C000C5018C199D09801791075CF4F5014191D5 +:1003D0005F01B701CE010E940701FFEFEF1AFF0A8C +:1003E000EFCF45E06BE1CE01DF91CF911F910F91EF +:1003F000FF90EF90DF90CF90BF90AF900C94F400FF +:1004000046EF62E30C94F400462F50E04B50510944 +:1004100024E0440F551F2A95E1F7436060E072E045 +:100420000C940701CF93DF93EC01B89A48E968E197 +:100430000E94F40045E96EE2CE010E94F40043E020 +:1004400060E072E0CE010E94070141E061E072E0ED +:10045000CE010E94070140E862E072E0CE010E94F6 +:10046000070140E966E072E0CE010E94070140E822 +:1004700067E072E0CE010E94070140E168E072E0AF +:10048000CE010E94070141E260E272E0CE010E94CB +:10049000070140E86AE3CE010E94F40040E66FE302 +:1004A000CE010E94F40040E46EE3CE010E94F4000D +:1004B000CE010E9400026CE0CE010E94040244E0E2 +:1004C00066E3CE010E94F40040E066E3CE010E94A4 +:1004D000F4008FEC97E00197F1F700C00000DF9186 +:1004E000CF910895CF93DF93EA018091A7008823ED +:1004F00021F01092A700FB0109958091A6008823A6 +:1005000031F01092A600FE01DF91CF910994DF91A6 +:10051000CF910895662311F041E001C040E060E012 +:100520000C94F40089EA90E0089588EA90E0089538 +:1005300085E291E008958091A90090E02091230147 +:1005400030912401821B930B0895709322016093D4 +:10055000210108956093200108958091200108955C +:10056000662311F047E001C040E06FE272E00C94B6 +:10057000070141E06DE00C94F40044E069E30C9461 +:10058000F40040E069E30C94F4008F929F92BF92D4 +:10059000CF92DF92EF92FF920F931F93CF93DF934F +:1005A000EC0161E30E94C200B82E83FF61C080911C +:1005B000A7008F5F8093A700F894CE010E94BD0230 +:1005C00060E073E0CE010E94D600082F80912001E8 +:1005D000811107C05AEAE52E50E0F52EC12CD12C2E +:1005E00017C045E2C42E41E0D42EE12CF12C802E20 +:1005F000912CE814F90474F78FEFE81AF80AB701A0 +:100600007D5FCE010E94D600F60181936F01F1CF8C +:100610008091A90090E02091230130912401821B58 +:10062000930BC816D9066CF4FFEFCF1ADF0AB60198 +:10063000675F7C4FCE010E94D600F70181937F0156 +:10064000E7CF0093A90010E0B8016F5F7C4FCE01A7 +:100650000E94D60080931E01B8016E5F7C4FCE01D0 +:100660000E94D60080931F01CE010E94C10278949F +:10067000B0FE20C08091A6008F5F8093A60064E248 +:10068000CE010E94C20090E0AC014E7F31E0452BCC +:1006900009F030E02091A80030FB20F936E0959574 +:1006A00087953A95E1F78370880F297F822B877FA2 +:1006B0008093A800DF91CF911F910F91FF90EF9051 +:1006C000DF90CF90BF909F908F900895C49A87B38A +:1006D000806B87BB8DB181658DB908958FB9779B8C +:1006E000FECF8FB10895C49A87B3806B87BB8DB15D +:1006F00081658DB908956FB9779BFECF8FB108954D +:100700009B01AC01E4EAF1E086EA93E091878087FF +:100710001386128682E0838315861486F093B501D2 +:10072000E093B40160E271EA87E090E00E94E703A1 +:100730002150310930BD29B988E18AB98EE880BDE0 +:10074000789408955D9BFECF8CB908950E94A20312 +:1007500080E090E008955F9BFECF8CB1089560E546 +:1007600073EC80E090E00E9480030E94660380EAC0 +:1007700090E00E94B30080EA90E00E9412026EEFC7 +:100780007AEC80EA90E00E943D0162E072E480EA47 +:1007900090E00E944E0184B7816084BF8BB7806473 +:1007A0008BBF7894D09A45E550E066E570E080EA2A +:1007B00090E00E947202F7CFC4980895C49A0895F9 +:1007C0008BE090E090932401809323010895A1E2AF +:1007D0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FBB +:1007E000FF1FA217B307E407F50720F0A21BB30B06 +:1007F000E40BF50B661F771F881F991F1A9469F782 +:1008000060957095809590959B01AC01BD01CF01DD +:100810000895EE0FFF1F0590F491E02D0994A0E0DC +:10082000B0E0E5E1F4E00C94FD06AE014B5F5F4FF4 +:10083000FA0161917191AF018091B4019091B5017C +:100840000E945C04E2E00C9419076091B40170917D +:10085000B5010E94530608950F931F93CF93DF9322 +:10086000E091B401F091B501238121FF1BC08C01FF +:10087000D0E0C0E0F80181918F016091B4017091E6 +:10088000B501DB011896ED91FC911997882331F0A1 +:100890000995892B79F3DFEFCFEFECCF8AE009954B +:1008A000892B19F08FEF9FEF02C08D2F9C2FDF91C6 +:1008B000CF911F910F910895ABE0B0E0E2E6F4E034 +:1008C0000C94ED066C017B018A01FC0117821682F3 +:1008D000838181FFCCC1CE0101963C01F601938159 +:1008E000F70193FD859193FF81917F01882309F49E +:1008F000BAC1853239F493FD859193FF81917F01CF +:10090000853229F4B60190E00E945306E7CF912C7E +:10091000212C312CFFE1F315D8F08B3279F038F42B +:10092000803279F08332A1F4232D20611DC08D32F5 +:1009300061F0803369F4232D216016C0832D82601D +:10094000382EE32DE4603E2E2AC0F32DF8601DC042 +:1009500037FC2DC020ED280F2A3040F08E32B9F43C +:1009600036FC81C1232D2064322E19C036FE06C00C +:100970008AE0989E200D1124922E11C0EAE02E9E4E +:10098000200D1124222EF32DF0623F2E08C08C364C +:1009900021F4832D8068382E02C0883641F4F70197 +:1009A00093FD859193FF81917F018111B3CF982FA2 +:1009B0009F7D9554933028F40C5F1F4F9FE39983DC +:1009C0000DC0833631F0833771F0833509F059C09B +:1009D00021C0F801808189830E5F1F4F8824839492 +:1009E000912C530113C02801F2E04F0E511CF80165 +:1009F000A080B18036FE03C0692D70E002C06FEFA9 +:100A00007FEFC5010E9448064C018201F32DFF775C +:100A10003F2E16C0280122E0420E511CF801A08092 +:100A2000B18036FE03C0692D70E002C06FEF7FEF2A +:100A3000C5010E943D064C01F32DF0683F2E820156 +:100A400033FC1BC0822D90E088169906B0F4B601E5 +:100A500080E290E00E9453062A94F4CFF50137FC1F +:100A6000859137FE81915F01B60190E00E945306A7 +:100A700021102A9421E0821A91088114910471F7BF +:100A8000E8C0843611F0893641F5F80137FE07C019 +:100A900060817181828193810C5F1F4F08C06081EA +:100AA0007181072E000C880B990B0E5F1F4FF32DE1 +:100AB000FF763F2E97FF09C09095809570956195C0 +:100AC0007F4F8F4F9F4FF0683F2E2AE030E0A30109 +:100AD0000E948F06882E861845C0853731F4232D55 +:100AE0002F7EB22E2AE030E025C0932D997FB92EBB +:100AF0008F36C1F018F4883579F0B5C0803719F019 +:100B0000883721F0B0C0E92FE061BE2EB4FE0DC0E1 +:100B1000FB2DF460BF2E09C034FE0AC0292F2660C9 +:100B2000B22E06C028E030E005C020E130E002C06F +:100B300020E132E0F801B7FE07C060817181828157 +:100B400093810C5F1F4F06C06081718180E090E04F +:100B50000E5F1F4FA3010E948F06882E8618FB2D63 +:100B6000FF773F2E36FE0DC0232D2E7FA22E891437 +:100B700058F434FE0BC032FC09C0832D8E7EA82EA3 +:100B800005C0B82CA32C03C0B82C01C0B92CA4FEFE +:100B90000FC0FE01E80DF11D8081803321F49A2DF4 +:100BA000997EA92E09C0A2FE06C0B394B39404C0D6 +:100BB0008A2D867809F0B394A3FC11C0A0FE06C06C +:100BC000B21488F4280C922C9B180EC0B21460F456 +:100BD000B60180E290E00E945306B394F7CFB214BE +:100BE00018F42B1802C0982C212CA4FE10C0B601BA +:100BF00080E390E00E945306A2FE17C0A1FC03C050 +:100C000088E790E002C088E590E0B6010CC08A2D2C +:100C1000867859F0A1FE02C08BE201C080E2A7FCF9 +:100C20008DE2B60190E00E945306891438F4B601B3 +:100C300080E390E00E9453069A94F7CF8A94F301E0 +:100C4000E80DF11D8081B60190E00E9453068110ED +:100C5000F5CF222009F442CEB60180E290E00E9456 +:100C600053062A94F6CFF6018681978102C08FEF52 +:100C70009FEF2B96E2E10C940907FC01059061506F +:100C800070400110D8F7809590958E0F9F1F0895A2 +:100C9000FC016150704001900110D8F7809590954B +:100CA0008E0F9F1F08950F931F93CF93DF93FB0128 +:100CB000238121FD03C08FEF9FEF2CC022FF16C0C0 +:100CC00046815781248135814217530744F4A0811E +:100CD000B1819D012F5F3F4F318320838C9326810B +:100CE00037812F5F3F4F3783268314C08B01EC0180 +:100CF000FB010084F185E02D0995892BE1F6D801EF +:100D000016968D919C911797019617969C938E93AA +:100D10001697CE01DF91CF911F910F910895FA019F +:100D2000AA27283051F1203181F1E8946F936E7F2A +:100D30006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E01B +:100D40003CD0670F781F891F9A1FA11D680F791F5C +:100D50008A1F911DA11D6A0F711D811D911DA11D6D +:100D600020D009F468943F912AE0269F112430197D +:100D7000305D3193DEF6CF010895462F4770405D18 +:100D80004193B3E00FD0C9F7F6CF462F4F70405DC7 +:100D90004A3318F0495D31FD4052419302D0A9F722 +:100DA000EACFB4E0A6959795879577956795BA951C +:100DB000C9F700976105710508959B01AC010A2EE2 +:100DC00006945795479537952795BA95C9F7620FB9 +:100DD000731F841F951FA01D08952F923F924F925D +:100DE0005F926F927F928F929F92AF92BF92CF92BB +:100DF000DF92EF92FF920F931F93CF93DF93CDB7C4 +:100E0000DEB7CA1BDB0B0FB6F894DEBF0FBECDBF3B +:100E100009942A88398848885F846E847D848C840C +:100E20009B84AA84B984C884DF80EE80FD800C8115 +:100E30001B81AA81B981CE0FD11D0FB6F894DEBFF8 +:0C0E40000FBECDBFED010895F894FFCF68 +:100E4C0052656365697665642061207061636B65CA +:100E5C0074202569206279746573206C6F6E670A43 +:100E6C000A000D0A415343494920646174612028EA +:100E7C0072656C6576616E742064617461293A00E8 +:00000001FF diff --git a/rx/makefile b/rx/makefile new file mode 100644 index 0000000..8b9adbf --- /dev/null +++ b/rx/makefile @@ -0,0 +1,25 @@ +MCU=atmega32 +F_CPU?=8000000 +PROG=dragon_jtag +CC=avr-g++ +OBJCOPY=avr-objcopy +CFLAGS=-Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I. +TARGET=main +SRCS=src/*.cpp ../lib/*.cpp + +all: build flash + +build: + ${CC} ${CFLAGS} -o bin/${TARGET}.bin ${SRCS} + ${CC} ${CFLAGS} -o bin/${TARGET}.elf ${SRCS} + ${OBJCOPY} -j .text -j .data -O ihex bin/${TARGET}.bin bin/${TARGET}.hex + +flash: + avrdude -p ${MCU} -c ${PROG} -U flash:w:bin/main.hex + +clean: + rm -f bin/* + +term: + python3 term.py + diff --git a/rx/src/main.cpp b/rx/src/main.cpp new file mode 100644 index 0000000..596ba78 --- /dev/null +++ b/rx/src/main.cpp @@ -0,0 +1,83 @@ +/** + * Example code for using a microchip mrf24j40 module to send and receive + * packets using plain 802.15.4 + * Requirements: 3 pins for spi, 3 pins for reset, chip select and interrupt + * notifications + * This example file is considered to be in the public domain + * Originally written by Karl Palsson, karlp@tweak.net.au, March 2011 + */ + + +#include +#include +#include "../../lib/mrf24j.h" +#include "../../lib/usart.h" +#include "../../lib/spi.h" + +const int pin_reset = 5; +const int pin_cs = 10; // default CS pin on ATmega8/168/328 +const int pin_interrupt = 2; // default interrupt pin on ATmega8/168/328 + +Mrf24j mrf; + +void handle_rx(); +void handle_tx(); + + +int main() { + usart::init(50000); + spi::init(); + //s.init(); + mrf.reset(); + mrf.init(); + + mrf.set_pan(0xcafe); + // This is _our_ address + mrf.address16_write(0x4202); + + // uncomment if you want to receive any packet on this channel + //mrf.set_promiscuous(true); + + // uncomment if you want to enable PA/LNA external control + //mrf.set_palna(true); + + // uncomment if you want to buffer all PHY Payload + //mrf.set_bufferPHY(true); + + MCUCSR |= (1<frame_length); + + printf("\r\nASCII data (relevant data):\n"); + for (int i = 0; i < mrf.rx_datalength(); i++) { + printf("%c", mrf.get_rxinfo()->rx_data[i]); + } + printf("\n\n"); + // Serial.print("\r\nLQI/RSSI="); + // Serial.print(mrf.get_rxinfo()->lqi, DEC); + // Serial.print("/"); + // Serial.println(mrf.get_rxinfo()->rssi, DEC); + PORTA &= ~(1< +#include +#include +#include "../../lib/mrf24j.h" +#include "../../lib/usart.h" +#include "../../lib/spi.h" + +const int pin_reset = 5; +const int pin_cs = 10; // default CS pin on ATmega8/168/328 +const int pin_interrupt = 2; // default interrupt pin on ATmega8/168/328 + +Mrf24j mrf; + +void handle_rx(); +void handle_tx(); + + +int main() { + usart::init(50000); + spi::init(); + mrf.reset(); + mrf.init(); + + mrf.set_pan(0xcafe); + // This is _our_ address + mrf.address16_write(0x4202); + + // uncomment if you want to receive any packet on this channel + //mrf.set_promiscuous(true); + + // uncomment if you want to enable PA/LNA external control + //mrf.set_palna(true); + + // uncomment if you want to buffer all PHY Payload + //mrf.set_bufferPHY(true); + + MCUCSR |= (1<tx_ok) { + printf("TX went ok, got ack"); + } else { + printf("TX failed after %i retries\n", mrf.get_txinfo()->retries); + } +} \ No newline at end of file diff --git a/tx/term.py b/tx/term.py new file mode 100644 index 0000000..2e7d8ad --- /dev/null +++ b/tx/term.py @@ -0,0 +1,11 @@ +import serial +from time import sleep + +with serial.Serial('/dev/ttyUSB0', 50000, timeout=1) as ser: + while True: + x = ser.read() # read one byte + if x != b'': + pass + print(x.decode('utf'), end ="") + + #print(ser.read()) \ No newline at end of file