nPM1300 Quiescent Current

I've been testing the nPM1300 and I'm running into some interesting issues. I'm using NCS 2.7.x (originally evaluated on 2.6.x) and got it to the sweet spot where the nRF9161 + nPM1300 was drawing < 10uA. (or so I thought until I revisited it!)

Here's how it's being used:

  • Initializing buck2 with a 255K resistor supplying 3.3V
  • Keeping buck1 on at all times at 2.7V (255K resistor) (are these VSET values OK for maxing out the regulator?)
  • All LDO output/inputs are grounded and unused

Buck2 is only used when USB is connected. When disabled, I'm seeing a range of quiescent currents from 8uA up to 108uA depending on when the device is being configured (Seems like possibly related to https://docs.nordicsemi.com/bundle/errata_nPM1300_Rev1/page/ERR/nPM1300/Rev1/latest/anomaly_300_31.html?) I saw that reading from the device prevents this high Iq but it still seems higher than expected.

Additionally, as a different issue but potentially related, whenever I probe the SDA line with my multi-meter, nPM1300 increases current draw to 1mA and doesn't go back down unless reset.

has already looked at the design and I've addressed the functionality concerns a while back.

Is there anything I can do to get the operation to be more stable/repeatable? Depending on how long the device is powered (or not powered at all) I get different quiescent currents at the battery. (Powered only on 3.6V on a bench supply via a JouleScope)

By the way my device tree def is as follows:

	npm1300_pmic: pmic@6b {
		compatible = "nordic,npm1300";
		reg = <0x6b>;

		npm1300_gpio: gpio-controller {
			compatible = "nordic,npm1300-gpio";
			gpio-controller;
			#gpio-cells = <2>;
			ngpios = <5>;
		};

		npm1300_leds: leds {
			compatible = "nordic,npm1300-led";
			nordic,led0-mode = "error";
			nordic,led1-mode = "charging";
			nordic,led2-mode = "host";
		};

		npm1300_charger: charger {
			compatible = "nordic,npm1300-charger";
			term-microvolt = <4150000>;
			term-warm-microvolt = <4000000>;
			current-microamp = <800000>;
			dischg-limit-microamp = <1000000>;
			vbus-limit-microamp = <1000000>;
			thermistor-ohms = <10000>;
			thermistor-beta = <3380>;
			charging-enable;
		};

		npm1300_regulators: regulators {
			compatible = "nordic,npm1300-regulator";

			npm1300_buck1: BUCK1 {
				regulator-min-microvolt = <2700000>;
				regulator-max-microvolt = <3300000>;
				regulator-always-on;
			};

			npm1300_buck2: BUCK2 {
				regulator-min-microvolt = <3300000>;
				regulator-max-microvolt = <3300000>;
			};


		};
	};

To add to the fun, I've noticed that when warmer I get closer to the expected quiescent current of about 4uA. (measured post hot air rework) Once it cools off it can land anywhere in the aforementioned range.

I've disabled the configuration in the mcuboot image:

CONFIG_REGULATOR=n
CONFIG_REGULATOR_NPM1300=n
CONFIG_MFD_NPM1300=n
CONFIG_I2C=n
CONFIG_GPIO_NPM1300=n
CONFIG_NPM1300_CHARGER=n

But allow the default regulator and MFD initialization calls to happen during boot. I did notice that the buck status register gets read a couple times during init. Doing that after enabling the buck2 pulldown and disabling the buck2 output appears to help reduce the quiescent current from 100uA to 10uA. (my thoughts why it could be related to [31] BUCK: Increased BUCK Hysteretic quiescent current)

Any help is greatly appreciated.

