Cubecell AB01 с nRF24L01

nrf24l01+ platformio

Я пытался подключить nRF24L01 к Cubecell AB01 без особой удачи. В большинстве случаев функция radio.available() всегда возвращает true, что приводит к куче мусора. Я понял, что nRF24L01 не хочет правильно настраиваться. С printPrettyDetails() Я могу подтвердить, что настройки не сохранены.

Однако с примером скетча, содержащимся в библиотеке RF24, все работает нормально (подтверждая, что AB01 и nRF24L01 работают нормально). Но как только я меняю тип данных полезной нагрузки приемника на uint8_t, функция radio.available() всегда истинна, что приводит к куче полученных сообщений с мусором. PrintPrettyDetails() также показывает неправильные настройки.

Есть ли у кого-нибудь опыт в этом деле? Я также попробовал пример скетча из Robin2. Это приводит к большому количеству мусора, как описано ранее.

Я использую:

  • nRF24L01 с печатной антенной. Я периодически использую esp32, чтобы проверить, что nRF24L01 все еще работает нормально
  • heltec AB01. nRF24L01 подключается к интерфейсу spi, а CE -> GPIO3 и CSN - > GPIO2
  • Для программирования я использую platformio. Но в отчаянии я также могу использовать Arduino IDE (точно такое же поведение).

RX код: /** * См. Документацию по адресу https://nRF24.github.io/RF24 * См. Информацию о лицензии в корневом каталоге этой библиотеки. * Автор: Брендан Доэрти (2bndy5) */

    /**
     * A simple example of sending data from 1 nRF24L01 transceiver to another.
     *
     * This example was written to be used on 2 devices acting as "nodes".
     * Use the Serial Monitor to change each node's behavior.
     */
    #include <SPI.h>
    #include "printf.h"
    #include "RF24.h"

    // instantiate an object for the nRF24L01 transceiver
    RF24 radio(GPIO3, GPIO2); // using pin 7 for the CE pin, and pin 8 for the CSN pin

    // Let these addresses be used for the pair
    uint8_t address[][6] = {"1Node", "2Node"};
    // It is very helpful to think of an address as a path instead of as
    // an identifying device destination

    // to use different addresses on a pair of radios, we need a variable to
    // uniquely identify which address this radio will use to transmit
    bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to                                 transmit

    // Used to control whether this node is sending or receiving
    bool role = false;  // true = TX role, false = RX role

    // For this example, we'll be using a payload containing
    // a single float number that will be incremented
    // on every successful transmission
    float payload = 0;

    void setup() {

      Serial.begin(115200);
      while (!Serial) {
        // some boards need to wait to ensure access to serial over USB
      }
      pinMode(Vext, OUTPUT);
      digitalWrite(Vext, LOW);
      delay(10);
      // initialize the transceiver on the SPI bus
      if (!radio.begin()) {
        Serial.println(F("radio hardware is not responding!!"));
        while (1) {} // hold in infinite loop
      }

      // print example's introductory prompt
      Serial.println(F("RF24/examples/GettingStarted"));
      
      radioNumber = 1;
      Serial.print(F("radioNumber = "));
      Serial.println((int)radioNumber);
    
      // Set the PA Level low to try preventing power supply related problems
      // because these examples are likely run with nodes in close proximity to
      // each other.
      radio.setPALevel(RF24_PA_LOW);  // RF24_PA_MAX is default.
    
      // save on transmission time by setting the radio to only transmit the
      // number of bytes we need to transmit a float
      radio.setPayloadSize(sizeof(float)); // float datatype occupies 4 bytes

      // set the TX address of the RX node into the TX pipe
      radio.openWritingPipe(address[radioNumber]);     // always uses pipe 0
    
      // set the RX address of the TX node into a RX pipe
      radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1

      // additional setup specific to the node's role
      if (role) {
        radio.stopListening();  // put radio in TX mode
      } else {
        radio.startListening(); // put radio in RX mode
      }

      // For debugging info
      // printf_begin();             // needed only once for printing details
      // radio.printDetails();       // (smaller) function that prints raw register values
       radio.printPrettyDetails(); // (larger) function that prints human readable data

    } // setup

    void loop() {

        // This device is a RX node

        uint8_t pipe;
        if (radio.available(&pipe)) {             // is there a payload? get the pipe         number that recieved it
          uint8_t bytes = radio.getPayloadSize(); // get the size of the payload
          radio.read(&payload, bytes);            // fetch payload from FIFO
          Serial.print(F("Received "));
          Serial.print(bytes);                    // print the size of the payload
          Serial.print(F(" bytes on pipe "));
          Serial.print(pipe);                     // print the pipe number
          Serial.print(F(": "));
          Serial.println(payload);                // print the payload's value
        }

    } // loop

Я пробовал все, что мог придумать, но безуспешно. Любая помощь будет оценена по достоинству!

, 👍-1


1 ответ


0

Оказалось, что это коррумпированная библиотека и несоответствие скорости SPI

,