Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 8026

Beginners • LoRa Read FiFo Problems

$
0
0
Hi,

i try to get some data from my arduino to my raspi 3. I use 2 Arduinos 1 sender 1receiver.
Sender Sends and Receiver receives. everything is fine, I Using the LoRa.h lib for Arduino
thats my Sender Code

Code:

#include <SPI.h>#include <LoRa.h>int counter = 0;int SyncWord = 0x22;uint32_t  freq = 434E6;uint8_t   sf = 12;uint32_t  bw = 62.5E3;uint8_t   cr4 = 8;#define LORA_CS 10  // Chip Select Pin#define LORA_RESET 9  // Reset Pinvoid setup() {  Serial.begin(9600);  while (!Serial);  Serial.println("LoRa Sender");  // Set up LoRa  if (!LoRa.begin(freq)) {    Serial.println("Starting LoRa failed!");    while (1);  }  LoRa.setSpreadingFactor(sf);  // Set spreading factor (6-12)  LoRa.setSignalBandwidth(bw);   // Set bandwidth  LoRa.setCodingRate4(cr4);     // Set coding rate (4/5, 4/6, 4/7, 4/8)  LoRa.setSyncWord(SyncWord);   // Set sync word  // Optional: Reset the LoRa module to initialize it  pinMode(LORA_CS, OUTPUT);  pinMode(LORA_RESET, OUTPUT);  digitalWrite(LORA_CS, HIGH);  digitalWrite(LORA_RESET, LOW);  delay(10);  digitalWrite(LORA_RESET, HIGH);  delay(10);  Serial.println("LoRa Initialized");}void loop() {  // Example: Read the LoRa module's register 0x42 (Version)  //uint8_t regValue = LoRaReadRegister(0x42);  // Serial.println(regValue, HEX);  // Send data with LoRa  Serial.print("Sending packet: ");  Serial.println(counter);LoRa.beginPacket();LoRa.println("1234567890");  // Sendet exakt 9 BytesLoRa.endPacket();  counter++; Serial.print("Read Reg: "); Serial.println(LoRaReadRegister(0xD1));  delay(5000);  // Wait 5 seconds before sending next packet}uint8_t LoRaReadRegister(uint8_t reg) {  // Manually control SPI to read a register  digitalWrite(LORA_CS, LOW);  // Activate the LoRa module (chip select = LOW)  SPI.transfer(reg & 0x7F);     // Send the register address (bit 7 is 0 for read operation)  uint8_t regValue = SPI.transfer(0x00);  // Send 0x00 to read the value from the register  digitalWrite(LORA_CS, HIGH); // Deactivate the LoRa module (chip select = HIGH)  return regValue;}
Now same on Raspi but without external Libs.

i using wiring Pi and WiringPiSPI

the Communikation with the LoRa Ra02 Modul works while reaading Registers or set registers.

and i also receive some stuff

Arduino sends "1234567890"
Raspi receives "1234-$&/()=)/"

thats my Code

Code:

#include <stdio.h>#include <stdint.h>#include <wiringPi.h>#include <wiringPiSPI.h>#include <stdlib.h>// SPI-Einstellungen#define SPI_CHANNEL 0#define SPI_SPEED   200000// Pins (wiringPi-Nummerierung)// Hinweis: LORA_CS entspricht hier dem Chip Select Pin (BCM GPIO 6)#define LORA_CS  10#define LORA_RST 6// LoRa-Konfigurationint SyncWord = 0x22;uint32_t freq = 434E6;uint8_t  sf   = 12;uint32_t bw   = 62500;  // 62,5 kHzuint8_t  cr4  = 8;// --- SPI Lese- und Schreib-Funktionen ---// Liest ein Register über SPI (MSB=0 für Lesezugriff)uint8_t LoRa_Read(uint8_t reg) {    uint8_t buf[2] = { reg & 0x7F, 0x00 };    digitalWrite(LORA_CS, LOW);    wiringPiSPIDataRW(SPI_CHANNEL, buf, 2);    digitalWrite(LORA_CS, HIGH);    delay(10);    return buf[1];}// Schreibt einen Wert in ein Register (MSB=1 für Schreibzugriff)void LoRa_Write(uint8_t reg, uint8_t value) {    uint8_t buf[2] = { reg | 0x80, value };    digitalWrite(LORA_CS, LOW);    int ret = wiringPiSPIDataRW(SPI_CHANNEL, buf, 2);    digitalWrite(LORA_CS, HIGH);    if (ret == -1) {        printf("SPI Write error on register 0x%X\n", reg);    }    delay(10);    printf("Write 0x%X: 0x%X\n", reg, value);}// Liest den aktuellen IRQ-Status (Register 0x12)uint8_t LoRa_State(){    return LoRa_Read(0x12);}// --- Initialisierung und Testfunktionen ---// Testet, ob das LoRa-Modul reagiert (Version sollte 0x12 sein)int LoRa_Test() {    uint8_t version = LoRa_Read(0x42); // RegVersion (0x42)    printf("LoRa Version: 0x%02X\n", version);    if (version != 0x12) {        printf("Fehler: LoRa-Modul antwortet nicht korrekt! Version: 0x%02X\n", version);        return 0;    }    printf("LoRa-Modul reagiert korrekt.\n");    return 1;}// Setzt den LoRa-Modus (R = Receive, T = Transmit, S = Standby)void LoRa_Mode(uint8_t Mode) {    switch (Mode) {        case 'R':  // Empfangsmodus            // Zuerst in Sleep-Modus, dann RX-Modus (z. B. kontinuierlicher Empfang)            LoRa_Write(0x01, 0x80);  // Sleep-Modus            delay(10);            LoRa_Write(0x01, 0x85);  // RX-Modus (kontinuierlich)            delay(10);            break;        case 'T':  // Sendemodus            LoRa_Write(0x01, 0x80);  // Sleep-Modus            delay(10);            LoRa_Write(0x01, 0x83);  // TX-Modus            delay(10);            break;        case 'S':  // Standby-Modus            LoRa_Write(0x01, 0x81);  // Standby im LoRa-Modus            delay(10);            break;        default:            printf("Unbekannter Modus: %c\n", Mode);            return;    }    uint8_t returnMode = LoRa_Read(0x01);    printf("Set LoRaMode to: 0x%02X\n", returnMode);    printf("State: 0x%02X\n", LoRa_State());}// Initialisiert das LoRa-Modulvoid LoRa_Init() {    // Zunächst in Sleep-Modus wechseln, damit Konfigurationen sicher vorgenommen werden können    LoRa_Write(0x01, 0x80);  // Sleep-Modus    delay(20);        // Frequenz einstellen: Beispiel 434 MHz = 0x6C8000    LoRa_Write(0x06, 0x6C);  // Frequency MSB    LoRa_Write(0x07, 0x80);  // Frequency MID    LoRa_Write(0x08, 0x00);  // Frequency LSB    // Modem-Konfiguration:    // Register 0x1D: Bandbreite und Coding Rate (62,5 kHz, CR 4/8)    LoRa_Write(0x1D, 0x68);    // Register 0x1E: Spreading Factor 12, CRC aktiv (0xC4 = 11000100)    LoRa_Write(0x1E, 0xC4);    // SyncWord setzen    LoRa_Write(0x39, SyncWord);    // Anschließend in Standby-Modus wechseln    LoRa_Write(0x01, 0x81);    delay(20);    // Test des LoRa-Moduls    if (!LoRa_Test()) {        printf("LoRa-Test fehlgeschlagen. Beende Programm...\n");        exit(1);    }}// Burst-Lesezugriff auf den FIFO (Register 0x00)// Liest 'length' Bytes in einem einzigen SPI-Transfer in 'buffer'void LoRa_BurstReadFIFO(uint8_t *buffer, int length) {    uint8_t spiBuffer[length + 1];    spiBuffer[0] = 0x00;  // FIFO-Adresse (0x00) für Lesezugriff (MSB=0)    digitalWrite(LORA_CS, LOW);    wiringPiSPIDataRW(SPI_CHANNEL, spiBuffer, length + 1);    digitalWrite(LORA_CS, HIGH);    for (int i = 0; i < length; i++) {        buffer[i] = spiBuffer[i + 1];    }}// --- Empfangsfunktion mit verbesserter Fehlerprüfung ---void LoRa_Receive() {    uint8_t irq;    int packetSize = 0;    uint32_t startTime = millis();    uint32_t timeout = 10000;  // Timeout von 10 Sekunden    // Wechsel in den Empfangsmodus    LoRa_Mode('R');    printf("Warte auf Empfang...\n");    // Warten, bis RxDone (Bit 6 in Register 0x12) gesetzt ist oder Timeout erreicht wird    do {        irq = LoRa_Read(0x12);        if (irq & 0x40) {  // RxDone            break;        }        delay(50);    } while (millis() - startTime < timeout);        if (!(irq & 0x40)) {        printf("Timeout: Kein Paket empfangen.\n");        return;    }        // Prüfen, ob ein CRC-Fehler vorliegt (Bit 5 in Register 0x12)    if (irq & 0x20) {        printf("Empfangenes Paket hat einen CRC-Fehler.\n");        LoRa_Write(0x12, 0xFF);  // IRQ-Flags zurücksetzen        return;    }        // Lese die Payload-Länge aus Register 0x13 (expliziter Header)    packetSize = LoRa_Read(0x13);    printf("Payload Length: %d\n", packetSize);        // Payload-Länge validieren (muss zwischen 1 und 255 liegen)    if (packetSize <= 0 || packetSize > 255) {        printf("Ungültige Payload-Länge: %d\n", packetSize);        LoRa_Write(0x12, 0xFF);  // IRQ-Flags zurücksetzen        return;    }        uint8_t payload[256];    delay(10); // Kurzer Delay zur Stabilisierung    // Auslesen des FIFO-Inhalts (Burst Read)    LoRa_BurstReadFIFO(payload, packetSize);        // Ausgabe der empfangenen Bytes als Hex    printf("Empfangene Bytes: ");    for (int i = 0; i < packetSize; i++) {        printf("0x%02X ", payload[i]);    }    printf("\n");        // Ausgabe als String (sofern ASCII-kodiert)    printf("Empfangene Nachricht: '");    for (int i = 0; i < packetSize; i++) {        printf("%c", payload[i]);    }    printf("'\n");        // Ausgabe des RSSI-Werts    printf("Empfangene RSSI: %d\n", LoRa_Read(0x1A));        // IRQ-Flags zurücksetzen    LoRa_Write(0x12, 0xFF);}// --- Sendefunktion ---void LoRa_Send(uint8_t *data, uint8_t length) {    // Setze die Payload-Länge im entsprechenden Register    LoRa_Write(0x22, length);    printf("Schreibe FIFO-Daten: '%s' mit Länge: %d\n", data, length);    for (int i = 0; i < length; i++) {        printf("data[%d]: 0x%02X\n", i, data[i]);        LoRa_Write(0x00, data[i]);  // Schreibe in das FIFO (Register 0x00)    }    delay(10);    // Wechsel in den Sendemodus    LoRa_Mode('T');    // Warte, bis das Senden abgeschlossen ist (TxDone, Bit 3 in Register 0x12)    while (!(LoRa_Read(0x12) & 0x08)) {        delay(10);    }    // IRQ-Flag für TxDone zurücksetzen    LoRa_Write(0x12, 0x08);    printf("Gesendet: '%s'\n", data);}int main() {    // WiringPi initialisieren und SPI einrichten    wiringPiSetup();    wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED);    // CS- und RST-Pins konfigurieren    pinMode(LORA_CS, OUTPUT);    pinMode(LORA_RST, OUTPUT);    digitalWrite(LORA_CS, HIGH);    // Hardware-Reset des LoRa-Moduls    digitalWrite(LORA_RST, HIGH);    delay(100);    digitalWrite(LORA_RST, LOW);    delay(100);    digitalWrite(LORA_RST, HIGH);    delay(100);    // Initialisiere das LoRa-Modul    LoRa_Init();    uint8_t message[] = "Hallo LoRa!";    int counter = 0;    while (1) {        printf("Debug Print: %d\n", counter++);        // Ausgabe einiger Register zur Überprüfung        printf("0x13 (Payload Length): 0x%X\n", LoRa_Read(0x13));        printf("0x06 (Freq MSB): 0x%X\n", LoRa_Read(0x06));        printf("0x07 (Freq MID): 0x%X\n", LoRa_Read(0x07));        printf("0x08 (Freq LSB): 0x%X\n", LoRa_Read(0x08));        printf("0x1E (Modem Config 2): 0x%X\n", LoRa_Read(0x1E));        printf("0x1D (Modem Config 1): 0x%X\n", LoRa_Read(0x1D));        printf("0x39 (SyncWord): 0x%X\n", LoRa_Read(0x39));        printf("0x01 (OpMode): 0x%X\n", LoRa_Read(0x01));        printf("0x12 (IRQ Flags): 0x%X\n", LoRa_Read(0x12));        // Nachricht senden (optional)        // LoRa_Send(message, sizeof(message) - 1);        delay(300);        // Empfange ein Paket        LoRa_Receive();        delay(1000);  // 1 Sekunde Pause    }    return 0;}
I dont have any idea about that problem, maybe you got one.

Statistics: Posted by Mathrim — Fri Mar 21, 2025 12:18 pm



Viewing all articles
Browse latest Browse all 8026

Trending Articles