Skip to content

Instantly share code, notes, and snippets.

@analog-io
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save analog-io/8f1c6c7e5a07fe11b44d to your computer and use it in GitHub Desktop.
Save analog-io/8f1c6c7e5a07fe11b44d to your computer and use it in GitHub Desktop.
HopeRF BringUp Code
#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);
}
#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