From 50e297b3d622013735344d1118b66bbe0cb19a12 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Thu, 14 Dec 2017 23:41:14 +0100 Subject: [PATCH] Packet reading is now down in single SPI transaction --- .vscode/arduino.json | 2 +- crossbow.ino | 16 ++++++++++------ lora.cpp | 46 +++++++++++++++++++++++++++++++++++++--------- lora.h | 9 +++++++-- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index e0b924b..488acc1 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { "board": "bsfrance:avr:lora32u4", "sketch": "crossbow.ino", - "port": "COM17", + "port": "COM4", "output": "./build" } \ No newline at end of file diff --git a/crossbow.ino b/crossbow.ino index 39fc969..4870558 100644 --- a/crossbow.ino +++ b/crossbow.ino @@ -1,10 +1,10 @@ -#define DEVICE_MODE_TX -// #define DEVICE_MODE_RX +// #define DEVICE_MODE_TX +#define DEVICE_MODE_RX -#define FEATURE_TX_OLED -// #define FORCE_TX_WITHOUT_INPUT +// #define FEATURE_TX_OLED +#define FORCE_TX_WITHOUT_INPUT -// #define DEBUG_SERIAL +#define DEBUG_SERIAL // #define DEBUG_PING_PONG // #define DEBUG_LED @@ -263,10 +263,14 @@ void loop(void) { if (radioState.bytesToRead != NO_DATA_TO_READ) { + static uint8_t tmpBuffer[20]; + + LoRa.read(tmpBuffer, radioState.bytesToRead); for (int i = 0; i < radioState.bytesToRead; i++) { - qspDecodeIncomingFrame(&qsp, LoRa.fastRead(), &rxDeviceState, &txDeviceState, &radioState); + qspDecodeIncomingFrame(&qsp, tmpBuffer[i], &rxDeviceState, &txDeviceState, &radioState); } + radioState.rssi = getRadioRssi(); radioState.snr = getRadioSnr(); diff --git a/lora.cpp b/lora.cpp index 9ccb8d6..80b867e 100644 --- a/lora.cpp +++ b/lora.cpp @@ -208,12 +208,17 @@ float LoRaClass::packetSnr() return ((int8_t)readRegister(REG_PKT_SNR_VALUE)) * 0.25; } -size_t LoRaClass::write(uint8_t byte) +void LoRaClass::write(uint8_t data) { - return write(&byte, sizeof(byte)); + int currentLength = readRegister(REG_PAYLOAD_LENGTH); + + writeRegister(REG_FIFO, data); + + // update length + writeRegister(REG_PAYLOAD_LENGTH, currentLength + 1); } -size_t LoRaClass::write(const uint8_t *buffer, size_t size) +void LoRaClass::write(uint8_t buffer[], size_t size) { int currentLength = readRegister(REG_PAYLOAD_LENGTH); @@ -222,15 +227,10 @@ size_t LoRaClass::write(const uint8_t *buffer, size_t size) size = MAX_PKT_LENGTH - currentLength; } - // write data - for (size_t i = 0; i < size; i++) { - writeRegister(REG_FIFO, buffer[i]); - } + writeRegister(REG_FIFO, buffer, size); // update length writeRegister(REG_PAYLOAD_LENGTH, currentLength + size); - - return size; } int LoRaClass::available() @@ -244,6 +244,11 @@ int LoRaClass::fastRead() { return readRegister(REG_FIFO); } +void LoRaClass::read(uint8_t buffer[], uint8_t size) { + _packetIndex += size; + return readRegister(REG_FIFO, buffer, size); +} + int LoRaClass::read() { if (!available()) { @@ -498,6 +503,29 @@ uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value) return response; } +void LoRaClass::writeRegister(uint8_t address, uint8_t buffer[], size_t size) +{ + bufferTransfer(address | 0x80, buffer, size); +} + +void LoRaClass::readRegister(uint8_t address, uint8_t buffer[], size_t size) +{ + bufferTransfer(address & 0x7f, buffer, size); +} + +void LoRaClass::bufferTransfer(uint8_t address, uint8_t buffer[], uint8_t size) { + uint8_t response; + + digitalWrite(_ss, LOW); + + SPI.beginTransaction(_spiSettings); + SPI.transfer(address); + SPI.transfer(buffer, size); + SPI.endTransaction(); + + digitalWrite(_ss, HIGH); +} + void LoRaClass::onDio0Rise() { LoRa.handleDio0Rise(); diff --git a/lora.h b/lora.h index 2c237dd..17ca80d 100644 --- a/lora.h +++ b/lora.h @@ -30,11 +30,12 @@ public: int packetRssi(); float packetSnr(); - size_t write(uint8_t byte); - size_t write(const uint8_t *buffer, size_t size); + void write(uint8_t byte); + void write(uint8_t buffer[], size_t size); int available(); int read(); int fastRead(); + void read(uint8_t buffer[], uint8_t size); void onReceive(void(*callback)(int)); @@ -69,6 +70,10 @@ private: void writeRegister(uint8_t address, uint8_t value); uint8_t singleTransfer(uint8_t address, uint8_t value); + void readRegister(uint8_t address, uint8_t buffer[], size_t size); + void writeRegister(uint8_t address, uint8_t buffer[], size_t size); + void bufferTransfer(uint8_t address, uint8_t buffer[], uint8_t size); + static void onDio0Rise(); private: