aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2023-05-07 18:24:34 +0200
committerJF <JF002@users.noreply.github.com>2023-06-04 17:22:27 +0200
commit4c0f897953aa8d478f3c941e75d3b2eb5611531d (patch)
tree28c926cf8e0319ce5b5369382af6dbf935e17918 /src/drivers
parent2fa3aaa1617849dd29fe55c844d5250df0cba955 (diff)
Power optimization - Improve SPI sleep mode
Ensure that all pins are set to their default configuration during sleep mode. Disable the workaround for FTPAN58 (SPI freezes when transfering a single byte) at the end of the transfer. This disables the resources needed for the workaround. Those changes reduce the power usage by 430-490µA.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Spi.cpp3
-rw-r--r--src/drivers/SpiMaster.cpp3
-rw-r--r--src/drivers/SpiNorFlash.cpp3
-rw-r--r--src/drivers/St7789.cpp3
4 files changed, 11 insertions, 1 deletions
diff --git a/src/drivers/Spi.cpp b/src/drivers/Spi.cpp
index e477622b..c85b90c1 100644
--- a/src/drivers/Spi.cpp
+++ b/src/drivers/Spi.cpp
@@ -27,7 +27,8 @@ bool Spi::WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* d
}
bool Spi::Init() {
- nrf_gpio_pin_set(pinCsn); /* disable Set slave select (inactive high) */
+ nrf_gpio_cfg_output(pinCsn);
+ nrf_gpio_pin_set(pinCsn);
return true;
}
diff --git a/src/drivers/SpiMaster.cpp b/src/drivers/SpiMaster.cpp
index 234884ab..1a2fab9c 100644
--- a/src/drivers/SpiMaster.cpp
+++ b/src/drivers/SpiMaster.cpp
@@ -204,6 +204,9 @@ bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
;
nrf_gpio_pin_set(this->pinCsn);
currentBufferAddr = 0;
+
+ DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
+
xSemaphoreGive(mutex);
}
diff --git a/src/drivers/SpiNorFlash.cpp b/src/drivers/SpiNorFlash.cpp
index 28f82fe6..525b812c 100644
--- a/src/drivers/SpiNorFlash.cpp
+++ b/src/drivers/SpiNorFlash.cpp
@@ -10,6 +10,7 @@ SpiNorFlash::SpiNorFlash(Spi& spi) : spi {spi} {
}
void SpiNorFlash::Init() {
+ spi.Init();
device_id = ReadIdentificaion();
NRF_LOG_INFO("[SpiNorFlash] Manufacturer : %d, Memory type : %d, memory density : %d",
device_id.manufacturer,
@@ -23,10 +24,12 @@ void SpiNorFlash::Uninit() {
void SpiNorFlash::Sleep() {
auto cmd = static_cast<uint8_t>(Commands::DeepPowerDown);
spi.Write(&cmd, sizeof(uint8_t));
+ spi.Sleep();
NRF_LOG_INFO("[SpiNorFlash] Sleep")
}
void SpiNorFlash::Wakeup() {
+ spi.Wakeup();
// send Commands::ReleaseFromDeepPowerDown then 3 dummy bytes before reading Device ID
static constexpr uint8_t cmdSize = 4;
uint8_t cmd[cmdSize] = {static_cast<uint8_t>(Commands::ReleaseFromDeepPowerDown), 0x01, 0x02, 0x03};
diff --git a/src/drivers/St7789.cpp b/src/drivers/St7789.cpp
index cfd5bd2c..ed98c06d 100644
--- a/src/drivers/St7789.cpp
+++ b/src/drivers/St7789.cpp
@@ -187,10 +187,13 @@ void St7789::HardwareReset() {
void St7789::Sleep() {
SleepIn();
nrf_gpio_cfg_default(pinDataCommand);
+ nrf_gpio_cfg_default(26);
+ spi.Sleep();
NRF_LOG_INFO("[LCD] Sleep");
}
void St7789::Wakeup() {
+ spi.Wakeup();
nrf_gpio_cfg_output(pinDataCommand);
SleepOut();
VerticalScrollStartAddress(verticalScrollingStartAddress);