/** * @brief Implementations for `SpiInterface` and `SpiDevice` using HAL. * * Define **STA_HAL_SPI_ENABLE** in `` to enable module. * * Requires **STA_HAL_GPIO_ENABLE**. */ #ifndef STA_HAL_SPI_HPP #define STA_HAL_SPI_HPP #include #ifdef STA_HAL_SPI_ENABLE #ifndef STA_HAL_GPIO_ENABLE #error "HAL GPIO required" #endif // !STA_HAL_GPIO_ENABLE #include #include #include namespace sta { /** * @brief Implementation of `SpiInterface` interface using HAL. */ class HalSpiInterface : public SpiInterface { public: /** * @param handle SPI handle * @param mutex Mutex object for managing access. Pass nullptr for no access control */ HalSpiInterface(SPI_HandleTypeDef * handle, Mutex * mutex = nullptr); void transfer(uint8_t value) override; void transfer(const uint8_t * buffer, size_t size) override; void transfer(const uint8_t * txBuffer, uint8_t * rxBuffer, size_t size) override; void transfer16(uint16_t value) override; void fill(uint8_t value, size_t count) override; void fill32(uint32_t value, size_t count) override; void receive(uint8_t * buffer, size_t size) override; private: SPI_HandleTypeDef * handle_; /**< SPI handle */ }; /** * @brief Implementation of `SpiDevice` interface using HAL. */ class HalSpiDevice : public SpiDevice { public: /** * @param intf SPI interface * @param csPin Device CS pin */ HalSpiDevice(SpiInterface * intf, HalGpioPin csPin); void select() override; void deselect() override; private: HalGpioPin csPin_; /**< Device CS pin */ }; } // namespace sta #endif // STA_HAL_SPI_ENABLE #endif // STA_HAL_SPI_HPP