Доброго времени суток! Подскажите кто сталкивался со следующей проблемой: При инициализации модуля через библиотеку Mirf сбрасываются все регистры на другие значения. Выставляю конфигурацию, в том числе канал 50 и тп. И после того как вызываю Mirf.config(); все мои настройки сбрасываются, из регистров читается какая то чушь: CONFIG = 1000 SETUP_RETR = 11 SETUP_AW = 11 RF_CH = 2 RF_SETUP = 1111 RX_PW_P0 = 0 Копаясь в библиотеке выяснил что на это влияет бит перехода в режим приема(PRIM_RX) а именно в строчке (Mirf.cpp:268) configRegister(CONFIG, mirf_CONFIG | ( (1<<PWR_UP) | (1<<PRIM_RX) ) ); Если его убрать то считываются регистры что я установил, но прием не происходит. Вопрос, как заставить все это работать и не сбрасывать мои настройки регистров? И вообще почему меняются регистры? Пины подключал: CE-6, CSN-5 Плата: MEGA 2560 Сам код(должен принимать пакетыот RC пульта): Код (Text): #include <SPI.h> #include <Mirf.h> #include <MirfHardwareSpiDriver.h> #include <MirfSpiDriver.h> #include <nRF24L01.h> void setup(){ byte addr[] = {0,0,0,0,0}; Serial.begin(9600); Mirf.spi = &MirfHardwareSpi; delay(150); Mirf.csnPin = 5; Mirf.cePin = 6; Mirf.init(); delay(150); Mirf.setTADDR(addr); Mirf.setRADDR(addr); Mirf.configRegister(RF_SETUP,0x06); // 1MHz rate Mirf.configRegister(EN_AA, 0x00); Mirf.configRegister(SETUP_RETR, 0x00); Mirf.configRegister(SETUP_AW, 0x01); Mirf.payload = 13; Mirf.channel = 50; Mirf.config(); delay(200); byte reg = 0; Mirf.readRegister( CONFIG, ®, sizeof(reg) ); Serial.print( "CONFIG = " ); Serial.println(reg,BIN); Mirf.readRegister( SETUP_RETR, ®, sizeof(reg) ); Serial.print( "SETUP_RETR = " ); Serial.println(reg,BIN); Mirf.readRegister( SETUP_AW, ®, sizeof(reg) ); Serial.print( "SETUP_AW = " ); Serial.println(reg,BIN); Mirf.readRegister( RF_CH, ®, sizeof(reg) ); Serial.print( "RF_CH = " ); Serial.println(reg,DEC); Mirf.readRegister( RF_SETUP, ®, sizeof(reg) ); Serial.print( "RF_SETUP = " ); Serial.println(reg,BIN); Mirf.readRegister( RX_PW_P0, ®, sizeof(reg) ); Serial.print( "RX_PW_P0 = " ); Serial.println(reg,BIN); } void loop(){ int i; char buff[13]; //receiving bool packet_ok = false; if(Mirf.dataReady()) { Mirf.getData((uint8_t *)buff); for(i=0;i<13;i++) if (buff[i]!=0) packet_ok = true; //if (packet_ok){ Serial.print("> ["); Serial.print(Mirf.getStatus(),DEC); Serial.print("]: "); for(i=0;i<13;i++) Serial.print(buff[i],HEX); Serial.println(); //} } delay(100); }
Ни разу еще не использовал этот трансивер хоть и есть в наличии, но на вскидку, приходят в голову только 2-ва варианта: 1-й это попробовать библиотеку из другого источника(была у меня похожая трабла с Infrared из 3-х библиотек только 1-на заработала). 2-й вариант инициализировать трансивер каждый раз при смене состояния прием/передача/сон Предполагаю, что это связано с довольно широкими возможностями трансивера к примеру прием и передача на разных каналах, жесткий лимит скорости обмена, определение состояния канала перед передачей, и большая часть этих задач потребует перезаписывать регистры каждый раз при смене выполняемой функции, учитывая выше написанное, могу предположить, что автор библиотеки преднамеренно использует очистку регистров каждый раз при смене режима модуля. Может ЭТО пригодится, там в части Troubleshooting описывается нечто похожее.
Все оказалось проще, при инициализации, модуль потреблял больше энергии чем мог дать клон ардуины мега с 3.3в выхода, соотвественно просидало напряжение и все сбрасывалось до дефолтных значений. Вылечилось установкой конденсатора на питание.
проблема - если передавать редко, те с паузами , NRF24L01+ отказывается работать http://forum.amperka.ru/threads/nrf-не-передает-пакеты-если-к-ней-обращаться-редко.12165/