Ви не увійшли.
Прошу помощи - NRF24L01+ перестает работать если отправлять пакеты редко и уверенно работает если их отправлять непрерывно без задержки.
В приведенном ниже примере я отключил подтверждение приема setAutoAck(false) на тот случай, если согласившийся протестировать не имеет вторую NRF и вторую ардуину.
Включение подтверждение приема setAutoAck(true) приведет к необходимости задействовать вторую ардуину и вторую NRF, но ничего не меняет.
Как только включаю задержку >= 15 мсек delay(100) ... delay(1000) , перестает работать передача, это видно по статусу возврата функции write(buf,32) через свечение RED LED и также видно со стороны приемника.
Тактовая частота контроллера 16 Мгц.
Повторная инициализация NRF не помогает.
Причину найти не могу, прошу помощи форумчан ....
// file TX_PING_TEST. INO
#include "nRF24L01.h"
#include "SPI.h"
#include "RF24.h"
const uint64_t pipe = 'ABCDEFG';
uint8_t buf[32];
/*
схема соединений для Mega2560 и Uno:
GND -> GND
VCC -> +3,3V
MISO -> MISO
MOSI -> MOSI
SCK -> SCK
IRQ не подключен
CE -> CE_PIN см для UNO или Mega
SS -> SS_PIN см для UNO или Mega
*/
// для Mega2560:
RF24 RA(49,53); // CE_PIN,SS_PIN
//для Uno:
// RF24 RA(8,10); // CE_PIN,SS_PIN
void setup(void)
{
init_leds();
init_TX();
int i; for(i=0; i<32; i++) {buf[i]=0xFF;}
}
void loop(void)
{
switch(RA.write(buf,32))
{ case false: digitalWrite(14,HIGH); digitalWrite(16,LOW); break;
case true: digitalWrite(16,HIGH); digitalWrite(14,LOW); break;
}
delay(1); // задержка в 1 мсек не влияет на качество работы
// delay(100); //как только включаю задержку > 15-20 мсек , перестает работать передача,
// это видно по статусу возврата RA.write(buf,32) через RED LED и также со стороны приемника
// init2_TX(); // после включения delay() переинициализация NRF не помогает...
}
void init_TX()
{
RA.begin();
init2_TX();
}
void init2_TX()
{
//RA.setAutoAck(true);
RA.setAutoAck(false);
RA.setDataRate(RF24_1MBPS);
RA.setCRCLength(RF24_CRC_16);
RA.setChannel(66);
RA.openWritingPipe(pipe);
//RA.printDetails();
}
void init_leds()
{
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);digitalWrite(15,LOW);// GND для LED, использую один трехногий GREEN+RED светодиод, его
//средний вывод общий минус (катод), а два крайние аноды (положительные) для GREEN и RED
pinMode(16, OUTPUT);
// проверка LED при старте
digitalWrite(16,HIGH); delay(20); digitalWrite(16,LOW); delay(100); digitalWrite(16,HIGH); delay(20); digitalWrite(16,LOW);delay(500);
digitalWrite(14,HIGH); delay(20); digitalWrite(14,LOW); delay(100); digitalWrite(14,HIGH); delay(20); digitalWrite(14,LOW);delay(500);
}
Неактивний
Дополню: основная беда в том, что даже если отправляьб пакеты непрерывно, то при возникновении случайной задержки в программе TX, NRF теряет работоспособность
Неактивний
Восстанавливается только для передачи первого пакета, а после delay или любой задержки, в том числе на выполнение следующего кода, опять рушится. Управляю опосредованно через библиотеку функциями "высокого" уровня.
Библиотек RF24 на github великое множество и ХЗ какая оригинальная и сопровождаемая авторами.
Вам доводилось работать с NRF24L01+?
Неактивний
Может быть она засыпает, нечаянно? Я серьезно. Как иначе объяснить отсутствие реакции на ре-инициализацию.
Вячеслав Азаров, спасибо.
Ваша догадка насчет спячки подтвердилась во всем кроме "нечаянно": в конце функции write() обнаружен вызов powerDown();
Однако , в описании библиотеки сказано:
void RF24::powerDown ( void )
Enter low-power mode.
To return to normal power mode, either write() some data or startListening, or powerUp().
, то есть первый же вызов write() должен вывести из спячки. В реальности этого не происходит, поэтому перед вызовом write() добавил powerUp() и проблема исчезла;
Осталось понять странный глюк: почему после выполнения powerDown() при следующем без задержки вызове write() проблема не проявлялась. Как Вы думаете?
Неактивний
Возможно она выключается только после завершения передачи буферов. А поскольку они все время заполняются то "спать некогда".
имхо не так, ибо
1) Функция write() дожидается окончания передачи и и чистит за собой буфер передачи , и только после этого возвращает управление вызывающей программе.
2) Есть еще функция startWrite(), которую использует write(), она начинает передачу и возвращает управление вызывающей программе не дожидаясь завершения.
Неактивний