summaryrefslogtreecommitdiff
path: root/src/drivers/SpiMaster.cpp
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-06-07 14:17:45 +0200
committerGitea <gitea@fake.local>2020-06-07 14:17:45 +0200
commita0e73f5c1a1e652aa6270b7e42a73aee3d12ded6 (patch)
tree6205dfb543bb22245d39a2f6e44d2c26cb381c10 /src/drivers/SpiMaster.cpp
parent8a94750e30399bfb204cbec59a769d9d1b6b5baa (diff)
parentdbdb26ae1fa45cec88f1b9ea0353b3d0a3c39f56 (diff)
Merge branch 'develop' of JF/PineTime into master
Diffstat (limited to 'src/drivers/SpiMaster.cpp')
-rw-r--r--src/drivers/SpiMaster.cpp96
1 files changed, 88 insertions, 8 deletions
diff --git a/src/drivers/SpiMaster.cpp b/src/drivers/SpiMaster.cpp
index 4b3dd677..8087d386 100644
--- a/src/drivers/SpiMaster.cpp
+++ b/src/drivers/SpiMaster.cpp
@@ -9,8 +9,8 @@ using namespace Pinetime::Drivers;
SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters &params) :
spi{spi}, params{params} {
- mutex = xSemaphoreCreateBinary();
- ASSERT(mutex != NULL);
+ mutex = xSemaphoreCreateBinary();
+ ASSERT(mutex != NULL);
}
bool SpiMaster::Init() {
@@ -20,8 +20,8 @@ bool SpiMaster::Init() {
nrf_gpio_pin_clear(params.pinMOSI);
nrf_gpio_cfg_output(params.pinMOSI);
nrf_gpio_cfg_input(params.pinMISO, NRF_GPIO_PIN_NOPULL);
- nrf_gpio_cfg_output(params.pinCSN);
- pinCsn = params.pinCSN;
+// nrf_gpio_cfg_output(params.pinCSN);
+// pinCsn = params.pinCSN;
switch(spi) {
case SpiModule::SPI0: spiBaseAddress = NRF_SPIM0; break;
@@ -33,7 +33,6 @@ bool SpiMaster::Init() {
spiBaseAddress->PSELSCK = params.pinSCK;
spiBaseAddress->PSELMOSI = params.pinMOSI;
spiBaseAddress->PSELMISO = params.pinMISO;
- nrf_gpio_pin_set(pinCsn); /* disable Set slave select (inactive high) */
uint32_t frequency;
switch(params.Frequency) {
@@ -147,19 +146,33 @@ void SpiMaster::PrepareTx(const volatile uint32_t bufferAddress, const volatile
spiBaseAddress->EVENTS_END = 0;
}
-bool SpiMaster::Write(const uint8_t *data, size_t size) {
+void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress, const volatile size_t cmdSize, const volatile uint32_t bufferAddress, const volatile size_t size) {
+ spiBaseAddress->TXD.PTR = 0;
+ spiBaseAddress->TXD.MAXCNT = 0;
+ spiBaseAddress->TXD.LIST = 0;
+ spiBaseAddress->RXD.PTR = bufferAddress;
+ spiBaseAddress->RXD.MAXCNT = size;
+ spiBaseAddress->RXD.LIST = 0;
+ spiBaseAddress->EVENTS_END = 0;
+}
+
+
+bool SpiMaster::Write(uint8_t pinCsn, const uint8_t *data, size_t size) {
if(data == nullptr) return false;
auto ok = xSemaphoreTake(mutex, portMAX_DELAY);
ASSERT(ok == true);
taskToNotify = xTaskGetCurrentTaskHandle();
+
+ this->pinCsn = pinCsn;
+
if(size == 1) {
SetupWorkaroundForFtpan58(spiBaseAddress, 0,0);
} else {
DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
}
- nrf_gpio_pin_clear(pinCsn);
+ nrf_gpio_pin_clear(this->pinCsn);
currentBufferAddr = (uint32_t)data;
currentBufferSize = size;
@@ -172,12 +185,47 @@ bool SpiMaster::Write(const uint8_t *data, size_t size) {
if(size == 1) {
while (spiBaseAddress->EVENTS_END == 0);
+ nrf_gpio_pin_set(this->pinCsn);
+ currentBufferAddr = 0;
xSemaphoreGive(mutex);
}
return true;
}
+bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t *data, size_t dataSize) {
+ xSemaphoreTake(mutex, portMAX_DELAY);
+
+ taskToNotify = nullptr;
+
+ this->pinCsn = pinCsn;
+ DisableWorkaroundForFtpan58(spiBaseAddress, 0,0);
+ spiBaseAddress->INTENCLR = (1<<6);
+ spiBaseAddress->INTENCLR = (1<<1);
+ spiBaseAddress->INTENCLR = (1<<19);
+
+ nrf_gpio_pin_clear(this->pinCsn);
+
+
+ currentBufferAddr = 0;
+ currentBufferSize = 0;
+
+ PrepareTx((uint32_t)cmd, cmdSize);
+ spiBaseAddress->TASKS_START = 1;
+ while (spiBaseAddress->EVENTS_END == 0);
+
+ PrepareRx((uint32_t)cmd, cmdSize, (uint32_t)data, dataSize);
+ spiBaseAddress->TASKS_START = 1;
+
+ while (spiBaseAddress->EVENTS_END == 0);
+ nrf_gpio_pin_set(this->pinCsn);
+
+ xSemaphoreGive(mutex);
+
+ return true;
+}
+
+
void SpiMaster::Sleep() {
while(spiBaseAddress->ENABLE != 0) {
spiBaseAddress->ENABLE = (SPIM_ENABLE_ENABLE_Disabled << SPIM_ENABLE_ENABLE_Pos);
@@ -185,11 +233,43 @@ void SpiMaster::Sleep() {
nrf_gpio_cfg_default(params.pinSCK);
nrf_gpio_cfg_default(params.pinMOSI);
nrf_gpio_cfg_default(params.pinMISO);
- nrf_gpio_cfg_default(params.pinCSN);
}
void SpiMaster::Wakeup() {
Init();
}
+bool SpiMaster::WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t *cmd, size_t cmdSize, const uint8_t *data, size_t dataSize) {
+ xSemaphoreTake(mutex, portMAX_DELAY);
+
+ taskToNotify = nullptr;
+
+ this->pinCsn = pinCsn;
+ DisableWorkaroundForFtpan58(spiBaseAddress, 0,0);
+ spiBaseAddress->INTENCLR = (1<<6);
+ spiBaseAddress->INTENCLR = (1<<1);
+ spiBaseAddress->INTENCLR = (1<<19);
+
+ nrf_gpio_pin_clear(this->pinCsn);
+
+
+ currentBufferAddr = 0;
+ currentBufferSize = 0;
+
+ PrepareTx((uint32_t)cmd, cmdSize);
+ spiBaseAddress->TASKS_START = 1;
+ while (spiBaseAddress->EVENTS_END == 0);
+
+ PrepareTx((uint32_t)data, dataSize);
+ spiBaseAddress->TASKS_START = 1;
+
+ while (spiBaseAddress->EVENTS_END == 0);
+ nrf_gpio_pin_set(this->pinCsn);
+
+ xSemaphoreGive(mutex);
+
+ return true;
+}
+
+