Now that we're in cpp land, remove the mrf_ prefixes from all methods.
Also, add a proper set_channel method, and a method for promiscuous mode.
This commit is contained in:
parent
0a2c207146
commit
fd58b93767
|
@ -20,10 +20,10 @@ long tx_interval = 1000;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
Serial.println("Starting to reset and startup...");
|
|
||||||
|
|
||||||
mrf.mrf_pan_write(0xcafe);
|
mrf.set_pan(0xcafe);
|
||||||
mrf.mrf_address16_write(0x6001);
|
// This is _our_ address
|
||||||
|
mrf.address16_write(0x6001);
|
||||||
attachInterrupt(0, interrupt_routine, CHANGE);
|
attachInterrupt(0, interrupt_routine, CHANGE);
|
||||||
last_time = millis();
|
last_time = millis();
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ volatile uint8_t last_interrupt;
|
||||||
|
|
||||||
void interrupt_routine() {
|
void interrupt_routine() {
|
||||||
// read and clear from the radio
|
// read and clear from the radio
|
||||||
last_interrupt = mrf.mrf_read_short(MRF_INTSTAT);
|
last_interrupt = mrf.read_short(MRF_INTSTAT);
|
||||||
if (last_interrupt & MRF_I_RXIF) {
|
if (last_interrupt & MRF_I_RXIF) {
|
||||||
gotrx = 1;
|
gotrx = 1;
|
||||||
}
|
}
|
||||||
|
@ -44,19 +44,19 @@ void interrupt_routine() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
//mrf.mrf_write_short(MRF_RXMCR, 0x01); // promiscuous!
|
//mrf.set_promiscuous(true);
|
||||||
int tmp;
|
int tmp;
|
||||||
interrupts();
|
interrupts();
|
||||||
unsigned long current_time = millis();
|
unsigned long current_time = millis();
|
||||||
if (current_time - last_time > tx_interval) {
|
if (current_time - last_time > tx_interval) {
|
||||||
last_time = current_time;
|
last_time = current_time;
|
||||||
Serial.println("txxxing...");
|
Serial.println("txxxing...");
|
||||||
mrf.mrf_send16(0x4202, 4, "abcd");
|
mrf.send16(0x4202, 4, "abcd");
|
||||||
}
|
}
|
||||||
if (txok) {
|
if (txok) {
|
||||||
txok = 0;
|
txok = 0;
|
||||||
Serial.print("tx went ok:");
|
Serial.print("tx went ok:");
|
||||||
tmp = mrf.mrf_read_short(MRF_TXSTAT);
|
tmp = mrf.read_short(MRF_TXSTAT);
|
||||||
Serial.print(tmp);
|
Serial.print(tmp);
|
||||||
if (!(tmp & ~(1<<TXNSTAT))) { // 1 = failed
|
if (!(tmp & ~(1<<TXNSTAT))) { // 1 = failed
|
||||||
Serial.print("...And we got an ACK");
|
Serial.print("...And we got an ACK");
|
||||||
|
@ -69,22 +69,22 @@ void loop() {
|
||||||
if (gotrx) {
|
if (gotrx) {
|
||||||
gotrx = 0;
|
gotrx = 0;
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
mrf.mrf_write_short(MRF_BBREG1, 0x04); // RXDECINV - disable receiver
|
mrf.write_short(MRF_BBREG1, 0x04); // RXDECINV - disable receiver
|
||||||
|
|
||||||
byte frame_length = mrf.mrf_read_long(0x300); // read start of rxfifo
|
byte frame_length = mrf.read_long(0x300); // read start of rxfifo
|
||||||
Serial.print("received a packet ");Serial.print(frame_length, DEC);Serial.println(" bytes long");
|
Serial.print("received a packet ");Serial.print(frame_length, DEC);Serial.println(" bytes long");
|
||||||
Serial.println("Packet data:");
|
Serial.println("Packet data:");
|
||||||
for (int i = 1; i <= frame_length; i++) {
|
for (int i = 1; i <= frame_length; i++) {
|
||||||
tmp = mrf.mrf_read_long(0x300 + i);
|
tmp = mrf.read_long(0x300 + i);
|
||||||
Serial.print(tmp, HEX);
|
Serial.print(tmp, HEX);
|
||||||
}
|
}
|
||||||
Serial.print("\r\nLQI/RSSI=");
|
Serial.print("\r\nLQI/RSSI=");
|
||||||
byte lqi = mrf.mrf_read_long(0x300 + frame_length + 1);
|
byte lqi = mrf.read_long(0x300 + frame_length + 1);
|
||||||
byte rssi = mrf.mrf_read_long(0x300 + frame_length + 2);
|
byte rssi = mrf.read_long(0x300 + frame_length + 2);
|
||||||
Serial.print(lqi, HEX);
|
Serial.print(lqi, HEX);
|
||||||
Serial.println(rssi, HEX);
|
Serial.println(rssi, HEX);
|
||||||
|
|
||||||
mrf.mrf_write_short(MRF_BBREG1, 0x00); // RXDECINV - enable receiver
|
mrf.write_short(MRF_BBREG1, 0x00); // RXDECINV - enable receiver
|
||||||
interrupts();
|
interrupts();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
128
mrf24j.cpp
128
mrf24j.cpp
|
@ -19,18 +19,18 @@ Mrf24j::Mrf24j(int pin_reset, int pin_chip_select, int pin_interrupt) {
|
||||||
|
|
||||||
SPI.begin();
|
SPI.begin();
|
||||||
// arguably should not be here...
|
// arguably should not be here...
|
||||||
mrf_reset();
|
reset();
|
||||||
mrf_init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_reset(void) {
|
void Mrf24j::reset(void) {
|
||||||
digitalWrite(_pin_reset, LOW);
|
digitalWrite(_pin_reset, LOW);
|
||||||
delay(10); // just my gut
|
delay(10); // just my gut
|
||||||
digitalWrite(_pin_reset, HIGH);
|
digitalWrite(_pin_reset, HIGH);
|
||||||
delay(20); // from manual
|
delay(20); // from manual
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Mrf24j::mrf_read_short(byte address) {
|
byte Mrf24j::read_short(byte address) {
|
||||||
digitalWrite(_pin_cs, LOW);
|
digitalWrite(_pin_cs, LOW);
|
||||||
// 0 top for short addressing, 0 bottom for read
|
// 0 top for short addressing, 0 bottom for read
|
||||||
SPI.transfer(address<<1 & 0b01111110);
|
SPI.transfer(address<<1 & 0b01111110);
|
||||||
|
@ -39,7 +39,7 @@ byte Mrf24j::mrf_read_short(byte address) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Mrf24j::mrf_read_long(word address) {
|
byte Mrf24j::read_long(word address) {
|
||||||
digitalWrite(_pin_cs, LOW);
|
digitalWrite(_pin_cs, LOW);
|
||||||
byte ahigh = address >> 3;
|
byte ahigh = address >> 3;
|
||||||
byte alow = address << 5;
|
byte alow = address << 5;
|
||||||
|
@ -51,7 +51,7 @@ byte Mrf24j::mrf_read_long(word address) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Mrf24j::mrf_write_short(byte address, byte data) {
|
void Mrf24j::write_short(byte address, byte data) {
|
||||||
digitalWrite(_pin_cs, LOW);
|
digitalWrite(_pin_cs, LOW);
|
||||||
// 0 for top address, 1 bottom for write
|
// 0 for top address, 1 bottom for write
|
||||||
SPI.transfer((address<<1 & 0b01111110) | 0x01);
|
SPI.transfer((address<<1 & 0b01111110) | 0x01);
|
||||||
|
@ -59,7 +59,7 @@ void Mrf24j::mrf_write_short(byte address, byte data) {
|
||||||
digitalWrite(_pin_cs, HIGH);
|
digitalWrite(_pin_cs, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_write_long(word address, byte data) {
|
void Mrf24j::write_long(word address, byte data) {
|
||||||
digitalWrite(_pin_cs, LOW);
|
digitalWrite(_pin_cs, LOW);
|
||||||
byte ahigh = address >> 3;
|
byte ahigh = address >> 3;
|
||||||
byte alow = address << 5;
|
byte alow = address << 5;
|
||||||
|
@ -69,103 +69,109 @@ void Mrf24j::mrf_write_long(word address, byte data) {
|
||||||
digitalWrite(_pin_cs, HIGH);
|
digitalWrite(_pin_cs, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
word Mrf24j::mrf_pan_read(void) {
|
word Mrf24j::get_pan(void) {
|
||||||
byte panh = mrf_read_short(MRF_PANIDH);
|
byte panh = read_short(MRF_PANIDH);
|
||||||
return panh << 8 | mrf_read_short(MRF_PANIDL);
|
return panh << 8 | read_short(MRF_PANIDL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_pan_write(word panid) {
|
void Mrf24j::set_pan(word panid) {
|
||||||
mrf_write_short(MRF_PANIDH, panid >> 8);
|
write_short(MRF_PANIDH, panid >> 8);
|
||||||
mrf_write_short(MRF_PANIDL, panid & 0xff);
|
write_short(MRF_PANIDL, panid & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_address16_write(word address16) {
|
void Mrf24j::address16_write(word address16) {
|
||||||
mrf_write_short(MRF_SADRH, address16 >> 8);
|
write_short(MRF_SADRH, address16 >> 8);
|
||||||
mrf_write_short(MRF_SADRL, address16 & 0xff);
|
write_short(MRF_SADRL, address16 & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
word Mrf24j::mrf_address16_read(void) {
|
word Mrf24j::address16_read(void) {
|
||||||
byte a16h = mrf_read_short(MRF_SADRH);
|
byte a16h = read_short(MRF_SADRH);
|
||||||
return a16h << 8 | mrf_read_short(MRF_SADRL);
|
return a16h << 8 | read_short(MRF_SADRL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple send 16, with acks, not much of anything.. assumes src16 and local pan only.
|
* Simple send 16, with acks, not much of anything.. assumes src16 and local pan only.
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
void Mrf24j::mrf_send16(word dest16, byte len, char * data) {
|
void Mrf24j::send16(word dest16, byte len, char * data) {
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
mrf_write_long(i++, 9); // header length
|
write_long(i++, 9); // header length
|
||||||
mrf_write_long(i++, 9+2+len); //+2 is because module seems to ignore 2 bytes after the header?!
|
write_long(i++, 9+2+len); //+2 is because module seems to ignore 2 bytes after the header?!
|
||||||
|
|
||||||
// 0 | pan compression | ack | no security | no data pending | data frame[3 bits]
|
// 0 | pan compression | ack | no security | no data pending | data frame[3 bits]
|
||||||
mrf_write_long(i++, 0b01100001); // first byte of Frame Control
|
write_long(i++, 0b01100001); // first byte of Frame Control
|
||||||
// 16 bit source, 802.15.4 (2003), 16 bit dest,
|
// 16 bit source, 802.15.4 (2003), 16 bit dest,
|
||||||
mrf_write_long(i++, 0b10001000); // second byte of frame control
|
write_long(i++, 0b10001000); // second byte of frame control
|
||||||
mrf_write_long(i++, 1); // sequence number 1
|
write_long(i++, 1); // sequence number 1
|
||||||
|
|
||||||
word panid = mrf_pan_read();
|
word panid = get_pan();
|
||||||
|
|
||||||
mrf_write_long(i++, panid & 0xff); // dest panid
|
write_long(i++, panid & 0xff); // dest panid
|
||||||
mrf_write_long(i++, panid >> 8);
|
write_long(i++, panid >> 8);
|
||||||
mrf_write_long(i++, dest16 & 0xff); // dest16 low
|
write_long(i++, dest16 & 0xff); // dest16 low
|
||||||
mrf_write_long(i++, dest16 >> 8); // dest16 high
|
write_long(i++, dest16 >> 8); // dest16 high
|
||||||
|
|
||||||
word src16 = mrf_address16_read();
|
word src16 = address16_read();
|
||||||
mrf_write_long(i++, src16 & 0xff); // src16 low
|
write_long(i++, src16 & 0xff); // src16 low
|
||||||
mrf_write_long(i++, src16 >> 8); // src16 high
|
write_long(i++, src16 >> 8); // src16 high
|
||||||
|
|
||||||
i+=2; // All testing seems to indicate that the next two bytes are ignored.
|
i+=2; // All testing seems to indicate that the next two bytes are ignored.
|
||||||
for (int q = 0; q < len; q++) {
|
for (int q = 0; q < len; q++) {
|
||||||
mrf_write_long(i++, data[q]);
|
write_long(i++, data[q]);
|
||||||
}
|
}
|
||||||
// ack on, and go!
|
// ack on, and go!
|
||||||
mrf_write_short(MRF_TXNCON, (1<<MRF_TXNACKREQ | 1<<MRF_TXNTRIG));
|
write_short(MRF_TXNCON, (1<<MRF_TXNACKREQ | 1<<MRF_TXNTRIG));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_set_interrupts(void) {
|
void Mrf24j::set_interrupts(void) {
|
||||||
// interrupts for rx and tx normal complete
|
// interrupts for rx and tx normal complete
|
||||||
mrf_write_short(MRF_INTCON, 0b11110110);
|
write_short(MRF_INTCON, 0b11110110);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the channel to 12, 2.41Ghz, xbee channel 0xC
|
/** use the 802.15.4 channel numbers..
|
||||||
void Mrf24j::mrf_set_channel(void) {
|
*/
|
||||||
mrf_write_long(MRF_RFCON0, 0x13);
|
void Mrf24j::set_channel(byte channel) {
|
||||||
|
write_long(MRF_RFCON0, ((channel - 11) << 4) | 0x03));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mrf24j::mrf_init(void) {
|
void Mrf24j::init(void) {
|
||||||
/*
|
/*
|
||||||
// Seems a bit ridiculous when I use reset pin anyway
|
// Seems a bit ridiculous when I use reset pin anyway
|
||||||
mrf_write_short(MRF_SOFTRST, 0x7); // from manual
|
write_short(MRF_SOFTRST, 0x7); // from manual
|
||||||
while (mrf_read_short(MRF_SOFTRST) & 0x7 != 0) {
|
while (read_short(MRF_SOFTRST) & 0x7 != 0) {
|
||||||
; // wait for soft reset to finish
|
; // wait for soft reset to finish
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
mrf_write_short(MRF_PACON2, 0x98); // – Initialize FIFOEN = 1 and TXONTS = 0x6.
|
write_short(MRF_PACON2, 0x98); // – Initialize FIFOEN = 1 and TXONTS = 0x6.
|
||||||
mrf_write_short(MRF_TXSTBL, 0x95); // – Initialize RFSTBL = 0x9.
|
write_short(MRF_TXSTBL, 0x95); // – Initialize RFSTBL = 0x9.
|
||||||
|
|
||||||
mrf_write_long(MRF_RFCON0, 0x03); // – Initialize RFOPT = 0x03.
|
write_long(MRF_RFCON0, 0x03); // – Initialize RFOPT = 0x03.
|
||||||
mrf_write_long(MRF_RFCON1, 0x01); // – Initialize VCOOPT = 0x02.
|
write_long(MRF_RFCON1, 0x01); // – Initialize VCOOPT = 0x02.
|
||||||
mrf_write_long(MRF_RFCON2, 0x80); // – Enable PLL (PLLEN = 1).
|
write_long(MRF_RFCON2, 0x80); // – Enable PLL (PLLEN = 1).
|
||||||
mrf_write_long(MRF_RFCON6, 0x90); // – Initialize TXFIL = 1 and 20MRECVR = 1.
|
write_long(MRF_RFCON6, 0x90); // – Initialize TXFIL = 1 and 20MRECVR = 1.
|
||||||
mrf_write_long(MRF_RFCON7, 0x80); // – Initialize SLPCLKSEL = 0x2 (100 kHz Internal oscillator).
|
write_long(MRF_RFCON7, 0x80); // – Initialize SLPCLKSEL = 0x2 (100 kHz Internal oscillator).
|
||||||
mrf_write_long(MRF_RFCON8, 0x10); // – Initialize RFVCO = 1.
|
write_long(MRF_RFCON8, 0x10); // – Initialize RFVCO = 1.
|
||||||
mrf_write_long(MRF_SLPCON1, 0x21); // – Initialize CLKOUTEN = 1 and SLPCLKDIV = 0x01.
|
write_long(MRF_SLPCON1, 0x21); // – Initialize CLKOUTEN = 1 and SLPCLKDIV = 0x01.
|
||||||
|
|
||||||
// Configuration for nonbeacon-enabled devices (see Section 3.8 “Beacon-Enabled and
|
// Configuration for nonbeacon-enabled devices (see Section 3.8 “Beacon-Enabled and
|
||||||
// Nonbeacon-Enabled Networks”):
|
// Nonbeacon-Enabled Networks”):
|
||||||
mrf_write_short(MRF_BBREG2, 0x80); // Set CCA mode to ED
|
write_short(MRF_BBREG2, 0x80); // Set CCA mode to ED
|
||||||
mrf_write_short(MRF_CCAEDTH, 0x60); // – Set CCA ED threshold.
|
write_short(MRF_CCAEDTH, 0x60); // – Set CCA ED threshold.
|
||||||
mrf_write_short(MRF_BBREG6, 0x40); // – Set appended RSSI value to RXFIFO.
|
write_short(MRF_BBREG6, 0x40); // – Set appended RSSI value to RXFIFO.
|
||||||
mrf_set_interrupts();
|
set_interrupts();
|
||||||
mrf_set_channel();
|
set_channel(12);
|
||||||
// max power is by default.. just leave it...
|
// max power is by default.. just leave it...
|
||||||
//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)”.
|
||||||
mrf_write_short(MRF_RFCTL, 0x04); // – Reset RF state machine.
|
write_short(MRF_RFCTL, 0x04); // – Reset RF state machine.
|
||||||
mrf_write_short(MRF_RFCTL, 0x00); // part 2
|
write_short(MRF_RFCTL, 0x00); // part 2
|
||||||
delay(1); // delay at least 192usec
|
delay(1); // delay at least 192usec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mrf24j::set_promiscuous(boolean enabled) {
|
||||||
|
if (enabled) {
|
||||||
|
write_short(MRF_RXMCR, 0x01);
|
||||||
|
} else {
|
||||||
|
write_short(MRF_RXMCR, 0x00);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
32
mrf24j.h
32
mrf24j.h
|
@ -149,27 +149,31 @@ class Mrf24j
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Mrf24j(int pin_reset, int pin_chip_select, int pin_interrupt);
|
Mrf24j(int pin_reset, int pin_chip_select, int pin_interrupt);
|
||||||
void mrf_reset(void);
|
void reset(void);
|
||||||
void mrf_init(void);
|
void init(void);
|
||||||
|
|
||||||
byte mrf_read_short(byte address);
|
byte read_short(byte address);
|
||||||
byte mrf_read_long(word address);
|
byte read_long(word address);
|
||||||
|
|
||||||
void mrf_write_short(byte address, byte data);
|
void write_short(byte address, byte data);
|
||||||
void mrf_write_long(word address, byte data);
|
void write_long(word address, byte data);
|
||||||
|
|
||||||
word mrf_pan_read(void);
|
word get_pan(void);
|
||||||
void mrf_pan_write(word panid);
|
void set_pan(word panid);
|
||||||
|
|
||||||
void mrf_address16_write(word address16);
|
void address16_write(word address16);
|
||||||
word mrf_address16_read(void);
|
word address16_read(void);
|
||||||
|
|
||||||
void mrf_set_interrupts(void);
|
void set_interrupts(void);
|
||||||
|
|
||||||
// Set the channel to 12, 2.41Ghz, xbee channel 0xC
|
void set_promiscuous(boolean enabled);
|
||||||
void mrf_set_channel(void);
|
|
||||||
|
|
||||||
void mrf_send16(word dest16, byte len, char * data);
|
/**
|
||||||
|
* Set the channel, using 802.15.4 channel numbers (11..26)
|
||||||
|
*/
|
||||||
|
void set_channel(byte channel);
|
||||||
|
|
||||||
|
void send16(word dest16, byte len, char * data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _pin_reset;
|
int _pin_reset;
|
||||||
|
|
Loading…
Reference in New Issue