From ec83b7026ef8e395b2afd25cac3a1ad2c1063dad Mon Sep 17 00:00:00 2001 From: dario Date: Fri, 9 Feb 2024 16:11:48 +0100 Subject: [PATCH] Implemented SPI for Arduino and a few fixes --- include/sta/bus/spi/settings.hpp | 4 +- include/sta/debug/debug.hpp | 2 +- .../sta/debug/printing/printable_serial.hpp | 2 +- include/sta/debug/printing/printable_uart.hpp | 2 +- include/sta/devices/arduino/hal.hpp | 12 +++- src/bus/spi/settings.cpp | 6 +- src/debug/printing/printable_serial.cpp | 2 +- src/devices/arduino/bus/i2c.cpp | 10 +-- src/devices/arduino/bus/spi.cpp | 61 +++++++++++++++++-- src/devices/stm32/bus/spi.cpp | 2 +- 10 files changed, 80 insertions(+), 23 deletions(-) diff --git a/include/sta/bus/spi/settings.hpp b/include/sta/bus/spi/settings.hpp index f9ef566..7118938 100644 --- a/include/sta/bus/spi/settings.hpp +++ b/include/sta/bus/spi/settings.hpp @@ -31,8 +31,8 @@ namespace sta */ enum class SPIClkPolarity { - LOW, /**< Low idle clock */ - HIGH /**< High idle clock */ + SPI_LOW, /**< Low idle clock */ + SPI_HIGH /**< High idle clock */ }; /** diff --git a/include/sta/debug/debug.hpp b/include/sta/debug/debug.hpp index cf7cbd1..7a09609 100644 --- a/include/sta/debug/debug.hpp +++ b/include/sta/debug/debug.hpp @@ -8,7 +8,7 @@ namespace sta { - extern BasePrintable * Debug; + extern Printable * Debug; } // namespace sta diff --git a/include/sta/debug/printing/printable_serial.hpp b/include/sta/debug/printing/printable_serial.hpp index af7966a..bbe713d 100644 --- a/include/sta/debug/printing/printable_serial.hpp +++ b/include/sta/debug/printing/printable_serial.hpp @@ -6,7 +6,7 @@ namespace sta { - class PrintableSerial: public sta::BasePrintable + class PrintableSerial: public Printable { public: /** diff --git a/include/sta/debug/printing/printable_uart.hpp b/include/sta/debug/printing/printable_uart.hpp index 85eac01..d6ea375 100644 --- a/include/sta/debug/printing/printable_uart.hpp +++ b/include/sta/debug/printing/printable_uart.hpp @@ -25,7 +25,7 @@ namespace sta * * @ingroup sta_core */ - class PrintableUART : public BasePrintable + class PrintableUART : public Printable { public: /** diff --git a/include/sta/devices/arduino/hal.hpp b/include/sta/devices/arduino/hal.hpp index 99b4d31..34f3a01 100644 --- a/include/sta/devices/arduino/hal.hpp +++ b/include/sta/devices/arduino/hal.hpp @@ -1,9 +1,9 @@ #ifndef STA_CORE_ARDUINO_HAL_HPP #define STA_CORE_ARDUINO_HAL_HPP -#include -#include -#include +#include +#include +#include /** * @defgroup sta_core_arduino Arduino @@ -11,4 +11,10 @@ * @brief Modules implemented for the Arduino platform. */ +namespace hal +{ + using SPISettings = SPISettings; +} // namespace hal + + #endif // STA_CORE_ARDUINO_HAL_HPP \ No newline at end of file diff --git a/src/bus/spi/settings.cpp b/src/bus/spi/settings.cpp index 9fbf8e4..549900f 100644 --- a/src/bus/spi/settings.cpp +++ b/src/bus/spi/settings.cpp @@ -12,11 +12,11 @@ namespace sta { case SPIMode::MODE_0: case SPIMode::MODE_1: - return SPIClkPolarity::LOW; + return SPIClkPolarity::SPI_LOW; case SPIMode::MODE_2: case SPIMode::MODE_3: - return SPIClkPolarity::HIGH; + return SPIClkPolarity::SPI_HIGH; default: // Unreachable case @@ -46,7 +46,7 @@ namespace sta SPIMode getSPIMode(SPIClkPolarity polarity, SPIClkPhase phase) { - if (polarity == SPIClkPolarity::LOW) + if (polarity == SPIClkPolarity::SPI_LOW) { if (phase == SPIClkPhase::EDGE_1) { diff --git a/src/debug/printing/printable_serial.cpp b/src/debug/printing/printable_serial.cpp index db37e62..ae74fe7 100644 --- a/src/debug/printing/printable_serial.cpp +++ b/src/debug/printing/printable_serial.cpp @@ -7,7 +7,7 @@ namespace sta { PrintableSerial::PrintableSerial(unsigned long baud) - : BasePrintable() + : Printable{} { Serial.begin(baud); } diff --git a/src/devices/arduino/bus/i2c.cpp b/src/devices/arduino/bus/i2c.cpp index e9733c5..71e6815 100644 --- a/src/devices/arduino/bus/i2c.cpp +++ b/src/devices/arduino/bus/i2c.cpp @@ -15,28 +15,28 @@ namespace sta void ArduinoI2C::transfer(uint8_t value) { - Wire.beginTransmission(address_); + Wire.beginTransmission((uint8_t)address_); Wire.write(value); Wire.endTransmission(true); } void ArduinoI2C::transfer16(uint16_t value) { - Wire.beginTransmission(address_); + Wire.beginTransmission((uint8_t)address_); Wire.write(value); Wire.endTransmission(true); } void ArduinoI2C::transfer(const uint8_t * buffer, size_t size) { - Wire.beginTransmission(address_); + Wire.beginTransmission((uint8_t)address_); Wire.write(buffer, size); Wire.endTransmission(); } void ArduinoI2C::receive(uint8_t * buffer, size_t size) { - Wire.requestFrom(address_, size); + Wire.requestFrom((uint8_t)address_, (uint8_t)size); size_t index = 0; while (index < size) @@ -54,7 +54,7 @@ namespace sta uint8_t *buffer = new uint8_t[count]; memset(buffer, value, count); - Wire.beginTransmission(address_); + Wire.beginTransmission((uint8_t)address_); Wire.write(buffer, count); Wire.endTransmission(); diff --git a/src/devices/arduino/bus/spi.cpp b/src/devices/arduino/bus/spi.cpp index 5b8d7a1..23eb7e0 100644 --- a/src/devices/arduino/bus/spi.cpp +++ b/src/devices/arduino/bus/spi.cpp @@ -1,51 +1,102 @@ #include +#include + +#include namespace sta { ArduinoSPI::ArduinoSPI(const SPISettings & settings, Mutex * mutex /* = nullptr */) : SPI{ settings, mutex } { - + SPIClass::begin(); } void ArduinoSPI::transfer(uint8_t value) { - + SPIClass::transfer(value); } void ArduinoSPI::transfer16(uint16_t value) { - + SPIClass::transfer16(value); } void ArduinoSPI::transfer(const uint8_t * buffer, size_t size) { + // We have to create a temporary buffer here because the buffer argument in SPIClass::transfer is not const. + uint8_t temp_buffer[size]; + memcpy(temp_buffer, buffer, size); + SPIClass::transfer(temp_buffer, size); } void ArduinoSPI::transfer(const uint8_t * txBuffer, uint8_t * rxBuffer, size_t size) { + // Copy txBuffer content into rxBuffer, SPIClass::transfer will store received values in rxBuffer. + memcpy(rxBuffer, txBuffer, size); + SPIClass::transfer(rxBuffer, size); } void ArduinoSPI::receive(uint8_t * buffer, size_t size) { - + SPIClass::transfer(buffer, size); } void ArduinoSPI::fill(uint8_t value, size_t count) { + uint8_t temp_buffer[count]; + memset(temp_buffer, value, count); + SPIClass::transfer(temp_buffer, count); } void ArduinoSPI::acquire() { + const SPISettings & set = settings(); + uint8_t dataMode; + switch (set.mode) + { + case SPIMode::MODE_0: + dataMode = SPI_MODE0; + break; + case SPIMode::MODE_1: + dataMode = SPI_MODE1; + break; + case SPIMode::MODE_2: + dataMode = SPI_MODE2; + break; + case SPIMode::MODE_3: + dataMode = SPI_MODE3; + break; + default: + STA_UNREACHABLE(); + break; + } + + uint8_t bitOrder; + switch (set.bitOrder) + { + case SPIBitOrder::MSB: + bitOrder = MSBFIRST; + break; + case SPIBitOrder::LSB: + bitOrder = LSBFIRST; + break; + default: + STA_UNREACHABLE(); + break; + } + + hal::SPISettings halSettings(set.clkSpeed, bitOrder, dataMode); + + SPIClass::beginTransaction(halSettings); } void ArduinoSPI::release() { - + SPIClass::endTransaction(); } } // namespace sta diff --git a/src/devices/stm32/bus/spi.cpp b/src/devices/stm32/bus/spi.cpp index becfaac..49a4d42 100644 --- a/src/devices/stm32/bus/spi.cpp +++ b/src/devices/stm32/bus/spi.cpp @@ -20,7 +20,7 @@ namespace sta SPISettings settings; settings.mode = getSPIMode( - (handle->Init.CLKPolarity == SPI_POLARITY_LOW) ? SPIClkPolarity::LOW : SPIClkPolarity::HIGH, + (handle->Init.CLKPolarity == SPI_POLARITY_LOW) ? SPIClkPolarity::SPI_LOW : SPIClkPolarity::SPI_HIGH, (handle->Init.CLKPhase == SPI_PHASE_1EDGE) ? SPIClkPhase::EDGE_1 : SPIClkPhase::EDGE_2 ); settings.dataSize = (handle->Init.DataSize == SPI_DATASIZE_8BIT) ? SPIDataSize::SIZE_8 : SPIDataSize::SIZE_16;