From 07c766a2919a592afe2898966c2861c715a3cd96 Mon Sep 17 00:00:00 2001 From: kurte Date: Wed, 18 Dec 2024 07:42:38 -0800 Subject: [PATCH] SPI - Fix Transfer16 plus allow subclass to gain access to member variables resolves #13 And: provides for c) option in #14 In particular, added another config option (config16) that is initialized at beginTransaction with same settings as config except word size set to 16 instead of 8. Also: updated begin() to call beginTransaction with default SPISettings, and the endTransaction, such that sketches that don't call beginTransaction output at the default settings. Changed the header file private: to protected --- libraries/SPI/SPI.cpp | 11 +++++++++-- libraries/SPI/SPI.h | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index f55c17c2..897d57f2 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -46,7 +46,7 @@ uint16_t arduino::ZephyrSPI::transfer16(uint16_t data) { .count = 1, }; - ret = spi_transceive(spi_dev, &config, &tx_buf_set, &rx_buf_set); + ret = spi_transceive(spi_dev, &config16, &tx_buf_set, &rx_buf_set); if (ret < 0) { return 0; } @@ -85,7 +85,10 @@ void arduino::ZephyrSPI::notUsingInterrupt(int interruptNumber) { void arduino::ZephyrSPI::beginTransaction(SPISettings settings) { memset(&config, 0, sizeof(config)); + memset(&config16, 0, sizeof(config16)); config.frequency = settings.getClockFreq() > SPI_MIN_CLOCK_FEQUENCY ? settings.getClockFreq() : SPI_MIN_CLOCK_FEQUENCY; + config16.frequency = config.frequency; + auto mode = SPI_MODE_CPOL | SPI_MODE_CPHA; switch (settings.getDataMode()) { case SPI_MODE0: @@ -98,6 +101,7 @@ void arduino::ZephyrSPI::beginTransaction(SPISettings settings) { mode = SPI_MODE_CPOL | SPI_MODE_CPHA; break; } config.operation = SPI_WORD_SET(8) | (settings.getBitOrder() == MSBFIRST ? SPI_TRANSFER_MSB : SPI_TRANSFER_LSB) | mode; + config16.operation = SPI_WORD_SET(16) | (settings.getBitOrder() == MSBFIRST ? SPI_TRANSFER_MSB : SPI_TRANSFER_LSB) | mode; } void arduino::ZephyrSPI::endTransaction(void) { @@ -109,7 +113,10 @@ void arduino::ZephyrSPI::attachInterrupt() {} void arduino::ZephyrSPI::detachInterrupt() {} -void arduino::ZephyrSPI::begin() {} +void arduino::ZephyrSPI::begin() { + beginTransaction(SPISettings()); + endTransaction(); +} void arduino::ZephyrSPI::end() {} diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 7d53351f..ec3b6869 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -50,9 +50,10 @@ class ZephyrSPI : public HardwareSPI { virtual void begin(); virtual void end(); -private: +protected: const struct device *spi_dev; struct spi_config config; + struct spi_config config16; int interrupt[INTERRUPT_COUNT]; size_t interrupt_pos = 0; };