From f29cd6eff227005a170d5aec4637a0df9bb51a04 Mon Sep 17 00:00:00 2001 From: dario Date: Sat, 13 Apr 2024 19:31:13 +0200 Subject: [PATCH] Updated SPI for ESP32 --- include/sta/devices/arduino/bus/i2c.hpp | 2 +- include/sta/devices/arduino/bus/spi.hpp | 62 ++++++++++++++++---- include/sta/devices/arduino/mcu/esp32_s3.hpp | 12 +++- src/devices/arduino/bus/i2c.cpp | 2 +- src/devices/arduino/bus/spi.cpp | 44 +++++++++++--- 5 files changed, 97 insertions(+), 25 deletions(-) diff --git a/include/sta/devices/arduino/bus/i2c.hpp b/include/sta/devices/arduino/bus/i2c.hpp index eda90c9..57ea4a6 100644 --- a/include/sta/devices/arduino/bus/i2c.hpp +++ b/include/sta/devices/arduino/bus/i2c.hpp @@ -14,7 +14,7 @@ namespace sta { public: #ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 - ArduinoI2C(Mutex * mutex = nullptr, uint8_t sda = STA_ESP32_SDA_DEFAULT_PIN, uint8_t scl = STA_ESP32_SCL_DEFAULT_PIN, uint32_t frequency = 0U); + ArduinoI2C(Mutex * mutex = nullptr, uint8_t sda = STA_ESP32_SDA_DEFAULT, uint8_t scl = STA_ESP32_SCL_DEFAULT, uint32_t frequency = 0U); #else ArduinoI2C(Mutex * mutex = nullptr); #endif // STA_PLATFORM_ARDUINO_DEVICE_ESP32 diff --git a/include/sta/devices/arduino/bus/spi.hpp b/include/sta/devices/arduino/bus/spi.hpp index 0444fd2..4ae53e4 100644 --- a/include/sta/devices/arduino/bus/spi.hpp +++ b/include/sta/devices/arduino/bus/spi.hpp @@ -12,21 +12,67 @@ namespace sta { -#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 +#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 enum SPIBus { BUS_HSPI = HSPI, BUS_FSPI = FSPI # ifndef STA_MCU_ESP32_S3 , BUS_VSPI = VSPI -# endif // !STA_MCU_ESP32_S3 +# endif // STA_MCU_ESP32_S3 }; #endif // STA_PLATFORM_ARDUINO_DEVICE_ESP32 class ArduinoSPI : public SPI { public: -#ifndef STA_PLATFORM_ARDUINO_DEVICE_ESP32 +#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 + /** + * @brief + * + * @param settings + * @param mutex + * @param mosi + * @param miso + * @param clk + * @return ArduinoSPI + */ + static ArduinoSPI getHSPI( + const SPISettings & settings, + Mutex * mutex = sta::Mutex::ALWAYS_FREE, + uint8_t mosi = STA_ESP32_HSPI_MOSI_DEFAULT, + uint8_t miso = STA_ESP32_HSPI_MISO_DEFAULT, + uint8_t clk = STA_ESP32_HSPI_CLK_DEFAULT); + + /** + * @brief + * + * @param settings + * @param mutex + * @param mosi + * @param miso + * @param clk + * @return ArduinoSPI + */ + static ArduinoSPI getFSPI( + const SPISettings & settings, + Mutex * mutex = sta::Mutex::ALWAYS_FREE, + uint8_t mosi = STA_ESP32_HSPI_MOSI_DEFAULT, + uint8_t miso = STA_ESP32_HSPI_MISO_DEFAULT, + uint8_t clk = STA_ESP32_HSPI_CLK_DEFAULT); + private: + /** + * @brief Construct an SPI bus interface using the Arduino framework. This constructor is used for ESP32. + * + * @param settings The settings for the spi bus. s + * @param mosi The master-out-slave-in pin. + * @param miso The master-in-slave-out pin. + * @param clk The clock used for synchronizing the bus communication. + * @param bus The bus to use. One of HSPI or FSPI. + * @param mutex A mutex for managing bus access in multithreaded applications. Default is a dummy mutex that is always free. + */ + ArduinoSPI(const SPISettings & settings, SPIBus bus, uint8_t mosi, uint8_t miso, uint8_t clk, Mutex * mutex = sta::Mutex::ALWAYS_FREE); +#else /** * @brief Construct an SPI bus interface using the Arduino framework. * @@ -34,16 +80,8 @@ namespace sta * @param mutex A mutex for managing bus access in multithreaded applications. Default is a dummy mutex that is always free. */ ArduinoSPI(const SPISettings & settings, Mutex * mutex = sta::Mutex::ALWAYS_FREE); -#else - /** - * @brief Construct an SPI bus interface using the Arduino framework. - * - * @param bus The bus to use. - * @param settings The settings for the spi bus. - * @param mutex A mutex for managing bus access in multithreaded applications. Default is a dummy mutex that is always free. - */ - ArduinoSPI(SPIBus bus, const SPISettings & settings, Mutex * mutex = sta::Mutex::ALWAYS_FREE); #endif // !STA_PLATFORM_ARDUINO_DEVICE_ESP32 + public: void transfer(uint8_t value) override; void transfer16(uint16_t value) override; void transfer(const uint8_t * buffer, size_t size) override; diff --git a/include/sta/devices/arduino/mcu/esp32_s3.hpp b/include/sta/devices/arduino/mcu/esp32_s3.hpp index 94e4a5a..fc2bdce 100644 --- a/include/sta/devices/arduino/mcu/esp32_s3.hpp +++ b/include/sta/devices/arduino/mcu/esp32_s3.hpp @@ -9,7 +9,15 @@ #define STA_MCU_ESP32_S3 -#define STA_ESP32_SCL_DEFAULT_PIN 22 -#define STA_ESP32_SDA_DEFAULT_PIN 21 +#define STA_ESP32_SCL_DEFAULT 22 +#define STA_ESP32_SDA_DEFAULT 21 + +#define STA_ESP32_FSPI_MOSI_DEFAULT 23 +#define STA_ESP32_FSPI_MISO_DEFAULT 19 +#define STA_ESP32_FSPI_CLK_DEFAULT 18 + +#define STA_ESP32_HSPI_MOSI_DEFAULT 13 +#define STA_ESP32_HSPI_MISO_DEFAULT 12 +#define STA_ESP32_HSPI_CLK_DEFAULT 14 #endif // STA_CORE_ARDUINO_MCU_ESP32_S3_HPP \ No newline at end of file diff --git a/src/devices/arduino/bus/i2c.cpp b/src/devices/arduino/bus/i2c.cpp index afb866e..5f42053 100644 --- a/src/devices/arduino/bus/i2c.cpp +++ b/src/devices/arduino/bus/i2c.cpp @@ -8,7 +8,7 @@ namespace sta { #ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 - ArduinoI2C::ArduinoI2C(Mutex * mutex /* = nullptr */, uint8_t sda /* = STA_ESP32_SDA_DEFAULT_PIN */, uint8_t scl /*= STA_ESP32_SCL_DEFAULT_PIN */, uint32_t frequency /* = 0U */) + ArduinoI2C::ArduinoI2C(Mutex * mutex /* = nullptr */, uint8_t sda /* = STA_ESP32_SDA_DEFAULT */, uint8_t scl /*= STA_ESP32_SCL_DEFAULT */, uint32_t frequency /* = 0U */) : I2C{mutex} { Wire.begin(sda, scl, frequency); diff --git a/src/devices/arduino/bus/spi.cpp b/src/devices/arduino/bus/spi.cpp index b0cca0f..711f7be 100644 --- a/src/devices/arduino/bus/spi.cpp +++ b/src/devices/arduino/bus/spi.cpp @@ -1,23 +1,49 @@ #include #include +#include namespace sta { -#ifndef STA_PLATFORM_ARDUINO_DEVICE_ESP32 +#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 + ArduinoSPI ArduinoSPI::getHSPI( + const SPISettings & settings, + Mutex * mutex /* = sta::Mutex::ALWAYS_FREE */, + uint8_t mosi /* = STA_ESP32_HSPI_MOSI_DEFAULT */, + uint8_t miso /* = STA_ESP32_HSPI_MISO_DEFAULT */, + uint8_t clk /* = STA_ESP32_HSPI_CLK_DEFAULT */) + { + ArduinoSPI spi(settings, SPIBus::BUS_HSPI, mosi, miso, clk, mutex); + return spi; + } + + ArduinoSPI ArduinoSPI::getFSPI( + const SPISettings & settings, + Mutex * mutex /*= sta::Mutex::ALWAYS_FREE */, + uint8_t mosi /* = STA_ESP32_FSPI_MOSI_DEFAULT */, + uint8_t miso /* = STA_ESP32_FSPI_MISO_DEFAULT */, + uint8_t clk /* = STA_ESP32_FSPI_CLK_DEFAULT */) + { + ArduinoSPI spi(settings, SPIBus::BUS_FSPI, mosi, miso, clk, mutex); + return spi; + } + + ArduinoSPI::ArduinoSPI(const SPISettings & settings, SPIBus bus, uint8_t mosi, uint8_t miso, uint8_t clk, Mutex * mutex /* = sta::Mutex::ALWAYS_FREE */) + : SPI{settings, mutex}, + spi_{bus} + { + STA_ASSERT(mosi >= 0 && miso >= 0 && clk >= 0); + STA_ASSERT(mutex != nullptr); + + spi_.begin(clk, miso, mosi); + } +#else ArduinoSPI::ArduinoSPI(const SPISettings & settings, Mutex * mutex /* = sta::Mutex::ALWAYS_FREE */) : SPI{ settings, mutex }, spi_{} { spi_.begin(); - } -#else - ArduinoSPI::ArduinoSPI(SPIBus bus, const SPISettings & settings, Mutex * mutex /* = sta::Mutex::ALWAYS_FREE */) - : SPI{ settings, mutex }, - spi_{ bus } - { - spi_.begin(); - } + } #endif // !STA_PLATFORM_ARDUINO_DEVICE_ESP32 void ArduinoSPI::transfer(uint8_t value)