Инициализация NRF24L01+ 2.4Ghz

Тема в разделе "Arduino & Shields", создана пользователем mixir, 23 ноя 2013.

  1. mixir

    mixir Нуб

    Доброго времени суток!
    Подскажите кто сталкивался со следующей проблемой:

    При инициализации модуля через библиотеку 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, &reg, sizeof(reg) );
      Serial.print( "CONFIG = " );
      Serial.println(reg,BIN);
      Mirf.readRegister( SETUP_RETR, &reg, sizeof(reg) );
      Serial.print( "SETUP_RETR  = " );
      Serial.println(reg,BIN);
      Mirf.readRegister( SETUP_AW, &reg, sizeof(reg) );
      Serial.print( "SETUP_AW  = " );
      Serial.println(reg,BIN);
      Mirf.readRegister( RF_CH, &reg, sizeof(reg) );
      Serial.print( "RF_CH  = " );
      Serial.println(reg,DEC);
      Mirf.readRegister( RF_SETUP, &reg, sizeof(reg) );
      Serial.print( "RF_SETUP  = " );
      Serial.println(reg,BIN);
      Mirf.readRegister( RX_PW_P0, &reg, 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. fiberline

    fiberline Нуб

    Ни разу еще не использовал этот трансивер хоть и есть в наличии, но на вскидку, приходят в голову только 2-ва варианта: 1-й это попробовать библиотеку из другого источника(была у меня похожая трабла с Infrared из 3-х библиотек только 1-на заработала).
    2-й вариант инициализировать трансивер каждый раз при смене состояния прием/передача/сон
    Предполагаю, что это связано с довольно широкими возможностями трансивера к примеру прием и передача на разных каналах, жесткий лимит скорости обмена, определение состояния канала перед передачей, и большая часть этих задач потребует перезаписывать регистры каждый раз при смене выполняемой функции, учитывая выше написанное, могу предположить, что автор библиотеки преднамеренно использует очистку регистров каждый раз при смене режима модуля.
    Может ЭТО пригодится, там в части Troubleshooting описывается нечто похожее.
     
    Последнее редактирование: 29 ноя 2013
  3. mixir

    mixir Нуб

    Все оказалось проще, при инициализации, модуль потреблял больше энергии чем мог дать клон ардуины мега с 3.3в выхода, соотвественно просидало напряжение и все сбрасывалось до дефолтных значений. Вылечилось установкой конденсатора на питание.
     
  4. fiberline

    fiberline Нуб

    Ну собственно это и было описано в стать по ссылке выше. Удачи!
     
  5. Condensator

    Condensator Нуб