Custom SPI support

This commit is contained in:
Auri 2020-06-02 13:43:09 +02:00 committed by GitHub
parent 07c3e9ed16
commit 78447f61ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 51 additions and 47 deletions

View File

@ -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