#1 2017-06-11 13:28:06

condensator89
Учасник
Зареєстрований: 2017-06-11
Повідомлень: 25

NRF24 не работает при отправке редких пакетов, а с частыми нет проблем

Прошу помощи - 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);
}  

Неактивний

#2 2017-06-11 16:05:00

condensator89
Учасник
Зареєстрований: 2017-06-11
Повідомлень: 25

Re: NRF24 не работает при отправке редких пакетов, а с частыми нет проблем

Дополню: основная беда в том, что даже если отправляьб пакеты непрерывно, то при возникновении случайной задержки в программе TX, NRF теряет работоспособность sad

Неактивний

#3 2017-06-11 19:56:38

condensator89
Учасник
Зареєстрований: 2017-06-11
Повідомлень: 25

Re: NRF24 не работает при отправке редких пакетов, а с частыми нет проблем

Восстанавливается только для передачи первого пакета, а после delay или любой задержки, в том числе  на выполнение следующего кода,  опять рушится. Управляю опосредованно через библиотеку функциями "высокого" уровня.
Библиотек RF24 на github великое множество и ХЗ какая оригинальная и сопровождаемая авторами.

Вам доводилось работать с NRF24L01+?

Неактивний

#4 2017-06-12 12:12:38

condensator89
Учасник
Зареєстрований: 2017-06-11
Повідомлень: 25

Re: NRF24 не работает при отправке редких пакетов, а с частыми нет проблем

Вячеслав Азаров пише:

Может быть она засыпает, нечаянно?   wink  Я серьезно. Как иначе объяснить отсутствие реакции на ре-инициализацию.

Вячеслав Азаров, спасибо.
Ваша догадка насчет спячки подтвердилась во всем кроме "нечаянно":  в конце функции 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() проблема не проявлялась.  Как Вы думаете?

Неактивний

#5 2017-06-12 12:38:54

condensator89
Учасник
Зареєстрований: 2017-06-11
Повідомлень: 25

Re: NRF24 не работает при отправке редких пакетов, а с частыми нет проблем

Вячеслав Азаров пише:

Возможно она выключается только после завершения передачи буферов. А поскольку они все время заполняются то "спать некогда".  smile

имхо не так, ибо

1) Функция write() дожидается окончания передачи и и чистит за собой буфер передачи , и только после этого возвращает управление вызывающей программе.
2) Есть еще  функция startWrite(), которую использует write(), она начинает передачу и возвращает управление вызывающей программе не дожидаясь завершения.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму