summaryrefslogtreecommitdiff
path: root/src/drivers/SpiMaster.cpp
diff options
context:
space:
mode:
authorTim Keller <geekboy1011@gmail.com>2021-10-17 21:33:01 +0000
committerTim Keller <geekboy1011@gmail.com>2021-12-10 01:18:57 +0000
commit2690c274af72cfbac88a8c83fce311665a917a93 (patch)
tree17736e67dd4bf63b2df5aeeb1ce2ee0151285249 /src/drivers/SpiMaster.cpp
parent1dd71744802b4ae80c8952f73bbf0051fbe12cf3 (diff)
Workaround for SPI bus being asleep.
This needs to get cherrypicked to another PR as SPI Sleep needs to use a semaphore or something
Diffstat (limited to 'src/drivers/SpiMaster.cpp')
-rw-r--r--src/drivers/SpiMaster.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/drivers/SpiMaster.cpp b/src/drivers/SpiMaster.cpp
index 747dbc84..4492e899 100644
--- a/src/drivers/SpiMaster.cpp
+++ b/src/drivers/SpiMaster.cpp
@@ -10,7 +10,7 @@ SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters
}
bool SpiMaster::Init() {
- if(mutex == nullptr) {
+ if (mutex == nullptr) {
mutex = xSemaphoreCreateBinary();
ASSERT(mutex != nullptr);
}
@@ -179,6 +179,10 @@ void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress,
bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
if (data == nullptr)
return false;
+
+ if (!active) {
+ Wakeup();
+ }
auto ok = xSemaphoreTake(mutex, portMAX_DELAY);
ASSERT(ok == true);
taskToNotify = xTaskGetCurrentTaskHandle();
@@ -215,7 +219,9 @@ bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) {
xSemaphoreTake(mutex, portMAX_DELAY);
-
+ if (!active) {
+ Wakeup();
+ }
taskToNotify = nullptr;
this->pinCsn = pinCsn;
@@ -253,12 +259,16 @@ void SpiMaster::Sleep() {
nrf_gpio_cfg_default(params.pinSCK);
nrf_gpio_cfg_default(params.pinMOSI);
nrf_gpio_cfg_default(params.pinMISO);
-
+ active = false;
NRF_LOG_INFO("[SPIMASTER] sleep")
}
void SpiMaster::Wakeup() {
+ if (active) {
+ return;
+ }
Init();
+ active = true;
NRF_LOG_INFO("[SPIMASTER] Wakeup");
}