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

,

И где там прием, покажите?
Или вы код не полностью выложили?

Как вы определили, что модуль ничего не принимает, если у вас в коде нет приема?

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

Давайте начистоту - этот код писали не вы? Спросили у ИИ или нашли готовый в инете? Насколько вы понимаете, что в нем делается?

То есть это много? Вы это имели в виду?
Если да, то говорить об этом просто смешно. По нынешним временам за 5к никто вам даже код от ИИ не даст.
Тысяч на 20 можно было бы договорится, с модулями заказчика.

это точно ? я какой то вижу… вроде пытается передать, не совсем явным образом…
PKT #1
PKT #2
PKT #3

и вроде у него со временим прерывается и виснет модуль… или там грубая ошибка ?))) 1 ошибку вроде вижу, не грубую…

я дам!))) а то я месяцев 6 без работы… а за 12к или 20к даже не хочется копаться наверное))) и только код от ии бы сделал наверное…

у меня глюки или написано “Sending” ???

он что скинул лог передатчика ?.. наверное он стебется просто))) а я не осознал полностью работу кода…

я не знаю что он скинул, но в коде из сообщения #5 я приема не вижу, только передача.
Хотя я старенький, глаза плохие, мог и не заметить.
Потому и спрашиваю - покажите, где в этом коде прием.
А @Turb0user молчит

сорян вот прием

// ==================== ПРИЕМ ПАКЕТОВ ====================
void checkForPackets() {
    if (!radioReady) return;
    if (pttActive) return;
    
    
    int len = radio.readData(rxBuffer, sizeof(rxBuffer));
    
    if (len > 0) {
        rxCount++;
        
        Serial.print("RX #");
        Serial.print(rxCount);
        Serial.print(", len=");
        Serial.print(len);
        Serial.print(", data=");
        
        // Вывести данные
        for (int i = 0; i < len && i < 32; i++) {
            if (isPrintable(rxBuffer[i])) {
                Serial.print((char)rxBuffer[i]);
            } else {
                Serial.print(".");
            }
        }
        Serial.println();
        
        // Мигнуть LED при приеме
        digitalWrite(PIN_LED, LOW);
        delay(100);
        digitalWrite(PIN_LED, HIGH);
        
        // Перезапустить прием для следующего пакета
        radio.startReceive();
    }
}

УПС! крапленый туз не из той колоды :face_with_peeking_eye:

мое предложение про 5к все еще в силе))) по крайней мере ближайшие 3 часа!
попробуйте опубликовать код полностью, и описать что не так, может кто что подскажет… а то как то запутанно все получается)))

прошу прощения не из той папки ранее прицепил код (глаз замылился), чем ввел всех в заблуждение :face_without_mouth:
Это тоже самое с приемом. Проблема статрая: передача работает, приемник видит (RSSI меняется), нет приема пакетов.


#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;
uint8_t rxBuffer[64];  

// ==================== 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];
    if (!waitBusy(100)) return -120.0;
    
    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);
}

// ==================== ПРИЕМ ПАКЕТОВ ====================
void checkForPackets() {
    if (!radioReady) return;
    if (pttActive) return;
    
    // Проверить, есть ли данные в буфере
    int len = radio.readData(rxBuffer, sizeof(rxBuffer));
    
    if (len > 0) {
        rxCount++;
        
        Serial.print("RX #");
        Serial.print(rxCount);
        Serial.print(", len=");
        Serial.print(len);
        Serial.print(", data=");
        
        // Вывести данные
        for (int i = 0; i < len && i < 32; i++) {
            if (isPrintable(rxBuffer[i])) {
                Serial.print((char)rxBuffer[i]);
            } else {
                Serial.print(".");
            }
        }
        Serial.println();
        
        // Мигнуть LED при приеме
        digitalWrite(PIN_LED, LOW);
        delay(100);
        digitalWrite(PIN_LED, HIGH);
        
        // Перезапустить прием для следующего пакета
        radio.startReceive();
    }
}


// ==================== ПЕРЕДАЧА (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);
        delay(50);
        digitalWrite(PIN_LED, LOW);
    } 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("\n=== 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);
    
    // SyncWord для совместимости
    
    radio.setSyncWord(0x12);
    
    radio.setCRC(true);
    
    radio.startReceive();
    radioReady = true;
    
    Serial.println(" Radio ready");
    Serial.println("=== INIT OK ===\n");
}

// ==================== SETUP ====================
void setup() {
    Serial.begin(115200);
    delay(1000);
    
    Serial.println("HYBRID: RadioLib TX + SPI RSSI + ПРИЕМ");
    Serial.println("Press PTT to send");
    Serial.println();
    
    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();
    
    // 1. Обработка кнопки
    handlePTT();
    
    // 2.  ПРОВЕРКА ВХОДЯЩИХ ПАКЕТОВ
    checkForPackets();
    
    // 3. RSSI лог (каждые 3 секунды)
    if (now - lastRssiPrint > 3000) {
        lastRssiPrint = now;
        float rssi = readRSSI_SPI();
        Serial.print(" RSSI: ");
        Serial.print(rssi);
        Serial.print(" dBm, RX count: ");
        Serial.println(rxCount);
    }
    
    delay(10);
}

Попробуйте назначить RXEN на свободный пин, потому как PB2 на блекпиле - это переключатель BOOT, может и не работать как вам нужно.
И NSS как CS , я бы тоже не использовал… ну что бы совсем перестраховаться.

(последний код не смотрел)

вижу изменился… было 0x1424 там есть проблема с 1 и 2 байтами ?

вы уже пытались изменить delay ? это не принесло результатов ?
стоит ли RXEN = HIGH сделать постоянно включенным, а TXEN включать и выключать периодически даст результат ?
в этом коде появился прием и передача ?)))

тоесть вы не совсем понимаете как это должно работать, верно ?)))
от сюда как вам помочь я не знаю…

ну че ты пугаешь то))
нормально он работает, как и все остальные пины, просто надо учитывать, что на плате blackpill на нем висит подтяжка к земле резистором 10к.

я не пугаю, просто пишу как делал бы сам.
Вроде как влиять не должно, но если что-то не работает, я стараюсь устранить все аспекты, в которых не до конца уверен.
Вот когда заработает, можно будет попробовать, влияет подтяжка PB2 или нет

оказывается не все пины одинаково полезны. товарищ МММ оказался прав-спасибо. смена пина RXEN увеличила RSSI до -112дцб. Приема пакетов пок анет. Курю другие советы…

начните с того что, в последнем коде найдите есть ли и прием и передача в коде, работает ли она правильно…