Fixed SPI mode with LoRa32u4 II

This commit is contained in:
Pawel Spychalski (DzikuVx)
2017-10-20 22:47:46 +02:00
parent 021decff98
commit 810abc14eb
5 changed files with 95 additions and 26 deletions

View File

@@ -1,6 +1,6 @@
{ {
"board": "bsfrance:avr:lora32u4", "board": "bsfrance:avr:lora32u4",
"sketch": "crossbow.ino", "sketch": "crossbow.ino",
"port": "COM23", "port": "COM15",
"output": "./build" "output": "./build"
} }

View File

@@ -1,5 +1,8 @@
{ {
"files.associations": { "files.associations": {
"variables.h": "c" "variables.h": "c"
},
"files.exclude": {
"**/build": true
} }
} }

View File

@@ -8,17 +8,30 @@ TODO
* Some kind of alarm when RSSI goes LOW * Some kind of alarm when RSSI goes LOW
* ability for RX and TX to change frequency * ability for RX and TX to change frequency
* serial passtrough (?) * serial passtrough (?)
FIXME
* RX canTransmit is always false. For unknown reason first received frame does not enables it
*/ */
#include <LoRa.h> #include <LoRa.h>
#include "variables.h" #include "variables.h"
#include "qsp.h" #include "qsp.h"
#define DEBUG_SERIAL
#define DEBUG_LED
#define WAIT_FOR_SERIAL
// #define LORA_HARDWARE_SERIAL // #define LORA_HARDWARE_SERIAL
#define LORA_HARDWARE_SPI #define LORA_HARDWARE_SPI
// #define DEVICE_MODE_TX #define DEVICE_MODE_TX
#define DEVICE_MODE_RX // #define DEVICE_MODE_RX
// LoRa32u4 ports
#define SS 8
#define RST 4
#define DI0 7
int ppm[PPM_CHANNEL_COUNT] = {0}; int ppm[PPM_CHANNEL_COUNT] = {0};
@@ -30,8 +43,6 @@ int ppm[PPM_CHANNEL_COUNT] = {0};
#include <PPMReader.h> #include <PPMReader.h>
PPMReader ppmReader(PPM_INPUT_PIN, PPM_INPUT_INTERRUPT); PPMReader ppmReader(PPM_INPUT_PIN, PPM_INPUT_INTERRUPT);
bool canTransmit = true;
#endif #endif
/* /*
@@ -39,12 +50,10 @@ bool canTransmit = true;
*/ */
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
#include <Adafruit_SSD1306.h> // #include <Adafruit_SSD1306.h>
#define OLED_RESET 4 // #define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET); // Adafruit_SSD1306 display(OLED_RESET);
bool canTransmit = false;
#endif #endif
@@ -118,6 +127,8 @@ void radioPacketStart(void)
void radioPacketEnd(void) void radioPacketEnd(void)
{ {
LoRa.endPacket(); LoRa.endPacket();
//After ending packet, put device into receive mode again
LoRa.receive();
} }
void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp) void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
@@ -154,27 +165,48 @@ void setup(void)
#endif #endif
#ifdef LORA_HARDWARE_SPI #ifdef LORA_HARDWARE_SPI
Serial.begin(115200);
#ifdef WAIT_FOR_SERIAL
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
#endif
#ifdef DEBUG_SERIAL
Serial.println("Start");
#endif
LoRa.setPins(SS,RST,DI0);
#ifdef DEBUG_SERIAL
Serial.println("Pins Set");
#endif
if (!LoRa.begin(868E6)) if (!LoRa.begin(868E6))
{ {
#ifdef DEBUG_SERIAL
Serial.println("LoRa init failed. Check your connections."); Serial.println("LoRa init failed. Check your connections.");
while (true) #endif
; while (true);
} }
#ifdef DEBUG_SERIAL
Serial.println("Init done");
#endif
LoRa.onReceive(onReceive); LoRa.onReceive(onReceive);
LoRa.receive(); LoRa.receive();
#ifdef DEBUG_SERIAL
Serial.println("Receive mode enabled");
#endif
#endif #endif
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
pinMode(PIN_LED, OUTPUT);
/* /*
* Initialize OLED display * Initialize OLED display
*/ */
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) // display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
display.setTextSize(1); // display.setTextSize(1);
display.setTextColor(WHITE); // display.setTextColor(WHITE);
display.clearDisplay(); // display.clearDisplay();
display.display(); // display.display();
//initiallize default ppm values //initiallize default ppm values
for (int i = 0; i < PPM_CHANNEL_COUNT; i++) for (int i = 0; i < PPM_CHANNEL_COUNT; i++)
@@ -196,6 +228,12 @@ void setup(void)
sei(); sei();
#endif #endif
pinMode(LED_BUILTIN, OUTPUT);
// #ifdef DEVICE_MODE_TX
qsp.canTransmit = true;
// #endif
} }
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
@@ -292,13 +330,29 @@ void loop(void)
} }
#endif #endif
if (canTransmit && transmitPayload) if (qsp.canTransmit && transmitPayload)
{ {
transmitPayload = false; transmitPayload = false;
radioPacketStart(); radioPacketStart();
qspEncodeFrame(&qsp); qspEncodeFrame(&qsp);
radioPacketEnd(); radioPacketEnd();
#ifdef DEBUG_SERIAL
Serial.print("Packet frame ");
Serial.print(qsp.frameToSend);
Serial.println(" sent");
#endif
#ifdef DEBUG_LED
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
digitalWrite(LED_BUILTIN, LOW);
delay(70);
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
digitalWrite(LED_BUILTIN, LOW);
#endif
} }
/* /*

19
qsp.cpp
View File

@@ -201,10 +201,10 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
if (qsp->crc == incomingByte) { if (qsp->crc == incomingByte) {
//CRC is correct //CRC is correct
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
//If devide received a valid frame, that means it can start to talk //If devide received a valid frame, that means it can start to talk
canTransmit = true; qsp->canTransmit = true;
#endif #endif
//Store the last timestamp when frame was received //Store the last timestamp when frame was received
if (frameId < QSP_FRAME_COUNT) { if (frameId < QSP_FRAME_COUNT) {
@@ -213,6 +213,19 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
qsp->lastReceivedPacketId = packetId; qsp->lastReceivedPacketId = packetId;
#ifdef DEBUG_SERIAL
Serial.print("Frame ");
Serial.print(frameId);
Serial.println(" received");
#endif
#ifdef DEBUG_LED
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
#endif
switch (frameId) { switch (frameId) {
case QSP_FRAME_RC_DATA: case QSP_FRAME_RC_DATA:
qspDecodeRcDataFrame(qsp, ppm); qspDecodeRcDataFrame(qsp, ppm);

View File

@@ -21,8 +21,6 @@
#define QSP_FRAME_SET_RX_CONFIG 0x4 #define QSP_FRAME_SET_RX_CONFIG 0x4
#define QSP_FRAME_COUNT 0x5 #define QSP_FRAME_COUNT 0x5
#define PIN_LED 13
enum dataStates { enum dataStates {
QSP_STATE_IDLE, QSP_STATE_IDLE,
QSP_STATE_PREAMBLE_RECEIVED, QSP_STATE_PREAMBLE_RECEIVED,
@@ -57,6 +55,7 @@ struct QspConfiguration_t {
uint8_t deviceState = DEVICE_STATE_OK; uint8_t deviceState = DEVICE_STATE_OK;
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*); void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
uint8_t lastReceivedPacketId = 0; uint8_t lastReceivedPacketId = 0;
bool canTransmit = false;
}; };
struct RxDeviceState_t { struct RxDeviceState_t {