Parents
  • Hi,

     

    It sounds like one or more GPIOs are floating, based on your description here:

    Additionally, as a different issue but potentially related, whenever I probe the SDA line with my multi-meter, nPM1300 increases current draw to 1mA and doesn't go back down unless reset.

    Could you share your compiled zephyr.dts file? Are you using internal pull-resistors on your SDA/SCL lines?

     

    Kind regards,

    Håkon

  • Hey  

    Could you share your compiled zephyr.dts file?

    Sure! See the attached.

    /dts-v1/;
    
    / {
    	#address-cells = < 0x1 >;
    	#size-cells = < 0x1 >;
    	model = "Circuit Dojo nRF9161 Feather";
    	compatible = "circuitdojo,feather-nrf9161";
    	chosen {
    		zephyr,entropy = &psa_rng;
    		zephyr,flash-controller = &flash_controller;
    		zephyr,console = &uart0;
    		zephyr,shell-uart = &uart0;
    		zephyr,uart-mcumgr = &uart0;
    		nordic,modem-trace-uart = &uart1;
    		nordic,pm-ext-flash = &w25q128jv;
    		zephyr,flash = &flash0;
    		zephyr,sram = &sram0_ns;
    		zephyr,code-partition = &slot0_ns_partition;
    	};
    	aliases {
    		sw0 = &button0;
    		mcuboot-button0 = &button0;
    		watchdog0 = &wdt0;
    		spi-flash0 = &w25q128jv;
    		accel0 = &lis2dh;
    	};
    	soc {
    		#address-cells = < 0x1 >;
    		#size-cells = < 0x1 >;
    		compatible = "nordic,nrf9161-laca", "nordic,nrf9120", "nordic,nrf91", "simple-bus";
    		interrupt-parent = < &nvic >;
    		ranges;
    		nvic: interrupt-controller@e000e100 {
    			#address-cells = < 0x1 >;
    			compatible = "arm,v8m-nvic";
    			reg = < 0xe000e100 0xc00 >;
    			interrupt-controller;
    			#interrupt-cells = < 0x2 >;
    			arm,num-irq-priority-bits = < 0x3 >;
    			phandle = < 0x1 >;
    		};
    		systick: timer@e000e010 {
    			compatible = "arm,armv8m-systick";
    			reg = < 0xe000e010 0x10 >;
    			status = "disabled";
    		};
    		sram0: memory@20000000 {
    			compatible = "mmio-sram";
    			reg = < 0x20000000 0x40000 >;
    		};
    		peripheral@40000000 {
    			#address-cells = < 0x1 >;
    			#size-cells = < 0x1 >;
    			ranges = < 0x0 0x40000000 0x10000000 >;
    			flash_controller: flash-controller@39000 {
    				compatible = "nordic,nrf91-flash-controller";
    				reg = < 0x39000 0x1000 >;
    				partial-erase;
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x1 >;
    				flash0: flash@0 {
    					compatible = "soc-nv-flash";
    					erase-block-size = < 0x1000 >;
    					write-block-size = < 0x4 >;
    					reg = < 0x0 0x100000 >;
    					partitions {
    						compatible = "fixed-partitions";
    						#address-cells = < 0x1 >;
    						#size-cells = < 0x1 >;
    						boot_partition: partition@0 {
    							label = "mcuboot";
    							reg = < 0x0 0x10000 >;
    						};
    						slot0_partition: partition@10000 {
    							label = "image-0";
    							reg = < 0x10000 0x40000 >;
    						};
    						slot0_ns_partition: partition@50000 {
    							label = "image-0-nonsecure";
    							reg = < 0x50000 0x35000 >;
    						};
    						slot1_partition: partition@85000 {
    							label = "image-1";
    							reg = < 0x85000 0x40000 >;
    						};
    						slot1_ns_partition: partition@c5000 {
    							label = "image-1-nonsecure";
    							reg = < 0xc5000 0x35000 >;
    						};
    						storage_partition: partition@fa000 {
    							label = "storage";
    							reg = < 0xfa000 0x6000 >;
    						};
    					};
    				};
    			};
    			adc: adc@e000 {
    				compatible = "nordic,nrf-saadc";
    				reg = < 0xe000 0x1000 >;
    				interrupts = < 0xe 0x1 >;
    				status = "okay";
    				#io-channel-cells = < 0x1 >;
    			};
    			dppic: dppic@17000 {
    				compatible = "nordic,nrf-dppic";
    				reg = < 0x17000 0x1000 >;
    				status = "okay";
    			};
    			egu0: egu@1b000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x1b000 0x1000 >;
    				interrupts = < 0x1b 0x1 >;
    				status = "okay";
    			};
    			egu1: egu@1c000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x1c000 0x1000 >;
    				interrupts = < 0x1c 0x1 >;
    				status = "okay";
    			};
    			egu2: egu@1d000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x1d000 0x1000 >;
    				interrupts = < 0x1d 0x1 >;
    				status = "okay";
    			};
    			egu3: egu@1e000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x1e000 0x1000 >;
    				interrupts = < 0x1e 0x1 >;
    				status = "okay";
    			};
    			egu4: egu@1f000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x1f000 0x1000 >;
    				interrupts = < 0x1f 0x1 >;
    				status = "okay";
    			};
    			egu5: egu@20000 {
    				compatible = "nordic,nrf-egu";
    				reg = < 0x20000 0x1000 >;
    				interrupts = < 0x20 0x1 >;
    				status = "okay";
    			};
    			ipc: ipc@2a000 {
    				compatible = "nordic,nrf-ipc";
    				reg = < 0x2a000 0x1000 >;
    				interrupts = < 0x2a 0x1 >;
    				status = "okay";
    			};
    			i2s0: i2s@28000 {
    				compatible = "nordic,nrf-i2s";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0x28000 0x1000 >;
    				interrupts = < 0x28 0x1 >;
    				status = "disabled";
    			};
    			kmu: kmu@39000 {
    				compatible = "nordic,nrf-kmu";
    				reg = < 0x39000 0x1000 >;
    				interrupts = < 0x39 0x1 >;
    				status = "okay";
    			};
    			pdm0: pdm@26000 {
    				compatible = "nordic,nrf-pdm";
    				reg = < 0x26000 0x1000 >;
    				interrupts = < 0x26 0x1 >;
    				status = "disabled";
    			};
    			regulators: regulator@4000 {
    				compatible = "nordic,nrf-regulators";
    				reg = < 0x4000 0x1000 >;
    				status = "okay";
    			};
    			vmc: vmc@3a000 {
    				compatible = "nordic,nrf-vmc";
    				reg = < 0x3a000 0x1000 >;
    				status = "okay";
    			};
    			uart0: uart@8000 {
    				compatible = "nordic,nrf-uarte";
    				reg = < 0x8000 0x1000 >;
    				interrupts = < 0x8 0x1 >;
    				status = "okay";
    				current-speed = < 0x1c200 >;
    				pinctrl-0 = < &uart0_default >;
    				pinctrl-1 = < &uart0_sleep >;
    				pinctrl-names = "default", "sleep";
    			};
    			uart1: uart@9000 {
    				compatible = "nordic,nrf-uarte";
    				reg = < 0x9000 0x1000 >;
    				interrupts = < 0x9 0x1 >;
    				status = "disabled";
    				current-speed = < 0xf4240 >;
    				pinctrl-0 = < &uart1_default >;
    				pinctrl-1 = < &uart1_sleep >;
    				pinctrl-names = "default", "sleep";
    			};
    			uart2: uart@a000 {
    				compatible = "nordic,nrf-uarte";
    				reg = < 0xa000 0x1000 >;
    				interrupts = < 0xa 0x1 >;
    				status = "disabled";
    			};
    			uart3: uart@b000 {
    				compatible = "nordic,nrf-uarte";
    				reg = < 0xb000 0x1000 >;
    				interrupts = < 0xb 0x1 >;
    				status = "disabled";
    			};
    			i2c0: i2c@8000 {
    				compatible = "nordic,nrf-twim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0x8000 0x1000 >;
    				clock-frequency = < 0x186a0 >;
    				interrupts = < 0x8 0x1 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			i2c1: i2c@9000 {
    				compatible = "nordic,nrf-twim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0x9000 0x1000 >;
    				clock-frequency = < 0x186a0 >;
    				interrupts = < 0x9 0x1 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			i2c2: i2c@a000 {
    				compatible = "nordic,nrf-twim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0xa000 0x1000 >;
    				clock-frequency = < 0x186a0 >;
    				interrupts = < 0xa 0x1 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "okay";
    				pinctrl-0 = < &i2c2_default >;
    				pinctrl-1 = < &i2c2_sleep >;
    				pinctrl-names = "default", "sleep";
    				lis2dh: lis2dh@19 {
    					compatible = "st,lis2dh";
    					reg = < 0x19 >;
    					irq-gpios = < &gpio0 0x13 0x0 >, < &gpio0 0xc 0x0 >;
    				};
    				npm1300_pmic: pmic@6b {
    					compatible = "nordic,npm1300";
    					reg = < 0x6b >;
    					npm1300_gpio: gpio-controller {
    						compatible = "nordic,npm1300-gpio";
    						gpio-controller;
    						#gpio-cells = < 0x2 >;
    						ngpios = < 0x5 >;
    					};
    					npm1300_leds: leds {
    						compatible = "nordic,npm1300-led";
    						nordic,led0-mode = "error";
    						nordic,led1-mode = "charging";
    						nordic,led2-mode = "host";
    					};
    					npm1300_charger: charger {
    						compatible = "nordic,npm1300-charger";
    						term-microvolt = < 0x3f52f0 >;
    						term-warm-microvolt = < 0x3d0900 >;
    						current-microamp = < 0xc3500 >;
    						dischg-limit-microamp = < 0xf4240 >;
    						vbus-limit-microamp = < 0xf4240 >;
    						thermistor-ohms = < 0x2710 >;
    						thermistor-beta = < 0xd34 >;
    						charging-enable;
    					};
    					npm1300_regulators: regulators {
    						compatible = "nordic,npm1300-regulator";
    						npm1300_buck1: BUCK1 {
    							regulator-min-microvolt = < 0x2932e0 >;
    							regulator-max-microvolt = < 0x325aa0 >;
    							regulator-always-on;
    						};
    						npm1300_buck2: BUCK2 {
    							regulator-min-microvolt = < 0x325aa0 >;
    							regulator-max-microvolt = < 0x325aa0 >;
    						};
    					};
    				};
    			};
    			i2c3: i2c@b000 {
    				compatible = "nordic,nrf-twim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0xb000 0x1000 >;
    				clock-frequency = < 0x186a0 >;
    				interrupts = < 0xb 0x1 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			spi0: spi@8000 {
    				compatible = "nordic,nrf-spim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0x8000 0x1000 >;
    				interrupts = < 0x8 0x1 >;
    				max-frequency = < 0x7a1200 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			spi1: spi@9000 {
    				compatible = "nordic,nrf-spim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0x9000 0x1000 >;
    				interrupts = < 0x9 0x1 >;
    				max-frequency = < 0x7a1200 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			spi2: spi@a000 {
    				compatible = "nordic,nrf-spim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0xa000 0x1000 >;
    				interrupts = < 0xa 0x1 >;
    				max-frequency = < 0x7a1200 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "disabled";
    			};
    			spi3: spi@b000 {
    				compatible = "nordic,nrf-spim";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				reg = < 0xb000 0x1000 >;
    				interrupts = < 0xb 0x1 >;
    				max-frequency = < 0x7a1200 >;
    				easydma-maxcnt-bits = < 0xd >;
    				status = "okay";
    				cs-gpios = < &gpio0 0x4 0x1 >;
    				pinctrl-0 = < &spi3_default >;
    				pinctrl-1 = < &spi3_sleep >;
    				pinctrl-names = "default", "sleep";
    				w25q128jv: w25q128jv@0 {
    					compatible = "jedec,spi-nor";
    					reg = < 0x0 >;
    					spi-max-frequency = < 0x2625a00 >;
    					size = < 0x8000000 >;
    					has-dpd;
    					t-enter-dpd = < 0xdac >;
    					t-exit-dpd = < 0xdac >;
    					jedec-id = [ EF 40 18 ];
    				};
    			};
    			pwm0: pwm@21000 {
    				compatible = "nordic,nrf-pwm";
    				reg = < 0x21000 0x1000 >;
    				interrupts = < 0x21 0x1 >;
    				status = "okay";
    				#pwm-cells = < 0x3 >;
    				pinctrl-0 = < &pwm0_default >;
    				pinctrl-1 = < &pwm0_sleep >;
    				pinctrl-names = "default", "sleep";
    			};
    			pwm1: pwm@22000 {
    				compatible = "nordic,nrf-pwm";
    				reg = < 0x22000 0x1000 >;
    				interrupts = < 0x22 0x1 >;
    				status = "disabled";
    				#pwm-cells = < 0x3 >;
    			};
    			pwm2: pwm@23000 {
    				compatible = "nordic,nrf-pwm";
    				reg = < 0x23000 0x1000 >;
    				interrupts = < 0x23 0x1 >;
    				status = "disabled";
    				#pwm-cells = < 0x3 >;
    			};
    			pwm3: pwm@24000 {
    				compatible = "nordic,nrf-pwm";
    				reg = < 0x24000 0x1000 >;
    				interrupts = < 0x24 0x1 >;
    				status = "disabled";
    				#pwm-cells = < 0x3 >;
    			};
    			gpio0: gpio@842500 {
    				compatible = "nordic,nrf-gpio";
    				gpio-controller;
    				reg = < 0x842500 0x300 >;
    				#gpio-cells = < 0x2 >;
    				status = "okay";
    				port = < 0x0 >;
    				gpiote-instance = < &gpiote >;
    				sense-edge-mask = < 0xffff >;
    				phandle = < 0x8 >;
    			};
    			rtc0: rtc@14000 {
    				compatible = "nordic,nrf-rtc";
    				reg = < 0x14000 0x1000 >;
    				cc-num = < 0x4 >;
    				interrupts = < 0x14 0x1 >;
    				status = "disabled";
    				clock-frequency = < 0x8000 >;
    				prescaler = < 0x1 >;
    			};
    			rtc1: rtc@15000 {
    				compatible = "nordic,nrf-rtc";
    				reg = < 0x15000 0x1000 >;
    				cc-num = < 0x4 >;
    				interrupts = < 0x15 0x1 >;
    				status = "disabled";
    				clock-frequency = < 0x8000 >;
    				prescaler = < 0x1 >;
    			};
    			clock: clock@5000 {
    				compatible = "nordic,nrf-clock";
    				reg = < 0x5000 0x1000 >;
    				interrupts = < 0x5 0x1 >;
    				status = "okay";
    			};
    			power: power@5000 {
    				compatible = "nordic,nrf-power";
    				reg = < 0x5000 0x1000 >;
    				ranges = < 0x0 0x5000 0x1000 >;
    				interrupts = < 0x5 0x1 >;
    				status = "okay";
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x1 >;
    				gpregret1: gpregret1@51c {
    					#address-cells = < 0x1 >;
    					#size-cells = < 0x1 >;
    					compatible = "nordic,nrf-gpregret";
    					reg = < 0x51c 0x1 >;
    					status = "okay";
    				};
    				gpregret2: gpregret2@520 {
    					#address-cells = < 0x1 >;
    					#size-cells = < 0x1 >;
    					compatible = "nordic,nrf-gpregret";
    					reg = < 0x520 0x1 >;
    					status = "okay";
    				};
    			};
    			wdt: wdt0: watchdog@18000 {
    				compatible = "nordic,nrf-wdt";
    				reg = < 0x18000 0x1000 >;
    				interrupts = < 0x18 0x1 >;
    				status = "okay";
    			};
    			timer0: timer@f000 {
    				compatible = "nordic,nrf-timer";
    				status = "disabled";
    				reg = < 0xf000 0x1000 >;
    				cc-num = < 0x6 >;
    				max-bit-width = < 0x20 >;
    				interrupts = < 0xf 0x1 >;
    				prescaler = < 0x0 >;
    			};
    			timer1: timer@10000 {
    				compatible = "nordic,nrf-timer";
    				status = "disabled";
    				reg = < 0x10000 0x1000 >;
    				cc-num = < 0x6 >;
    				max-bit-width = < 0x20 >;
    				interrupts = < 0x10 0x1 >;
    				prescaler = < 0x0 >;
    				phandle = < 0xe >;
    			};
    			timer2: timer@11000 {
    				compatible = "nordic,nrf-timer";
    				status = "disabled";
    				reg = < 0x11000 0x1000 >;
    				cc-num = < 0x6 >;
    				max-bit-width = < 0x20 >;
    				interrupts = < 0x11 0x1 >;
    				prescaler = < 0x0 >;
    			};
    		};
    		gpiote: gpiote1: gpiote@40031000 {
    			compatible = "nordic,nrf-gpiote";
    			reg = < 0x40031000 0x1000 >;
    			interrupts = < 0x31 0x5 >;
    			status = "okay";
    			instance = < 0x1 >;
    			phandle = < 0xd >;
    		};
    	};
    	pinctrl: pin-controller {
    		compatible = "nordic,nrf-pinctrl";
    		uart0_default: uart0_default {
    			phandle = < 0x2 >;
    			group1 {
    				psels = < 0xb >, < 0x2000a >;
    			};
    		};
    		uart0_sleep: uart0_sleep {
    			phandle = < 0x3 >;
    			group1 {
    				psels = < 0xb >, < 0x2000a >;
    				low-power-enable;
    			};
    		};
    		uart1_default: uart1_default {
    			phandle = < 0x4 >;
    			group1 {
    				psels = < 0x18 >, < 0x20017 >;
    			};
    		};
    		uart1_sleep: uart1_sleep {
    			phandle = < 0x5 >;
    			group1 {
    				psels = < 0x18 >, < 0x20017 >;
    				low-power-enable;
    			};
    		};
    		i2c2_default: i2c2_default {
    			phandle = < 0x6 >;
    			group1 {
    				psels = < 0x180002 >, < 0x160001 >;
    			};
    		};
    		i2c2_sleep: i2c2_sleep {
    			phandle = < 0x7 >;
    			group1 {
    				psels = < 0x180002 >, < 0x160001 >;
    				low-power-enable;
    			};
    		};
    		pwm0_default: pwm0_default {
    			phandle = < 0xb >;
    			group1 {
    				psels = < 0x2c0019 >;
    			};
    		};
    		pwm0_sleep: pwm0_sleep {
    			phandle = < 0xc >;
    			group1 {
    				psels = < 0x2c0019 >;
    				low-power-enable;
    			};
    		};
    		spi3_default: spi3_default {
    			phandle = < 0x9 >;
    			group1 {
    				psels = < 0x80006 >, < 0xa0007 >, < 0xc0005 >;
    			};
    		};
    		spi3_sleep: spi3_sleep {
    			phandle = < 0xa >;
    			group1 {
    				psels = < 0x80006 >, < 0xa0007 >, < 0xc0005 >;
    				low-power-enable;
    			};
    		};
    	};
    	rng_hci: entropy_bt_hci {
    		compatible = "zephyr,bt-hci-entropy";
    		status = "okay";
    	};
    	sw_pwm: sw-pwm {
    		compatible = "nordic,nrf-sw-pwm";
    		status = "disabled";
    		generator = < &timer1 >;
    		clock-prescaler = < 0x0 >;
    		#pwm-cells = < 0x3 >;
    	};
    	cpus {
    		#address-cells = < 0x1 >;
    		#size-cells = < 0x0 >;
    		cpu@0 {
    			device_type = "cpu";
    			compatible = "arm,cortex-m33f";
    			reg = < 0x0 >;
    			#address-cells = < 0x1 >;
    			#size-cells = < 0x1 >;
    			mpu: mpu@e000ed90 {
    				compatible = "arm,armv8m-mpu";
    				reg = < 0xe000ed90 0x40 >;
    			};
    		};
    	};
    	psa_rng: psa-rng {
    		compatible = "zephyr,psa-crypto-rng";
    		status = "okay";
    	};
    	buttons {
    		compatible = "gpio-keys";
    		button0: button_0 {
    			gpios = < &gpio0 0x3 0x1 >;
    			label = "Switch 1";
    			zephyr,code = < 0xb >;
    		};
    	};
    	reserved-memory {
    		#address-cells = < 0x1 >;
    		#size-cells = < 0x1 >;
    		ranges;
    		sram0_s: image_s@20000000 {
    			reg = < 0x20000000 0x16000 >;
    		};
    		sram0_modem: image_modem@20016000 {
    			reg = < 0x20016000 0xa000 >;
    		};
    		sram0_ns: image_ns@20020000 {
    			reg = < 0x20020000 0x20000 >;
    		};
    	};
    };
    

    This is for the application side.

    Are you using internal pull-resistors on your SDA/SCL lines?

    No I am not. I'm using external 20k resistors.

  • Hi Jared,

     

    Jared said:
    With that said, seems like an issue on the top layer which includes a SPI NOR flash and nRF9161. Looking into it more.

    Are you still suspecting that the issue is related elsewhere than the npm1300?

    For instance the flash not going into DPD mode?

    Jared said:
    Simply using a Fluke179 and measuring between SCL & SDA. It is resolved with reprogramming the devices via I2C. Maybe related to [27] BUCK: Programming BUCK voltage increases current consumption? Since it increases about 1mA.

    This aligns with errata that you mention:

    https://docs.nordicsemi.com/bundle/errata_nPM1300_Rev1/page/ERR/nPM1300/Rev1/latest/anomaly_300_27.html

    Have you tried the outlined workaround to see if the current lowers afterwards?

     

    Kind regards,

    Håkon

  • For instance the flash not going into DPD mode?

    I'm using the same active_sleep sample that I had for the nRF9160 Feather. Which was appropriately putting the system into sleep <10uA for the whole device. (including putting the SPI NOR into DPD) I probably should confirm it's still working since my upgrade to NCS 2.7 otherwise it may be a firmware problem!

    Have you tried the outlined workaround to see if the current lowers afterwards?

    Yep, If I read or write from the device the current goes back down to what I expect.

    I assembled the other side of the two boards I tested earlier. More playing around with it today.

  • Ahhh. Definitely a firmware issue. I get current ranging from 30 to 80 uA with the same code on the nRF9160 Feather on NCS 2.7 whereas with NCS 2.5 I get ~8 uA on the board I'm testing.

    Any ideas of what may have changed to affect the active sleep? I know the modem API has changed a little. Anything else I need to call explicitly?

    In NCS 2.5 this was the process:

    • Disable/disconnect all relevant GPIOs
    • Disable the accelerometer into deep sleep
    • Init the modem lib and run lte_lc_init() (removed lte_lc_init in 2.7 since it is no longer)
    • Disable UART console

    Seems like something else is running or not being put into sleep in NCS 2.7

  • Looks like the flash driver no longer puts the flash into DPD after init. I elected to put it in manually with this:

    int nor_storage_init(void)
    {
    
      static const struct device *spi_nor = DEVICE_DT_GET(DT_NODELABEL(w25q32jv));
    
      /* Disable console UART */
      int err = pm_device_action_run(spi_nor, PM_DEVICE_ACTION_SUSPEND);
      if (err < 0)
      {
        printk("Unable to suspend SPI NOR flash. (err: %d)\n", err);
        return err;
      }
    
      return 0;
    }

    Significant improvement. I think the current issue is resolved on the nRF9160 Feather side. Still having issues getting the current to the correct level on the nRF9161 version. Any other insights or thoughts would be appreciated!

  • Hi,

     

    Great to hear that the issue is solved for one board.

    Jared said:
    Still having issues getting the current to the correct level on the nRF9161 version.

    Have you checked if this could be related to the t-enter-dpd / t-exit-dpd timing parameters?

    By looking at the datasheet for your chosen flash:

    https://www.mouser.com/datasheet/2/949/w25q128jv_revf_03272018_plus-1489608.pdf?srsltid=AfmBOorY8er4aI26BVvIqI_Rqugvc9PiFU17dZEd6deYxTFG3throUTw

    The worst case scenario for exit/enter DPD is 30 us (page 65):

    /CS High to next Instruction after Reset | tRST(2) | 30 µs

     

    It seems that your DT specifies 3.5 us, if I read it correct.

     

    Kind regards,

    Håkon

Reply Children
Related