STM32 и NRF отправка и получение

Это мой код отправки и получения в STM32 (синяя доска). Но я не могу отправлять и получать данные. почему? Я использовал Enrf24.h. Ссылка на Enrf24: https://github.com/spirilis/Enrf24 код отправки:

#include <SPI.h>
#include <Enrf24.h>
#include <nRF24L01.h>
#include <string.h>
#define ce_nrf PB12
#define csn_nrf PB13
#define irq_nrf PA0
Enrf24 radio(ce_nrf, csn_nrf, irq_nrf);  // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t txaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
void setup() {
  Serial.begin(9600);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  radio.begin();  // По умолчанию 1 Мбит/с, канал 0, максимальная мощность передачи
  radio.setTXaddress((void*)txaddr);
}

void loop() {
  Serial.print("Sending packet: ");
  radio.print("OONN");
  radio.flush();  // Принудительно передать (не ждать больше данных)
  delay(1000);
  Serial.print("Sending packet: ");
  radio.print("OOFF");
  radio.flush();
  delay(1000);
}

Код получения:

#include <SPI.h>
#include <Enrf24.h>
#include <nRF24L01.h>
#define ce_nrf PB12
#define csn_nrf PB13
#define irq_nrf PA0
Enrf24 radio(ce_nrf, csn_nrf, irq_nrf);  // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t rxaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
const char *str_on = "ON";
const char *str_off = "OFF";
void dump_radio_status_to_serialport(uint8_t);
void setup() {
  Serial.begin(9600);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  radio.begin();  // По умолчанию 1 Мбит/с, канал 0, максимальная мощность передачи
  radio.setRXaddress((void*)rxaddr);
  radio.enableRX();  // Начинаем слушать
}

void loop() {
  char inbuf[33];
  while (!radio.available(true));
  if (radio.read(inbuf)) {
    Serial.print("Received packet: ");
    Serial.println(inbuf);
  }
}

это изображение может помочь:

, 👍0

Обсуждение

И вопрос в том?, @Mikael Patel

Спасибо, я не могу отправлять и получать данные. почему? пожалуйста, посмотрите мое изображение, @m-tech


3 ответа


Лучший ответ:

0

Вы не указали, какую библиотеку вы используете, но на основании #include я предполагаю, что http ://maniacbug.github.io/RF24

Эта строка в коде вашего получателя:

 while (!radio.available(true));

не имеет смысла. Вы передаете true в функцию radio.available(), но tфункция не заботится о параметре.

Возможно, вы имели в виду что-то вроде:

 while (!radio.available());

Когда вы передаете переменную, вы вызываете вариант функции, которая ожидает указания номера канала, а true определяется как 1. Однако ваш передатчик не передает данные по каналу номер 1.

,

Я использую эту библиотеку [ссылка](https://github.com/spirilis/Enrf24). в папке exmaple вы можете увидеть пример, я использовал Enrf24, @m-tech


0

Прежде всего удалите

while (!radio.available(true)); 

после этого используйте

PA_5 ----> SCK
PA_6 ----> MISO
PA_7 ----> MOSI

все будет работать правильно.

,

-1

Это лучший ответ на некоторые вопросы в библиотеке Enrf вы не можете отправлять данные с помощью записи до тех пор, пока txbuf_len==0

size_t Enrf24::write(uint8_t c) {
если (txbuf_len == 32) { румянец(); // Блокируем OTA-передачу } txbuf[txbuf_len] = с; txbuf_len++; возврат 1;

Тогда не используйте очистку

txbuf_len = 0

это для чтения данных

#include <SPI.h>
#include <Enrf24.h>
#include <nRF24L01.h>
#define ce_nrf PB12
#define csn_nrf PB13
#define irq_nrf PA0
Enrf24 radio(ce_nrf, csn_nrf, irq_nrf);  // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t rxaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
const char *str_on = "ON";
const char *str_off = "OFF";
void dump_radio_status_to_serialport(uint8_t);
void setup() {
  Serial.begin(9600);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  radio.begin();  // По умолчанию 1 Мбит/с, канал 0, максимальная мощность передачи
  radio.setRXaddress((void*)rxaddr);
  radio.enableRX();  // Начинаем слушать
 // radio.autoAck(false);
}

void loop() {
  char inbuf[35];
  if (radio.read(inbuf))
  {
    Serial.print("Received packet: ");
    Serial.println(inbuf);
  } 
}

это запись для записи данных:

#include <SPI.h>
#include <Enrf24.h>
#include <nRF24L01.h>
#include <string.h>
#define ce_nrf PB12
#define csn_nrf PB13
#define irq_nrf PA0
Enrf24 radio(ce_nrf, csn_nrf, irq_nrf);  // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t txaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
void setup() {
  Serial.begin(9600);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  radio.begin();  // Defaults 1Mbps, channel 0, max TX power
  radio.setTXaddress((void*)txaddr);
}
int i=0;
void loop() {
  i++;
  Serial.print("Sending packet: ");
  Serial.println(i);
  radio.print("1234567890123456789012--------->");
  //radio.purge();
  delay(100);
}
,

в чем принципиальная разница между рассматриваемым кодом и кодом в ответе? только удаленное пока (доступное)?, @Juraj