Last active
August 29, 2015 14:26
-
-
Save analog-io/8f1c6c7e5a07fe11b44d to your computer and use it in GitHub Desktop.
HopeRF BringUp Code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <RF75.h> | |
#include <SPI.h> | |
#define PIN_MOSI P1_7 | |
#define PIN_MISO P1_6 | |
#define PIN_CLK P1_5 | |
#define PIN_CE P3_5 | |
#define PIN_nCS P3_6 | |
#define PIN_IRQ P2_5 | |
#define PIN_SCL P1_3 | |
#define PIN_SDA P3_1 | |
#define PIN_RED_LED P2_7 | |
#define PIN_GREEN_LED P2_6 | |
uint8_t rf_status; | |
uint8_t payload[] = { 0xDE, 0xAD, 0xBE, 0xEF}; | |
/*struct rbuff | |
{ | |
uint8_t start_ptr = 0; | |
uint8_t end_ptr = 0; | |
uint8_t register_ptr = 0; | |
uint8_t data_available = 0; | |
uint8_t register[16]; | |
uint8_t buffer[255]; | |
}*/ | |
struct sPacket | |
{ | |
uint8_t pipe; // Local node address that message originated from | |
uint8_t message[33]; // Local node message [MAX. 59 bytes] | |
}; | |
uint8_t unread = 0; | |
uint8_t buffer_index = 0; | |
struct sPacket rxPacket[4]; | |
//************ Bank1 register initialization commands | |
const uint8_t PROGMEM rfm73_bank1Init[][5] = { | |
// address data | |
{ (0x20|0x00), 0x40, 0x4B, 0x01, 0xE2 }, | |
{ (0x20|0x01), 0xC0, 0x4B, 0x00, 0x00 }, | |
{ (0x20|0x02), 0xD0, 0xFC, 0x8C, 0x02 }, | |
{ (0x20|0x03), 0x99, 0x00, 0x39, 0x41 }, | |
//{ (0x20|0x04), 0xb9, 0x9E, 0x86, 0x0B }, // b9? f9? | |
{ (0x20|0x04), 0xD9, 0x96, 0x82, 0x1B }, //new register for rfm73 b9? d9? | |
//{ (0x20|0x04), 0x1B, 0x82, 0x96, 0xD9 }, //new register for rfm73 b9? d9? | |
//{ (0x20|0x05), 0x24, 0x06, 0x7F, 0xA6 }, //original | |
//{ (0x20|0x05), 0x28, 0x02, 0x7F, 0xA6 }, //bank1 register 5 = rssi settings = -96dbm | |
{ (0x20|0x05), 0x3C, 0x02, 0x7F, 0xA6 }, //bank1 register 5 = rssi settings = -71dbm - best | |
{ (0x20|0x06), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x07), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x08), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x09), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0a), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0b), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 }, | |
//{ (0x20|0x0D), 0x36, 0xb4, 0x80, 0x00 } | |
{ (0x20|0x0D), 0x46, 0xb4, 0x80, 0x00 } | |
}; | |
//************ Bank1 register 14 initialization commands | |
const uint8_t PROGMEM rfm73_bank1R0EInit[] = { | |
// address Data... | |
(0x20|0x0E), 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF | |
}; | |
void setup() | |
{ | |
pinMode(PIN_RED_LED, OUTPUT); | |
pinMode(PIN_GREEN_LED, OUTPUT); | |
digitalWrite(PIN_GREEN_LED, LOW); | |
digitalWrite(PIN_RED_LED, HIGH); | |
pinMode(PIN_MOSI, OUTPUT); | |
pinMode(PIN_MISO, INPUT); | |
pinMode(PIN_CLK, OUTPUT); | |
pinMode(PIN_CE, OUTPUT); | |
pinMode(PIN_nCS, OUTPUT); | |
pinMode(PIN_IRQ, INPUT); | |
SPI.begin(); | |
SPI.setDataMode(SPI_MODE0); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.transfer(0); | |
_writeReg(CONFIG_REG, DISABLE_MAX_RT+PWR_UP+PRIM_RX); | |
_writeReg(EN_AA_REG, 0x00); | |
_writeReg(EN_RXADDR_REG, ERX_P0); | |
_writeReg(SETUP_ADDRESS_WIDTH_REG, W_5BYTES); | |
_writeReg(SETUP_AUTO_RETRANSMISSION_REG, 0x00); | |
_writeReg(RF_CHANNEL_REG, 0x00); | |
_writeReg(RF_SETUP_REG, DATA_RATE_1MBPS+RF_PWR_0+LNA_HIGH_GAIN); | |
_writeReg(STATUS_REG, RX_DATA_READY+TX_DATA_SENT+MAX_RETRANS+RX_FIFO_EMPTY); | |
_writeReg(DYNAMIC_PAYLOAD_REG, 0x00); | |
_writeReg(FEATURE_REG, 0x00); | |
_writeReg(RX_DATA_IN_P0, 6); | |
_writeReg(EN_RXADDR_REG, ERX_P0); | |
//Switch Bank | |
uint8_t _activate_data = 0x53; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
for (int i=0; i < 14; i++) | |
_writeRegPgmBuf((uint8_t *)rfm73_bank1Init[i], sizeof(rfm73_bank1Init[i])); | |
// set ramp curve | |
_writeRegPgmBuf((uint8_t *)rfm73_bank1R0EInit, sizeof(rfm73_bank1R0EInit)); | |
//Switch Bank | |
_activate_data = 0x53; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
_activate_data = 0x73; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
Serial.begin(9600); | |
Serial.println("RF75 TX Tester"); | |
digitalWrite(PIN_RED_LED, LOW); | |
attachInterrupt(PIN_IRQ, rf75_isr, FALLING); | |
} | |
void loop() | |
{ | |
// put your main code here, to run repeatedly: | |
digitalWrite(PIN_GREEN_LED, LOW); | |
listen_for_packets(); | |
digitalWrite(PIN_GREEN_LED, LOW); | |
digitalWrite(PIN_RED_LED, HIGH); | |
while (unread > 0) { | |
for (int i=31;i>=(32-(rxPacket[unread-1].pipe&0x1F));i--) | |
Serial.print(rxPacket[unread-1].message[i],HEX); | |
Serial.print("\n"); | |
unread--; | |
} | |
digitalWrite(PIN_RED_LED, LOW); | |
Serial.println(_readReg(STATUS_REG),HEX); | |
} | |
void listen_for_packets() | |
{ | |
digitalWrite(PIN_CE, HIGH); | |
/* | |
if (rf_status != 0x0E) { | |
Serial.print("Bytes in pipe: "); | |
Serial.println(_readReg(RX_DATA_IN_P0)); | |
_readRegMultiLSB(READ_RX_PAYLOAD,buff,32); | |
} | |
*/ | |
delay(250); | |
digitalWrite(PIN_CE, LOW); | |
} | |
void rf75_isr() | |
{ | |
Serial.println("ISR"); | |
// Determine the cause of the interrupt | |
rf_status=_readReg(STATUS_REG); | |
switch (rf_status & 0x70) { | |
// Rx Received | |
case RX_DATA_READY: | |
// Determine the Pipe | |
rxPacket[unread].pipe = _readReg(READ_RX_PAYLOAD_WID); | |
//Serial.println(rxPacket[unread].pipe); | |
rxPacket[unread].pipe |= (rf_status&0x0E)<<3; | |
// Read the RX Payload | |
_readRegMultiLSB(READ_RX_PAYLOAD,rxPacket[unread].message,32); | |
// Increment the pointer | |
unread++; | |
// Clear the Rx Buffer | |
_issueCmd(FLUSH_RX); | |
// Clear the Rx Flag and get ready to do it all over again. | |
_writeReg(STATUS_REG, RX_DATA_READY); | |
break; | |
// Tx Done | |
case TX_DATA_SENT: | |
Serial.println("Tx ISR"); | |
break; | |
// Max retransmits occured | |
case MAX_RETRANS: | |
Serial.println("Max Re-Trans ISR"); | |
break; | |
} | |
// Get the data | |
} | |
/* Basic SPI I/O */ | |
uint8_t _readReg(uint8_t addr) | |
{ | |
uint8_t result; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(READ_REGSITER | addr); | |
result = SPI.transfer(NOP); | |
digitalWrite(PIN_nCS, HIGH); | |
return result; | |
} | |
void _readRegMultiLSB(uint8_t addr, uint8_t *buf, size_t len) | |
{ | |
uint8_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(READ_REGSITER | addr); | |
for (i=0; i<len; i++) { | |
buf[len-i-1] = SPI.transfer(NOP); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _writeReg(uint8_t addr, uint8_t val) | |
{ | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(WRITE_REGISTER | addr); | |
SPI.transfer(val); | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _writeRegMultiLSB(uint8_t addr, uint8_t *buf, size_t len) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(WRITE_REGISTER | addr); | |
for (i=0; i<len; i++) { | |
SPI.transfer(buf[len-i-1]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _issueCmd(uint8_t cmd) | |
{ | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _issueCmdPayload(uint8_t cmd, uint8_t *buf, size_t len) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
for (i=0; i<len; i++) { | |
SPI.transfer(buf[i]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _readCmdPayload(uint8_t cmd, uint8_t *buf, size_t len, size_t maxlen) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
for (i=0; i<len; i++) { | |
if (i < maxlen) { | |
buf[i] = SPI.transfer(NOP); | |
} else { | |
SPI.transfer(NOP); // Beyond maxlen bytes, just discard the remaining data. | |
} | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
uint8_t _writeRegPgmBuf(uint8_t * cmdbuf, uint8_t len) { | |
digitalWrite(PIN_nCS, LOW); | |
for (int i=0; i<len; i++) { | |
SPI.transfer(cmdbuf[i]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <RF75.h> | |
#include <SPI.h> | |
#include "I2C_SoftwareLibrary.h" | |
#define PIN_MOSI P1_7 | |
#define PIN_MISO P1_6 | |
#define PIN_CLK P1_5 | |
#define PIN_CE P3_5 | |
#define PIN_nCS P3_6 | |
#define PIN_IRQ P2_5 | |
#define PIN_SCL P1_3 | |
#define PIN_SDA P3_1 | |
#define PIN_RED_LED P2_7 | |
#define PIN_GREEN_LED P2_6 | |
#define _address 0x40 | |
uint8_t rf_status; | |
uint8_t payload[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD }; | |
//************ Bank1 register initialization commands | |
const uint8_t PROGMEM rfm73_bank1Init[][5] = { | |
// address data | |
{ (0x20|0x00), 0x40, 0x4B, 0x01, 0xE2 }, | |
{ (0x20|0x01), 0xC0, 0x4B, 0x00, 0x00 }, | |
{ (0x20|0x02), 0xD0, 0xFC, 0x8C, 0x02 }, | |
{ (0x20|0x03), 0x99, 0x00, 0x39, 0x41 }, | |
//{ (0x20|0x04), 0xb9, 0x9E, 0x86, 0x0B }, // b9? f9? | |
{ (0x20|0x04), 0xD9, 0x96, 0x82, 0x1B }, //new register for rfm73 b9? d9? | |
//{ (0x20|0x04), 0x1B, 0x82, 0x96, 0xD9 }, //new register for rfm73 b9? d9? | |
//{ (0x20|0x05), 0x24, 0x06, 0x7F, 0xA6 }, //original | |
//{ (0x20|0x05), 0x28, 0x02, 0x7F, 0xA6 }, //bank1 register 5 = rssi settings = -96dbm | |
{ (0x20|0x05), 0x3C, 0x02, 0x7F, 0xA6 }, //bank1 register 5 = rssi settings = -71dbm - best | |
{ (0x20|0x06), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x07), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x08), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x09), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0a), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0b), 0x00, 0x00, 0x00, 0x00 }, | |
{ (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 }, | |
//{ (0x20|0x0D), 0x36, 0xb4, 0x80, 0x00 } | |
{ (0x20|0x0D), 0x46, 0xb4, 0x80, 0x00 } | |
}; | |
//************ Bank1 register 14 initialization commands | |
const uint8_t PROGMEM rfm73_bank1R0EInit[] = { | |
// address Data... | |
(0x20|0x0E), 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF | |
}; | |
void setup() | |
{ | |
pinMode(PIN_RED_LED, OUTPUT); | |
pinMode(PIN_GREEN_LED, OUTPUT); | |
digitalWrite(PIN_GREEN_LED, LOW); | |
digitalWrite(PIN_RED_LED, HIGH); | |
pinMode(PIN_MOSI, OUTPUT); | |
pinMode(PIN_MISO, INPUT); | |
pinMode(PIN_CLK, OUTPUT); | |
pinMode(PIN_CE, OUTPUT); | |
pinMode(PIN_nCS, OUTPUT); | |
pinMode(PIN_IRQ, INPUT); | |
SPI.begin(); | |
SPI.setDataMode(SPI_MODE0); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.transfer(0); | |
_writeReg(CONFIG_REG, DISABLE_MAX_RT+PWR_UP); | |
_writeReg(EN_AA_REG, 0x00); | |
_writeReg(EN_RXADDR_REG, ERX_P0); | |
_writeReg(SETUP_ADDRESS_WIDTH_REG, W_5BYTES); | |
_writeReg(SETUP_AUTO_RETRANSMISSION_REG, 0x00); | |
_writeReg(RF_CHANNEL_REG, 0x00); | |
_writeReg(RF_SETUP_REG, DATA_RATE_1MBPS+RF_PWR_0+LNA_HIGH_GAIN); | |
_writeReg(STATUS_REG, RX_DATA_READY+TX_DATA_SENT+MAX_RETRANS+RX_FIFO_EMPTY); | |
_writeReg(DYNAMIC_PAYLOAD_REG, 0x00); | |
_writeReg(FEATURE_REG, 0x00); | |
_writeReg(RX_DATA_IN_P0, 4); | |
_writeReg(EN_RXADDR_REG, ERX_P0); | |
//Switch Bank | |
uint8_t _activate_data = 0x53; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
for (int i=0; i < 14; i++) | |
_writeRegPgmBuf((uint8_t *)rfm73_bank1Init[i], sizeof(rfm73_bank1Init[i])); | |
// set ramp curve | |
_writeRegPgmBuf((uint8_t *)rfm73_bank1R0EInit, sizeof(rfm73_bank1R0EInit)); | |
//Switch Bank | |
_activate_data = 0x53; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
_activate_data = 0x73; | |
_issueCmdPayload(ACTIVATE, &_activate_data, 1); | |
Serial.begin(9600); | |
Serial.println("RF75 TX Tester"); | |
digitalWrite(PIN_RED_LED, LOW); | |
//attachInterrupt(PIN_IRQ, rf75_isr, FALLING); | |
} | |
void loop() | |
{ | |
// put your main code here, to run repeatedly: | |
digitalWrite(PIN_GREEN_LED, HIGH); | |
sendPacket(); | |
digitalWrite(PIN_GREEN_LED, LOW); | |
_writeReg(CONFIG_REG,0x00); | |
sleep(5000); | |
_writeReg(CONFIG_REG,PWR_UP); | |
delay(5); | |
} | |
void sendPacket() | |
{ | |
_writeReg(STATUS_REG, MAX_RETRANS+RX_DATA_READY+TX_DATA_SENT+RX_FIFO_EMPTY); //clear flags | |
_issueCmd(FLUSH_RX); //Clear RX Fifo | |
_issueCmd(FLUSH_TX); //Clear TX Fifo | |
_issueCmdPayload(WRITE_TX_PAYLOAD, payload, 6); | |
digitalWrite(PIN_CE, HIGH); | |
delay(10); | |
digitalWrite(PIN_CE, LOW); | |
for (int q=0;q<=10;q++) | |
Serial.println(_readReg(OBSERVE_TX_REG),HEX); | |
} | |
void rf75_isr() | |
{ | |
Serial.println("IRQ"); | |
} | |
/* Basic SPI I/O */ | |
uint8_t _readReg(uint8_t addr) | |
{ | |
uint8_t result; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(READ_REGSITER | addr); | |
result = SPI.transfer(NOP); | |
digitalWrite(PIN_nCS, HIGH); | |
return result; | |
} | |
void _readRegMultiLSB(uint8_t addr, uint8_t *buf, size_t len) | |
{ | |
uint8_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(READ_REGSITER | addr); | |
for (i=0; i<len; i++) { | |
buf[len-i-1] = SPI.transfer(NOP); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _writeReg(uint8_t addr, uint8_t val) | |
{ | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(WRITE_REGISTER | addr); | |
SPI.transfer(val); | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _writeRegMultiLSB(uint8_t addr, uint8_t *buf, size_t len) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(WRITE_REGISTER | addr); | |
for (i=0; i<len; i++) { | |
SPI.transfer(buf[len-i-1]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _issueCmd(uint8_t cmd) | |
{ | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _issueCmdPayload(uint8_t cmd, uint8_t *buf, size_t len) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
for (i=0; i<len; i++) { | |
SPI.transfer(buf[i]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
void _readCmdPayload(uint8_t cmd, uint8_t *buf, size_t len, size_t maxlen) | |
{ | |
size_t i; | |
digitalWrite(PIN_nCS, LOW); | |
rf_status = SPI.transfer(cmd); | |
for (i=0; i<len; i++) { | |
if (i < maxlen) { | |
buf[i] = SPI.transfer(NOP); | |
} else { | |
SPI.transfer(NOP); // Beyond maxlen bytes, just discard the remaining data. | |
} | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} | |
uint8_t _writeRegPgmBuf(uint8_t * cmdbuf, uint8_t len) { | |
digitalWrite(PIN_nCS, LOW); | |
for (int i=0; i<len; i++) { | |
SPI.transfer(cmdbuf[i]); | |
} | |
digitalWrite(PIN_nCS, HIGH); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment