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);
}
}
это изображение может помочь:
@m-tech, 👍0
Обсуждение3 ответа
Лучший ответ:
Вы не указали, какую библиотеку вы используете, но на основании #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
Прежде всего удалите
while (!radio.available(true));
после этого используйте
PA_5 ----> SCK
PA_6 ----> MISO
PA_7 ----> MOSI
все будет работать правильно.
Это лучший ответ на некоторые вопросы в библиотеке 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
- RaspberryPi Pico SPI и nrf24l01
- Проблема с NRF24L01
- SPI с преобразователем уровня на другом конце соединения
- Проблемы nRF24l01+. Данные принимаются как 0
- Как подключить NRF24L01 к Wemos D1 R2
- Подключение Saleae Logic 8 к MISO (контакт 12) на Uno 3 с NRF24L01+ останавливает программу
- Проблема с SPI при использовании трансивера RF24 NRF24L01 со светодиодной матрицей MD_MAX72xx
- Изменение портов SPI на Arduino
И вопрос в том?, @Mikael Patel
Спасибо, я не могу отправлять и получать данные. почему? пожалуйста, посмотрите мое изображение, @m-tech