NRF52 -> Will not wake after sleep



  • Hi

    Finally I have had time to solder my project, Temp_hum, and started to create the code for it. But I struggle with some bascis

    Code for the sensor:

    
    #define MY_NODE_ID 37
    
    // Enable debug prints
    #define MY_DEBUG
    
    // #define MY_DEBUG_VERBOSE_NRF5_ESB
    #define MY_BAUD_RATE 115200
    
    // Enable and select radio type attached
    //#define MY_RADIO_RF24
    //#define MY_RADIO_RFM69
    //#define MY_RS485
    #define MY_RADIO_NRF5_ESB
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_VOLT 2
    
    #define IS_NRF52
    // #define IS_NRF51
    
    #define SHORT_WAIT 100
    
    // Sleep time between sensor updates (in milliseconds)
    static const uint64_t UPDATE_INTERVAL = 6000;
    
    static bool metric = true;
    
    float batteryPcnt;
    float oldBatteryPcnt;
    
    #include <MySensors.h>
    #include <SI7021.h>
    
    static SI7021 sensor;
    
    void disableNfc()
    { //only applied to nRF52
    
    #ifdef IS_NRF52
      //Make pins 9 and 10 usable as GPIO pins.
      NRF_NFCT->TASKS_DISABLE = 1; //disable NFC
      NRF_NVMC->CONFIG = 1;        // Write enable the UICR
      NRF_UICR->NFCPINS = 0;       //Make pins 9 and 10 usable as GPIO pins.
      NRF_NVMC->CONFIG = 0;        // Put the UICR back into read-only mode.
    #endif
    }
    
    void turnOffRadio()
    {
      NRF_RADIO->TASKS_DISABLE = 1;
      while (!(NRF_RADIO->EVENTS_DISABLED))
      {
      } //until radio is confirmed disabled
    }
    
    void turnOffAdc()
    {
    #ifndef IS_NRF52
      if (NRF_SAADC->ENABLE)
      { //if enabled, then disable the SAADC
        NRF_SAADC->TASKS_STOP = 1;
        while (NRF_SAADC->EVENTS_STOPPED)
        {
        }                      //wait until stopping of SAADC is confirmed
        NRF_SAADC->ENABLE = 0; //disable the SAADC
        while (NRF_SAADC->ENABLE)
        {
        } //wait until the disable is confirmed
      }
    #endif
    }
    
    void turnOffUarte0()
    {
    #ifndef IS_NRF52
      NRF_UARTE0->TASKS_STOPRX = 1;
      NRF_UARTE0->TASKS_STOPTX = 1;
      NRF_UARTE0->TASKS_SUSPEND = 1;
      NRF_UARTE0->ENABLE = 0; //disable UART0
      while (NRF_UARTE0->ENABLE != 0)
      {
      }; //wait until UART0 is confirmed disabled.
    #endif
    
    #ifdef IS_NRF51
      NRF_UART0->TASKS_STOPRX = 1;
      NRF_UART0->TASKS_STOPTX = 1;
      NRF_UART0->TASKS_SUSPEND = 1;
      NRF_UART0->ENABLE = 0; //disable UART0
      while (NRF_UART0->ENABLE != 0)
      {
      }; //wait until UART0 is confirmed disabled.
    #endif
    }
    
    void turnOffHighFrequencyClock()
    {
      NRF_CLOCK->TASKS_HFCLKSTOP = 1;
      while ((NRF_CLOCK->HFCLKSTAT) & 0x0100)
      {
      } //wait as long as HF clock is still running.
    }
    
    void mySleepPrepare()
    { //turn-off energy drains prior to sleep
      turnOffHighFrequencyClock();
      turnOffRadio();
      //turnOffUarte0();
    }
    
    void presentation()
    {
      Serial.println("Presentation");
      // Send the sketch info to the gateway
      sendSketchInfo("TemperatureAndHumidity", "1.2");
    
      // Present sensors as children to gateway
      present(CHILD_ID_HUM, S_HUM, "Humidity");
      delay(SHORT_WAIT);
      present(CHILD_ID_TEMP, S_TEMP, "Temperature");
      delay(SHORT_WAIT);
      present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
    
      metric = getControllerConfig().isMetric;
      Serial.println("End presention");
    }
    
    void setup()
    {
      Serial.println("Setup");
      hwInit();
      
      disableNfc(); //remove unnecessary energy drains
      turnOffAdc(); //remove unnecessary energy drains
      while (not sensor.begin())
      {
        Serial.println(F("Sensor not detected!"));
        wait(5000);
      }
      Serial.println("End Setup");
    }
    
    void mySleep(uint32_t ms)
    {
      mySleepPrepare();  //Take steps to reduce drains on battery current prior to sleeping
      sleep(ms);
    }
    
    void loop()
    {
      // Read temperature & humidity from sensor.
      const float temperature = float(metric ? sensor.getCelsiusHundredths() : sensor.getFahrenheitHundredths()) / 100.0;
      const float humidity = float(sensor.getHumidityBasisPoints()) / 100.0;
    
    #ifdef MY_DEBUG
      Serial.print(F("Temp "));
      Serial.print(temperature);
      Serial.print(metric ? 'C' : 'F');
      Serial.print(F("\tHum "));
      Serial.println(humidity);
    #endif
    
      static MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      static MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      static MyMessage msgBattery(CHILD_ID_VOLT, V_VOLTAGE);
    
      send(msgTemp.set(temperature, 2));
    
      wait(SHORT_WAIT);
      send(msgHum.set(humidity, 2));
    
      float batteryVolt = getInternalVoltage();
      batteryPcnt =(batteryVolt / 3.3) * 100;
      if (batteryPcnt > 100)
      {
        batteryPcnt = 100;
      }
    #ifdef MY_DEBUG
      Serial.print(F("Vbat "));
      Serial.print(batteryVolt);
      Serial.print(F(" Battery percent "));
      Serial.println(batteryPcnt);
    #endif
    
      // Battery readout should only go down. So report only when new value is smaller than previous one.
      if (batteryPcnt < oldBatteryPcnt)
      {
    
        wait(SHORT_WAIT);
        send(msgBattery.set(batteryVolt, 3));
        wait(SHORT_WAIT);
        if (batteryPcnt < oldBatteryPcnt)
        {
          sendBatteryLevel(batteryPcnt);
          oldBatteryPcnt = batteryPcnt;
        }
    
        // Sleep until next update to save energy
        // 
        
      }
      //delay(5000);
      mySleep(UPDATE_INTERVAL);
    }
    
    float getInternalVoltage()
    {
      return ((float)hwCPUVoltage()) / 1000.0;
    }
    
    

    Have some problems.

    First and biggest: The sensor will not wake,

    2577 TSF:MSG:SEND,37-37-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:33.34
    Vbat 3.29 Battery percent 99.67
    2587 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2591 TSF:TDI:TPD
    8593 MCO:SLP:WUP=-1
    8595 TSF:TRI:TPU
    Temp 23.46C	Hum 33.85
    8626 TSF:MSG:SEND,37-37-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:23.46
    8733 TSF:MSG:SEND,37-37-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:33.85
    Vbat 3.29 Battery percent 99.67
    8743 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    8748 TSF:TDI:TPD
    

    (Some times I got stuck at:

    5803 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    5807 TSF:TDI:TPD
    11809 MCO:SLP:WUP=-1
    11811 TSF:TRI:TPU
    Temp 22.69C	Hum 31.08
    11842 TSF:MSG:SEND,37-37-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:22.69
    

    )

    Second when im trying to debug with

    #define MY_DEBUG_VERBOSE_NRF5_ESB
    

    the node will not pass presentation.

    153 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=5
    4158 TSF:MSG:SEND,37-37-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.3.2
    4164 NRF5:SND:TO=0,LEN=8,PID=1,NOACK=0
    4169 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4174 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
    4180 NRF5:RX:LEN=9,NOACK=0,PID=2,RSSI=-74,RX=0
    4184 TSF:MSG:READ,0-0-37,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
    4190 NRF5:RX:LEN=8,NOACK=0,PID=1,RSSI=-53,RX=0
    4194 TSF:MSG:READ,0-0-37,s=255,c=3,t=6,pt=0,l=1,sg=0:M
    Presentation
    4200 NRF5:SND:TO=0,LEN=29,PID=2,NOACK=0
    4206 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=5
    4210 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=11,pt=0,l=22,sg=0,ft=0,st=OK:TemperatureAndHumidity
    4218 NRF5:SND:TO=0,LEN=10,PID=3,NOACK=0
    4223 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4228 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:1.2
    4234 NRF5:SND:TO=0,LEN=15,PID=0,NOACK=0
    4239 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4244 TSF:MSG:SEND,37-37-0-0,s=0,c=0,t=7,pt=0,l=8,sg=0,ft=0,st=OK:Humidity
    

    Someone that can help me?



  • Recently, I have faced exactly the same situation. Since this is no longer an isolated case, it means that the case is in the mysensors library.



  • I have a feeling that the

    Wait()
    

    Is the problem but haven't had time to investigate.



  • I'm stumped so far.
    I have a very similar board, bt832 + SI7021, with a very similar sketch, which seems to work OK.
    I don't see anything out of place in your sketch.



  • @nagelc can you use
    MY_DEBUG_VERBOSE_NRF5_ESB

    Do I need to add a bigger capacitor between gnd and +3?



  • I tried with MY_DEBUG_VERBOSE_NRF5_ESB, and it woke from sleep. I have it seeping for one minute.

    I posted my code to my github in case you want to take a look:
    https://github.com/spike314/BT8_SI_Sketch

    I have the nrf5 routines and some battery routines in separate files for convenience, but I think we are using the same code otherwise.



  • @nagelc Thanks will try



  • I don't remember exactly, but I think in my case it was due to using wait b sleep in before() and presentation(). This may be due to the power of the radio module.



  • I have been trying @nagelc code with a lot of debug prints and I think that my device is stuck after

    MyHwNRF5.cpp

    inline void hwSleep(void)
    {	CORE_DEBUG(PSTR("In hwSleep, 345\n"));
    	__WFE();
    	__SEV();
    	__WFE();
    	CORE_DEBUG(PSTR("In hwSleep, 351\n"));
    }
    
    int8_t hwSleep(uint32_t ms)
    {
    	hwSleepPrepare(ms);
    	while (nrf5_rtc_event_triggered == false) {
    		hwSleep();
    	}
    	CORE_DEBUG(PSTR("In hwSleep, 357\n"));
    	hwSleepEnd(ms);
    	return MY_WAKE_UP_BY_TIMER;
    }
    

    And I will not go to hwSleepEnd

    11274 MCO:SLP:MS=5000,SMS=0,I1=255,M1=255,I2=255,M2=255
    11280 TSF:TDI:TPD
    11281 After transport Disable
    11284 Before hwSleep
    11286 In hwSleepPrepare, 287
    11289 In hwSleepPrepare,300
    11291 In hwSleep, 345
    

Log in to reply
 

Suggested Topics

0
Online

11.2k
Users

11.1k
Topics

112.5k
Posts