Custom SPI support
This commit is contained in:
parent
07c3e9ed16
commit
78447f61ef
98
RFM69.cpp
98
RFM69.cpp
|
|
@ -41,7 +41,7 @@ uint8_t RFM69::ACK_RECEIVED; // should be polled immediately after sending a pac
|
|||
int16_t RFM69::RSSI; // most accurate RSSI during reception (closest to the reception)
|
||||
volatile bool RFM69::_haveData;
|
||||
|
||||
RFM69::RFM69(uint8_t slaveSelectPin, uint8_t interruptPin, bool isRFM69HW)
|
||||
RFM69::RFM69(uint8_t slaveSelectPin, uint8_t interruptPin, bool isRFM69HW, SPIClass *spi)
|
||||
{
|
||||
_slaveSelectPin = slaveSelectPin;
|
||||
_interruptPin = interruptPin;
|
||||
|
|
@ -49,6 +49,7 @@ RFM69::RFM69(uint8_t slaveSelectPin, uint8_t interruptPin, bool isRFM69HW)
|
|||
_spyMode = false;
|
||||
_powerLevel = 31;
|
||||
_isRFM69HW = isRFM69HW;
|
||||
_spi = spi;
|
||||
#if defined(RF69_LISTENMODE_ENABLE)
|
||||
_isHighSpeed = true;
|
||||
_haveEncryptKey = false;
|
||||
|
|
@ -111,13 +112,16 @@ bool RFM69::initialize(uint8_t freqBand, uint16_t nodeID, uint8_t networkID)
|
|||
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
pinMode(_slaveSelectPin, OUTPUT);
|
||||
if(_spi == nullptr){
|
||||
_spi = &SPI;
|
||||
}
|
||||
#if defined(ESP32)
|
||||
SPI.begin(18,19,23,5); //SPI3 (SCK,MISO,MOSI,CS)
|
||||
//SPI.begin(14,12,13,15); //SPI2 (SCK,MISO,MOSI,CS)
|
||||
_spi->begin(18,19,23,5); //SPI3 (SCK,MISO,MOSI,CS)
|
||||
//_spi->begin(14,12,13,15); //SPI2 (SCK,MISO,MOSI,CS)
|
||||
#else
|
||||
SPI.begin();
|
||||
#endif
|
||||
|
||||
_spi->begin();
|
||||
#endif
|
||||
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
_settings = SPISettings(8000000, MSBFIRST, SPI_MODE0);
|
||||
#endif
|
||||
|
|
@ -325,14 +329,14 @@ void RFM69::sendFrame(uint16_t toAddress, const void* buffer, uint8_t bufferSize
|
|||
|
||||
// write to FIFO
|
||||
select();
|
||||
SPI.transfer(REG_FIFO | 0x80);
|
||||
SPI.transfer(bufferSize + 3);
|
||||
SPI.transfer((uint8_t)toAddress);
|
||||
SPI.transfer((uint8_t)_address);
|
||||
SPI.transfer(CTLbyte);
|
||||
_spi->transfer(REG_FIFO | 0x80);
|
||||
_spi->transfer(bufferSize + 3);
|
||||
_spi->transfer((uint8_t)toAddress);
|
||||
_spi->transfer((uint8_t)_address);
|
||||
_spi->transfer(CTLbyte);
|
||||
|
||||
for (uint8_t i = 0; i < bufferSize; i++)
|
||||
SPI.transfer(((uint8_t*) buffer)[i]);
|
||||
_spi->transfer(((uint8_t*) buffer)[i]);
|
||||
unselect();
|
||||
|
||||
// no need to wait for transmit mode to be ready since its handled by the radio
|
||||
|
|
@ -349,12 +353,12 @@ void RFM69::interruptHandler() {
|
|||
{
|
||||
setMode(RF69_MODE_STANDBY);
|
||||
select();
|
||||
SPI.transfer(REG_FIFO & 0x7F);
|
||||
PAYLOADLEN = SPI.transfer(0);
|
||||
_spi->transfer(REG_FIFO & 0x7F);
|
||||
PAYLOADLEN = _spi->transfer(0);
|
||||
PAYLOADLEN = PAYLOADLEN > 66 ? 66 : PAYLOADLEN; // precaution
|
||||
TARGETID = SPI.transfer(0);
|
||||
SENDERID = SPI.transfer(0);
|
||||
uint8_t CTLbyte = SPI.transfer(0);
|
||||
TARGETID = _spi->transfer(0);
|
||||
SENDERID = _spi->transfer(0);
|
||||
uint8_t CTLbyte = _spi->transfer(0);
|
||||
TARGETID |= (uint16_t(CTLbyte) & 0x0C) << 6; //10 bit address (most significant 2 bits stored in bits(2,3) of CTL byte
|
||||
SENDERID |= (uint16_t(CTLbyte) & 0x03) << 8; //10 bit address (most sifnigicant 2 bits stored in bits(0,1) of CTL byte
|
||||
|
||||
|
|
@ -372,7 +376,7 @@ void RFM69::interruptHandler() {
|
|||
ACK_REQUESTED = CTLbyte & RFM69_CTL_REQACK; // extract ACK-requested flag
|
||||
interruptHook(CTLbyte); // TWS: hook to derived class interrupt function
|
||||
|
||||
for (uint8_t i = 0; i < DATALEN; i++) DATA[i] = SPI.transfer(0);
|
||||
for (uint8_t i = 0; i < DATALEN; i++) DATA[i] = _spi->transfer(0);
|
||||
|
||||
DATA[DATALEN] = 0; // add null at end of string // add null at end of string
|
||||
unselect();
|
||||
|
|
@ -435,9 +439,9 @@ void RFM69::encrypt(const char* key) {
|
|||
memcpy(_encryptKey, key, 16);
|
||||
#endif
|
||||
select();
|
||||
SPI.transfer(REG_AESKEY1 | 0x80);
|
||||
_spi->transfer(REG_AESKEY1 | 0x80);
|
||||
for (uint8_t i = 0; i < 16; i++)
|
||||
SPI.transfer(key[i]);
|
||||
_spi->transfer(key[i]);
|
||||
unselect();
|
||||
}
|
||||
writeReg(REG_PACKETCONFIG2, (readReg(REG_PACKETCONFIG2) & 0xFE) | (key ? 1 : 0));
|
||||
|
|
@ -460,8 +464,8 @@ int16_t RFM69::readRSSI(bool forceTrigger) {
|
|||
uint8_t RFM69::readReg(uint8_t addr)
|
||||
{
|
||||
select();
|
||||
SPI.transfer(addr & 0x7F);
|
||||
uint8_t regval = SPI.transfer(0);
|
||||
_spi->transfer(addr & 0x7F);
|
||||
uint8_t regval = _spi->transfer(0);
|
||||
unselect();
|
||||
return regval;
|
||||
}
|
||||
|
|
@ -469,8 +473,8 @@ uint8_t RFM69::readReg(uint8_t addr)
|
|||
void RFM69::writeReg(uint8_t addr, uint8_t value)
|
||||
{
|
||||
select();
|
||||
SPI.transfer(addr | 0x80);
|
||||
SPI.transfer(value);
|
||||
_spi->transfer(addr | 0x80);
|
||||
_spi->transfer(value);
|
||||
unselect();
|
||||
}
|
||||
|
||||
|
|
@ -483,15 +487,15 @@ void RFM69::select() {
|
|||
#endif
|
||||
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
SPI.beginTransaction(_settings);
|
||||
_spi->beginTransaction(_settings);
|
||||
#else
|
||||
// set RFM69 SPI settings explicitly
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
_spi->setDataMode(SPI_MODE0);
|
||||
_spi->setBitOrder(MSBFIRST);
|
||||
#ifdef defined(__SAMD51__)
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV16);
|
||||
_spi->setClockDivider(SPI_CLOCK_DIV16);
|
||||
#else
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV2);
|
||||
_spi->setClockDivider(SPI_CLOCK_DIV2);
|
||||
#endif
|
||||
#endif
|
||||
digitalWrite(_slaveSelectPin, LOW);
|
||||
|
|
@ -501,7 +505,7 @@ void RFM69::select() {
|
|||
void RFM69::unselect() {
|
||||
digitalWrite(_slaveSelectPin, HIGH);
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
SPI.endTransaction();
|
||||
_spi->endTransaction();
|
||||
#endif
|
||||
// restore SPI settings to what they were before talking to RFM69
|
||||
#if defined (SPCR) && defined (SPSR)
|
||||
|
|
@ -573,8 +577,8 @@ void RFM69::readAllRegs()
|
|||
for (uint8_t regAddr = 1; regAddr <= 0x4F; regAddr++)
|
||||
{
|
||||
select();
|
||||
SPI.transfer(regAddr & 0x7F); // send address + r/w bit
|
||||
regVal = SPI.transfer(0);
|
||||
_spi->transfer(regAddr & 0x7F); // send address + r/w bit
|
||||
regVal = _spi->transfer(0);
|
||||
unselect();
|
||||
|
||||
Serial.print(regAddr, HEX);
|
||||
|
|
@ -1053,10 +1057,10 @@ void RFM69::listenModeInterruptHandler(void)
|
|||
|
||||
burstRemaining.l = 0;
|
||||
|
||||
SPI.transfer(REG_FIFO & 0x7F);
|
||||
PAYLOADLEN = SPI.transfer(0);
|
||||
_spi->transfer(REG_FIFO & 0x7F);
|
||||
PAYLOADLEN = _spi->transfer(0);
|
||||
PAYLOADLEN = PAYLOADLEN > 64 ? 64 : PAYLOADLEN; // precaution
|
||||
TARGETID = SPI.transfer(0);
|
||||
TARGETID = _spi->transfer(0);
|
||||
if(!(_spyMode || TARGETID == _address || TARGETID == RF69_BROADCAST_ADDR) // match this node's address, or broadcast address or anything in spy mode
|
||||
|| PAYLOADLEN < 3) // address situation could receive packets that are malformed and don't fit this library's extra fields
|
||||
{
|
||||
|
|
@ -1066,13 +1070,13 @@ void RFM69::listenModeInterruptHandler(void)
|
|||
|
||||
// We've read the target, and will read the sender id and two time offset bytes for a total of 4 bytes
|
||||
DATALEN = PAYLOADLEN - 4;
|
||||
SENDERID = SPI.transfer(0);
|
||||
burstRemaining.b[0] = SPI.transfer(0); // and get the time remaining
|
||||
burstRemaining.b[1] = SPI.transfer(0);
|
||||
SENDERID = spi->transfer(0);
|
||||
burstRemaining.b[0] = _spi->transfer(0); // and get the time remaining
|
||||
burstRemaining.b[1] = _spi->transfer(0);
|
||||
RF69_LISTEN_BURST_REMAINING_MS = burstRemaining.l;
|
||||
|
||||
for (uint8_t i = 0; i < DATALEN; i++)
|
||||
DATA[i] = SPI.transfer(0);
|
||||
DATA[i] = _spi->transfer(0);
|
||||
|
||||
if (DATALEN < RF69_MAX_DATA_LEN)
|
||||
DATA[DATALEN] = 0; // add null at end of string
|
||||
|
|
@ -1179,17 +1183,17 @@ void RFM69::listenModeSendBurst( uint8_t targetNode, const void* buffer, uint8_t
|
|||
noInterrupts();
|
||||
// write to FIFO
|
||||
select();
|
||||
SPI.transfer(REG_FIFO | 0x80);
|
||||
SPI.transfer(size + 4); // two bytes for target and sender node, two bytes for the burst time remaining
|
||||
SPI.transfer(targetNode);
|
||||
SPI.transfer(_address);
|
||||
_spi->transfer(REG_FIFO | 0x80);
|
||||
_spi->transfer(size + 4); // two bytes for target and sender node, two bytes for the burst time remaining
|
||||
_spi->transfer(targetNode);
|
||||
_spi->transfer(_address);
|
||||
|
||||
// We send the burst time remaining with the packet so the receiver knows how long to wait before trying to reply
|
||||
SPI.transfer(timeRemaining.b[0]);
|
||||
SPI.transfer(timeRemaining.b[1]);
|
||||
_spi->transfer(timeRemaining.b[0]);
|
||||
_spi->transfer(timeRemaining.b[1]);
|
||||
|
||||
for (uint8_t i = 0; i < size; i++) {
|
||||
SPI.transfer(((uint8_t*) buffer)[i]);
|
||||
_spi->transfer(((uint8_t*) buffer)[i]);
|
||||
}
|
||||
|
||||
unselect();
|
||||
|
|
@ -1202,4 +1206,4 @@ void RFM69::listenModeSendBurst( uint8_t targetNode, const void* buffer, uint8_t
|
|||
setMode(RF69_MODE_STANDBY);
|
||||
reinitRadio();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue