E220-400m22s на SPI или есть ли жизнь после UART

,

Всем привет!

Позволил себе создать тему а то стрые ветки похоже никто не читает.

И так собственно вопрос по управлению модулем E220-400m22s и в перспективе E220-400m30s по SPI, ибо по UARTу у меня железа нет.

Накупил я как то по случаю не дорого этих модулей на чипах llcc68. Использую интерфейс SPI, управление DIO1, TXEN, RXEN. Параметры модуляции LORA одинаковые в рамках доступных для чипа llcc68. В рассмотрении просто передача и прием байта информации при нажатии кнопки.

И как оказалось на простом месте возникли не простые проблемы. Из бибилиотек RadioLib и SX126x-Arduino которые я пытался использовать ни одна не дала мне связи и передачи данных.

Передача сигнала есть -видно на SDR приемнике , а приема пакетов нет вообще. В радиолибе RSSI всегда мертвый (как оказалось известная проблема) передача есть, в SX126x-Arduino, RSSI работает (реагирует на передачу) но приема пакетов нет.

Курю свой гугл и вижу что никто в мире похоже не запустил модуль через SPI на прием-нет какого либо рабочего кода (может конечно мой гугл под санкциями :slightly_smiling_face: ).

Собственно говоря пока не вдаваясь в дебри кода, коего у меня накопилось сотни килобайт наверно , хочется узнать кто нибудь копал эту тему? Потому что простых советов ИМХО тут не предвидится. Хотя…

Turb0user так в чем собственно проблема то ?
могу предложить написать прием по uart, и переотправку через spi, с последующим преобразованием в текст

а еще мой хрустальный шар говорит посмотри его код, давай поржем, он там наверняка не переключает пины TXEN, RXEN для приема и передачи…
может скинете хоть какой то ? я конечно никому не верю, и даже шару, по этому хотелось бы посмотреть на попытки, и убедиться что они были…

@BABOS , денег проси!
Насколько я помню тему, поднималась она не раз, и каждый раз кончалась скандалом, когда выяснялось, что авторы либо не умеют программировать, или не читают даташит

Спасибо BABOS.
Борода про шар всегда уместна и улыбает :slightly_smiling_face:
И так, в этом коде есть передача, ее видно на SDR, что важно т. к. иногда консоль пишет а эфир молчит.
RSSI приемлемый -88dbm но похоже мертвый, хотя при работе на передачу соседнего модуля падает до-17dbm и не поднимается назад.. Приема пакетов разумеется нет. Контроль TXEN RXEN.

#include <Arduino.h>
#include <SPI.h>
#include <RadioLib.h>

// ==================== ПИНЫ ====================
#define PIN_NSS     PA4
#define PIN_SCK     PA5
#define PIN_MOSI    PA7
#define PIN_MISO    PA6
#define PIN_BUSY    PA1
#define PIN_DIO1    PB0
#define PIN_NRST    PA2
#define PIN_TXEN    PB10
#define PIN_RXEN    PB2
#define PIN_PTT     PA3
#define PIN_LED     PC13

LLCC68 radio = new Module(PIN_NSS, PIN_DIO1, PIN_NRST, PIN_BUSY);

// ==================== ПЕРЕМЕННЫЕ ====================
bool radioReady = false;
bool pttActive = false;
uint32_t packetCount = 0;
uint32_t rxCount = 0;
uint32_t lastRssiPrint = 0;

// ==================== УПРАВЛЕНИЕ ПЕРЕКЛЮЧАТЕЛЕМ ====================
void setTxenRxen(bool txen, bool rxen) {
    digitalWrite(PIN_TXEN, txen ? HIGH : LOW);
    digitalWrite(PIN_RXEN, rxen ? HIGH : LOW);
    delayMicroseconds(10);
}

// ==================== ИНИЦИАЛИЗАЦИЯ РАДИО ====================
void initRadio() {
    Serial.println("");
    Serial.println("=== RADIO INIT ===");
    
    pinMode(PIN_TXEN, OUTPUT);
    pinMode(PIN_RXEN, OUTPUT);
    setTxenRxen(false, true);
    
    pinMode(PIN_NRST, OUTPUT);
    digitalWrite(PIN_NRST, LOW);
    delay(10);
    digitalWrite(PIN_NRST, HIGH);
    delay(100);
    
    pinMode(PIN_NSS, OUTPUT);
    digitalWrite(PIN_NSS, HIGH);
    pinMode(PIN_BUSY, INPUT);
    pinMode(PIN_DIO1, INPUT);
    
    SPI.begin();
    
    int state = radio.begin();
    Serial.print("radio.begin(): ");
    Serial.println(state);
    
    if (state != RADIOLIB_ERR_NONE) {
        radioReady = false;
        Serial.println("Radio FAILED");
        return;
    }
    
    radio.setFrequency(433.9);
    radio.setBandwidth(125.0);
    radio.setSpreadingFactor(9);
    radio.setCodingRate(7);
    radio.setSyncWord(0x1424);
    radio.setOutputPower(22);
    radio.setPreambleLength(8);
    radio.setCRC(true);
    
    radio.standby();
    delay(1);
    radio.startReceive();
    
    radioReady = true;
    
    Serial.println("Radio OK");
    Serial.println("Radio in RX mode");
    
    float rssi = radio.getRSSI();
    Serial.print("RSSI: ");
    Serial.print(rssi);
    Serial.println(" dBm");
    
    Serial.println("=== RADIO READY ===");
    Serial.println("");
}

// ==================== ОТПРАВКА ПАКЕТА ====================
void sendPacket() {
    if (!radioReady) return;
    
    packetCount++;
    char data[32];
    sprintf(data, "PKT #%lu", packetCount);
    
    Serial.print("Sending: ");
    Serial.println(data);
    
    setTxenRxen(true, false);
    delay(1);
    
    int state = radio.transmit(data);
    
    radio.standby();
    delay(1);
    setTxenRxen(false, true);
    radio.startReceive();
    
    if (state == RADIOLIB_ERR_NONE) {
        Serial.println("Sent OK");
        digitalWrite(PIN_LED, HIGH);
    } else {
        Serial.print("Send error: ");
        Serial.println(state);
    }
}

// ==================== ПРИЁМ ПАКЕТА ====================
void receivePacket() {
    if (!radioReady) return;
    
    uint8_t buffer[64];
    int state = radio.readData(buffer, sizeof(buffer));
    
    if (state > 0) {
        rxCount++;
        buffer[state] = '\0';
        Serial.print("RX #");
        Serial.print(rxCount);
        Serial.print(": ");
        Serial.println((char*)buffer);
        
        float rssi = radio.getRSSI();
        float snr = radio.getSNR();
        Serial.print("  RSSI: ");
        Serial.print(rssi);
        Serial.print(" dBm  SNR: ");
        Serial.println(snr);
        
        digitalWrite(PIN_LED, !digitalRead(PIN_LED));
        radio.startReceive();
    }
}

// ==================== ОБРАБОТКА PTT ====================
void handlePTT() {
    static bool lastState = HIGH;
    static unsigned long debounceTime = 0;
    const unsigned long DEBOUNCE_DELAY = 50;
    
    bool reading = digitalRead(PIN_PTT);
    unsigned long now = millis();
    
    if (reading != lastState) {
        debounceTime = now;
        lastState = reading;
        return;
    }
    
    if (now - debounceTime < DEBOUNCE_DELAY) return;
    
    if (reading == LOW && !pttActive) {
        pttActive = true;
        digitalWrite(PIN_LED, LOW);
        sendPacket();
        pttActive = false;
    }
}

// ==================== ДИАГНОСТИКА RSSI ====================
void printRSSI() {
    if (!radioReady) return;
    
    float rssi = radio.getRSSI();
    float snr = radio.getSNR();
    Serial.print("RSSI: ");
    Serial.print(rssi);
    Serial.print(" dBm  SNR: ");
    Serial.print(snr);
    Serial.print(" dB  TXEN: ");
    Serial.print(digitalRead(PIN_TXEN));
    Serial.print("  RXEN: ");
    Serial.println(digitalRead(PIN_RXEN));
}

