From 3c8fce14f642d1448973d49e1dc83530d20b32c3 Mon Sep 17 00:00:00 2001 From: Henrik Stickann <4376396-Mithradir@users.noreply.gitlab.com> Date: Fri, 15 Apr 2022 14:55:49 +0200 Subject: [PATCH] Add SPI settings --- include/sta/spi_settings.hpp | 71 +++++++++++++++++++++++++++++++++++ src/spi_settings.cpp | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 include/sta/spi_settings.hpp create mode 100644 src/spi_settings.cpp diff --git a/include/sta/spi_settings.hpp b/include/sta/spi_settings.hpp new file mode 100644 index 0000000..ec89f56 --- /dev/null +++ b/include/sta/spi_settings.hpp @@ -0,0 +1,71 @@ +#ifndef STA_SPI_SETTINGS_HPP +#define STA_SPI_SETTINGS_HPP + +#include + + +namespace sta +{ + enum class SpiClkPolarity + { + LOW, + HIGH + }; + + enum class SpiClkPhase + { + EDGE_1, + EDGE_2 + }; + + enum class SpiMode + { + MODE_0, + MODE_1, + MODE_2, + MODE_3 + }; + + enum class SpiDataSize + { + BIT_8, + BIT_16 + }; + + enum class SpiBitOrder + { + MSB, + LSB + }; + + enum class SpiBaudRatePrescaler + { + BRP_2, + BRP_4, + BRP_8, + BRP_16, + BRP_32, + BRP_64, + BRP_128, + BRP_256 + }; + + + struct SpiSettings + { + SpiMode mode; + SpiDataSize dataSize; + SpiBitOrder bitOrder; + + uint32_t clkSpeed; + SpiBaudRatePrescaler baudRatePrescaler; /**< Subject to change */ + }; + + + SpiClkPolarity getSpiClkPolarity(SpiMode mode); + SpiClkPhase getSpiClkPhase(SpiMode mode); + SpiMode getSpiMode(SpiClkPolarity polarity, SpiClkPhase phase); +} // namespace sta + + +#endif // STA_SPI_SETTINGS_HPP diff --git a/src/spi_settings.cpp b/src/spi_settings.cpp new file mode 100644 index 0000000..73478e7 --- /dev/null +++ b/src/spi_settings.cpp @@ -0,0 +1,72 @@ +#include + +#include +#include + + +namespace sta +{ + SpiClkPolarity getSpiClkPolarity(SpiMode mode) + { + switch (mode) + { + case SpiMode::MODE_0: + case SpiMode::MODE_1: + return SpiClkPolarity::LOW; + + case SpiMode::MODE_2: + case SpiMode::MODE_3: + return SpiClkPolarity::HIGH; + + default: + // Unreachable case + STA_ASSERT_MSG(false, "Case for SpiMode enum not handled"); + STA_UNREACHABLE(); + } + } + + SpiClkPhase getSpiClkPhase(SpiMode mode) + { + switch (mode) + { + case SpiMode::MODE_0: + case SpiMode::MODE_2: + return SpiClkPhase::EDGE_1; + + case SpiMode::MODE_1: + case SpiMode::MODE_3: + return SpiClkPhase::EDGE_2; + + default: + // Unreachable case + STA_ASSERT_MSG(false, "Case for SpiMode enum not handled"); + STA_UNREACHABLE(); + } + } + + SpiMode getSpiMode(SpiClkPolarity polarity, SpiClkPhase phase) + { + if (polarity == SpiClkPolarity::LOW) + { + if (phase == SpiClkPhase::EDGE_1) + { + return SpiMode::MODE_0; + } + else + { + return SpiMode::MODE_1; + } + } + else + { + if (phase == SpiClkPhase::EDGE_1) + { + return SpiMode::MODE_2; + } + else + { + return SpiMode::MODE_3; + } + } + } +} // namespace sta