Hello,
On a project with a custom board with an nRF9160 and an external flash W25Q64, I noticed a strange power consumption behaviour.
When my system goes idle, the current is very slowly increasing then decreasing. We are talking a ramp up/down of ~100µA in ~20 seconds.
This is not some kind of noise, since I can replicate the issue every time. The fact that it's very slow makes me think of a current leak in a unused/undefined pin.
First, I noticed that the definition of wp-gpios and hold-gpios in the devicetree had no effect (at least, in my case). I therefore removed that, and setup those as GPIO high. This reduced the issue, but it's still here.
After that, I noticed that when the system goes idle, the current remain stable if I tied the SPI pins to ground, using a cable. How can I do that in software ?
Is there a way to change the pin definition at runtime, to toggle between SPI (SCK, MOSI, MISO) and GPIO low ? If so, how can I process.
So far, my dts is :
spi3_default: spi3_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 13)>,
<NRF_PSEL(SPIM_MOSI, 0, 11)>,
<NRF_PSEL(SPIM_MISO, 0, 12)>;
};
};
spi3_sleep: spi3_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 13)>,
<NRF_PSEL(SPIM_MOSI, 0, 11)>,
<NRF_PSEL(SPIM_MISO, 0, 12)>;
low-power-enable;
};
&spi3 {
compatible = "nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi3_default>;
pinctrl-1 = <&spi3_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
w25q64: w25q64jv@0
{
compatible = "jedec,spi-nor" ;
reg = <0>;
spi-max-frequency = <1000000>; // Max supported by NVM is 133MHz. But there is no reason to go too fast.
size = <0x4000000> ; // 64Mbits
jedec-id = [EF 40 17]; // JEDEC ID is [MF 7-0]=0xEF [ID 15-8]= [ID 7-0 = Size]=
has-dpd; // Enable the Deep Power Down management
t-enter-dpd = <3000>;
t-exit-dpd = <3000>;
};
};
I go idle like this:
static const struct device *flash_dev = DEVICE_DT_GET(DT_NODELABEL(w25q64));
const struct device *spi3_dev= DEVICE_DT_GET(DT_NODELABEL(spi3));
// Sends the 0xB9 command, to enter power down
pm_device_action_run(flash_dev, PM_DEVICE_ACTION_SUSPEND) ;
// Disable SPI peripheral
// If not done, it seems that there is a current leakage through MISO
pm_device_action_run(spi3_dev, PM_DEVICE_ACTION_SUSPEND) ;
Thanks.