Евгений Вольф Опубликовано 4 июня, 2020 Поделиться Опубликовано 4 июня, 2020 Коллеги, доброго времени суток! Помогите пожалуйста разобраться в вопросе. Есть уже готовый исправно работающий передатчик, который автор сего устройства собрал на базе Arduino Mega 2560, передатчик работает в паре с микросхемой NRF24L01. Единственное, на что я могу повлиять - попросить автора прошивки поменять настройки вещания передатчика. Для примера, простейший код передатчика на ардуине выглядит так: #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> //RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно RF24 radio(9, 53); // "создать" модуль на пинах 9 и 10 Для Меги char counter; void setup() { radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(0xAABBCCDD11LL); // 0xAABBCCDD11LL radio.setChannel(0x00); //выбираем канал (в котором нет шумов!) radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS radio.setPALevel(RF24_PA_MIN); radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { radio.write(&counter, sizeof(counter)); counter++; delay(500); } Пример простейшего приёмника на NRF24L01 (ардуина): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно void setup() { Serial.begin(9600); Serial.println("ready!!!!!"); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, 0xAABBCCDD11LL); // 0xAABBCCDD11LL radio.setChannel(0x00); //выбираем канал (в котором нет шумов!) radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS radio.setPALevel(RF24_PA_MIN); radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { char pipeNo, gotByte; while(radio.available(&pipeNo)) { // слушаем эфир со всех труб radio.read(&gotByte, sizeof(gotByte)); // чиатем входящий сигнал if(gotByte!=0) Serial.println(gotByte); } } Между собой ардуины отлично работают, но, принимать и обрабатывать данные должен STM32-чип (передавать данные обратно в данный момент не требуется). Что я только не пытался сделать - STM32 не видит входящий сигнал, либо же видит, но не хочет его обрабатывать... На просторах сети нашел библиотеку и простейший пример для работы с чипами NRF32L01, немного доработал его под себя, вот что получилось: #include <mbed.h> #include "nRF24L01P.h" #define TRANSFER_SIZE 32 int main() { nRF24L01P my_nrf24l01p(A7, A6, A5, A4, B0, A10); // mosi, miso, sck, csn, ce, irq Serial serial(A2, A3); int count = 0; int frequency = 2400; char rxData[TRANSFER_SIZE]; char data = 0; my_nrf24l01p.powerUp(); my_nrf24l01p.setTransferSize(TRANSFER_SIZE); my_nrf24l01p.setReceiveMode(); my_nrf24l01p.setRxAddress(0xAABBCCDD11LL); my_nrf24l01p.setRfFrequency(2400); my_nrf24l01p.enable(); // Display the (default) setup of the nRF24L01+ chip serial.printf("nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency()); serial.printf("nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower()); serial.printf("nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate()); serial.printf("nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress()); serial.printf("nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress()); while(true) { for(int j = 0; j < 200000; j++) { if (my_nrf24l01p.readable(0) || my_nrf24l01p.readable(1) || my_nrf24l01p.readable(2) || my_nrf24l01p.readable(3) || my_nrf24l01p.readable(4) || my_nrf24l01p.readable(5)) { serial.printf("DATA ACCEPTED!!\r\n"); } } if(frequency < 2525) { frequency++; } else { frequency = 2400; } my_nrf24l01p.setRfFrequency(frequency); serial.printf("CHANGE CHANNEL: %d\n\r", my_nrf24l01p.getRfFrequency()); } } Вариант того, что чип не правильно припаян, не работоспособен или нечто подобное - мало вероятен, так как при малейших ошибках и даже плохом контакте - я получал кучу ошибок о том, что NRF24L01 - "не завелась". Перепробовал всё что смогу придумать, в том числе изменял/отключал CRC. Раз в пару часов могут придти несколько мусорных пакетов данных (подряд), после чего опять "радио молчание", при этом лежащий рядом тестовый приёмник собранный на базе ардуины, любезно предоставленный автором исходной прошивки - принимает данные исправно. Пробовал менять NFR'ки местами -- результат всегда один и тот же. Среди прочего, я заметил, что прёмник собранный на ардуине - стабильно может принимать в том числе и различный мусор из эфира, например, помехи от роутера. Собранный же мой приёмник 99.9% времени не принимает вообще ничего. Подозреваю, что проблема в коде который писал я, только не могу понять, куда бы могла закрасться ошибка... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.