// ==================== SETUP ====================
void setup() {
    Serial.begin(115200);
    delay(1000);
    
    Serial.println("");
    Serial.println("=================================");
    Serial.println("   LoRa TX/RX TEST v3");
    Serial.println("   Press PTT to send packet");
    Serial.println("=================================");
    Serial.println("");
    
    pinMode(PIN_PTT, INPUT_PULLUP);
    pinMode(PIN_LED, OUTPUT);
    digitalWrite(PIN_LED, HIGH);
    
    initRadio();
    
    Serial.println("Ready! Press PTT to send...");
    Serial.println("");
}

// ==================== LOOP ====================
void loop() {
    uint32_t now = millis();
    
    handlePTT();
    receivePacket();
    
    if (!pttActive && now - lastRssiPrint > 5000) {
        lastRssiPrint = now;
        printRSSI();
    }
    
    delay(10);
}

консоль-прием тишины, передача локальная, прием второго модуля. RSSI виснет на -17.00дбм

09:43:15.734 ->  RSSI: -88.00 dBm | SNR: 31.00 dB | TXEN: 0 | RXEN: 1
09:43:20.674 ->  RSSI: -88.00 dBm | SNR: 31.00 dB | TXEN: 0 | RXEN: 1
09:43:22.114 ->  Sending: PKT #4
09:43:22.274 ->  Sent
09:43:22.274 ->  Sending: PKT #5
09:43:22.394 ->  Sent
09:43:25.554 ->  RSSI: -88.00 dBm | SNR: 31.00 dB | TXEN: 0 | RXEN: 1
09:43:30.474 ->  RSSI: -17.00 dBm | SNR: 10.50 dB | TXEN: 0 | RXEN: 1
09:43:35.404 ->  RSSI: -17.00 dBm | SNR: 10.50 dB | TXEN: 0 | RXEN: 1


Максиму что удалось добиться используя RadioLib + SPI direct RSSI гибридный подход, это адекватное реагирование RSSI на прием, и не зависание. но приема пакетов по прежнему нет.

/*
 * STM32Radio - ГИБРИД: RadioLib передача + SPI direct RSSI
 * Передача через RadioLib (работает), RSSI через SPI (работает)
 */

#include <Arduino.h>
#include <SPI.h>
#include <RadioLib.h>

// ==================== ПИНЫ ====================
#define PIN_NSS     PA4
#define PIN_SCK     PA5
#define PIN_MOSI    PA7
#define PIN_MISO    PA6
#define PIN_BUSY    PA1
#define PIN_DIO1    PB0
#define PIN_NRST    PA2
#define PIN_TXEN    PB10
#define PIN_RXEN    PB2
#define PIN_PTT     PA3
#define PIN_LED     PC13

LLCC68 radio = new Module(PIN_NSS, PIN_DIO1, PIN_NRST, PIN_BUSY);

// ==================== ПЕРЕМЕННЫЕ ====================
bool radioReady = false;
bool pttActive = false;
uint32_t packetCount = 0;
uint32_t rxCount = 0;

// ==================== SPI RSSI (ПРЯМЫЕ КОМАНДЫ) ====================
bool waitBusy(uint32_t timeout) {
    uint32_t start = millis();
    while (digitalRead(PIN_BUSY)) {
        if (millis() - start > timeout) return false;
        delayMicroseconds(10);
    }
    return true;
}

float readRSSI_SPI() {
    uint8_t buf[2];
    waitBusy(100);
    digitalWrite(PIN_NSS, LOW);
    SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
    SPI.transfer(0x15);
    buf[0] = SPI.transfer(0x00);
    buf[1] = SPI.transfer(0x00);
    SPI.endTransaction();
    digitalWrite(PIN_NSS, HIGH);
    return -((float)buf[1]) / 2.0;
}

// ==================== УПРАВЛЕНИЕ ПЕРЕКЛЮЧАТЕЛЕМ ====================
void setTxenRxen(bool txen, bool rxen) {
    digitalWrite(PIN_TXEN, txen ? HIGH : LOW);
    digitalWrite(PIN_RXEN, rxen ? HIGH : LOW);
    delayMicroseconds(10);
}

// ==================== ПЕРЕДАЧА (RadioLib) ====================
void sendPacket() {
    if (!radioReady) return;
    
    packetCount++;
    char data[32];
    sprintf(data, "PKT #%lu", packetCount);
    
    Serial.print("Sending: ");
    Serial.println(data);
    
    setTxenRxen(true, false);
    delay(1);
    
    int state = radio.transmit(data);
    
    setTxenRxen(false, true);
    radio.startReceive();
    
    if (state == RADIOLIB_ERR_NONE) {
        Serial.println("Sent OK");
        digitalWrite(PIN_LED, HIGH);
    } else {
        Serial.print("Send error: ");
        Serial.println(state);
    }
}

// ==================== КНОПКА PTT ====================
void handlePTT() {
    static bool lastState = HIGH;
    static unsigned long debounceTime = 0;
    const unsigned long DEBOUNCE_DELAY = 50;
    
    bool reading = digitalRead(PIN_PTT);
    unsigned long now = millis();
    
    if (reading != lastState) {
        debounceTime = now;
        lastState = reading;
        return;
    }
    
    if (now - debounceTime < DEBOUNCE_DELAY) return;
    
    if (reading == LOW && !pttActive) {
        pttActive = true;
        digitalWrite(PIN_LED, LOW);
        sendPacket();
        pttActive = false;
    }
}

// ==================== ИНИЦИАЛИЗАЦИЯ ====================
void initRadio() {
    Serial.println("RADIO INIT");
    
    pinMode(PIN_TXEN, OUTPUT);
    pinMode(PIN_RXEN, OUTPUT);
    setTxenRxen(false, true);
    Serial.println("Switch: RX");
    
    pinMode(PIN_NRST, OUTPUT);
    digitalWrite(PIN_NRST, LOW);
    delay(10);
    digitalWrite(PIN_NRST, HIGH);
    delay(100);
    Serial.println("Reset done");
    
    pinMode(PIN_NSS, OUTPUT);
    digitalWrite(PIN_NSS, HIGH);
    pinMode(PIN_BUSY, INPUT);
    pinMode(PIN_DIO1, INPUT);
    SPI.begin();
    
    int state = radio.begin();
    Serial.print("radio.begin: ");
    Serial.println(state);
    
    if (state != RADIOLIB_ERR_NONE) {
        radioReady = false;
        Serial.println("Radio FAILED");
        return;
    }
    
    radio.setFrequency(433.9);
    radio.setBandwidth(125.0);
    radio.setSpreadingFactor(9);
    radio.setCodingRate(7);
    radio.setPreambleLength(8);
    radio.setOutputPower(22);
    radio.setSyncWord(0x1424);
    radio.setCRC(true);
    
    radio.startReceive();
    radioReady = true;
    
    Serial.println("Radio ready");
}

// ==================== SETUP ====================
void setup() {
    Serial.begin(115200);
    delay(1000);
    
    Serial.println("HYBRID: RadioLib TX + SPI RSSI");
    Serial.println("Press PTT to send");
    
    pinMode(PIN_PTT, INPUT_PULLUP);
    pinMode(PIN_LED, OUTPUT);
    digitalWrite(PIN_LED, HIGH);
    
    initRadio();
}

// ==================== LOOP ====================
void loop() {
    static uint32_t lastRssiPrint = 0;
    uint32_t now = millis();
    
    handlePTT();
    
    if (now - lastRssiPrint > 3000) {
        lastRssiPrint = now;
        float rssi = readRSSI_SPI();
        Serial.print("RSSI: ");
        Serial.print(rssi);
        Serial.println(" dBm");
    }
    
    delay(10);
}

консоль


10:12:21.329 -> RSSI: -84.00 dBm
10:12:21.409 -> Sending: PKT #8
10:12:21.529 -> Sent OK
10:12:21.569 -> Sending: PKT #9
10:12:21.689 -> Sent OK
10:12:21.689 -> Sending: PKT #10
10:12:21.849 -> Sent OK
10:12:21.849 -> Sending: PKT #11
10:12:22.009 -> Sent OK
10:12:22.009 -> Sending: PKT #12
10:12:22.169 -> Sent OK
10:12:24.279 -> RSSI: -84.00 dBm
10:12:27.231 -> RSSI: -81.00 dBm
10:12:30.191 -> RSSI: -15.00 dBm
10:12:33.151 -> RSSI: -16.00 dBm
10:12:36.121 -> RSSI: -83.00 dBm
10:12:39.091 -> RSSI: -85.00 dBm
10:12:42.033 -> RSSI: -84.00 dBm

@Turb0user
А что за плата у вас?
В другой теме вы пишете, что STM32f4 - какая именно?

обязательно, и лучше их требовать!)))
тема знакомая вроде, но что то не вспоминается что там было…

а вы этот код сами писали ? вы если что сами сможете правки внести в код ?

  1. у него я вижу паузу delay(10); гораздо больше чем у вас, может 1 слишком мало все таки ?

  2. После инициализации: radio.startReceive() → чип слушает эфир

  1. Приходит пакет → чип ловит его, кладет в буфер, поднимает DIO1

  2. Вы нажимаете кнопку → вызывается sendPacket()

  3. Критический момент: вы не проверили, не пришел ли пакет во время работы кнопки!

  4. Вы переключаете антенну в TX и отправляете свой пакет

  5. После отправки вы переключаете обратно в RX и вызываете startReceive()

  6. А в этот момент в буфере чипа уже лежит старый пакет (или флаг о его приеме)

  7. Вызывается receivePacket()radio.readData() читает этот старый пакет (или зависает в ожидании)

  8. Чип сбивается с режима, и дальше все ломается, но это не точно

поиск в форуме по строке “E220”

stm32f407rst6 черная таблетка

Blackpill что ли? Дайте ссылку, не помню 407х таблеток

Что касается кода - не вижу никаких попыток что-то принимать. Или код приема вы намеренно выкинули из примера?

@Turb0user
Так, просто для определенности… вы случайно не перелогинившийся юзер по имени begun11 ?

очень похоже на это)))
значит решение такое, мне 12к, я куплю и посмотрю, может сделаю может нет, естественно на esp а не на stm
или вы сначала курс пройдите, а потом сможете делать под себя, в том числе и на stm, (а то вообще есть сомнения что для нее делали библиотеку)
или сначала смотрите код, а потом покупайте модули…

Turb0user по мимо скинутого кода дайте простой код приема и отправки 1го пакета, и покажите пж что выводит, если советы ранее не помогли…
еще есть код за 5к! без тестов, с внесенными правками, может заработает, может нет, ннннадо ?

сорян stm32f401rst6 конечно

этот форум ничего такого о чем говорит BABOS не ищет. а старый-там поиска не вижу и не регистрирует по моему

можно подробнее ? вы вообще про что ?)))

Нет, мне некогда такими глупостями заниматься-перелогиниваться. Это мой первый акк. А он натворил чтонить?

По поводу предыдущего поста: курю поправки в код, но по сути это ничего не меняет. свежевключенный и ненажатый на передачу модуль все равно не принимает пакеты независимо от буферов и фагов.
Про комерческий вариант задумывася, уж слишком много времени убил на этот, но таких модулей у меня всего на 1.2к и вариант с 5к условнорабочим кодом кажется черезчур сомнительным. Тем более в дальнейшем мне будет нужна 4GFSK а не лора, и планируется переход на другой чип. Текущая конфигурация только для отработки концептуальных подходов и решений сопряжения.

тема знакомая вроде, но что то не вспоминается что там было…

на этом форуме не нашел темы с подробным копанием в потрохах кодов или библиотек для e200

за 12к я куплю эти модули, и посижу с ними 6 часов))) может справлюсь за это время может нет…)))
за 5к без тестов на модулях, быстрее, но меньше гарантии что запуститься если что не так, или в библиотеки ошибки…

если то что надо сделать не вызывает вопросов, скиньте код приема передатчика, если они разные, может вы в одном из них банально адрес не тот указали…

не проблема, но мне в дальнейшем нужна беха x5)))

упоминание E220 находится в 4 темах… а обзоров на модуль нет…

последний указанный код с приемом и передачей шьется на два одинаковых устройства, по этому все параметры одинаковые.