M5UnitUnified 0.5.8 git rev:47d29eb
Loading...
Searching...
No Matches
adapter_spi.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
11#ifndef M5_UNIT_COMPONENT_ADAPTER_SPI_HPP
12#define M5_UNIT_COMPONENT_ADAPTER_SPI_HPP
13
14#include "adapter_base.hpp"
15#if defined(ARDUINO)
16#include <SPI.h>
17#else
18class SPIClass;
19#endif
20#if defined(ESP_PLATFORM)
21#include <driver/spi_master.h>
22#endif
23
24// SPI is an ESP platform feature here (SPIImpl holds a gpio_num_t chip select)
25#if defined(ESP_PLATFORM)
26namespace m5 {
27namespace unit {
28
33class AdapterSPI : public Adapter {
34public:
35 class SPIImpl : public Adapter::Impl {
36 public:
37 explicit SPIImpl(const gpio_num_t cs = GPIO_NUM_NC) : _cs{cs}
38 {
39 }
40 virtual ~SPIImpl() = default;
41
42 inline virtual SPIClass* getSPI()
43 {
44 return nullptr;
45 }
46 inline gpio_num_t cs_pin() const
47 {
48 return _cs;
49 }
50
51 virtual void beginTransaction()
52 {
53 }
54 virtual void endTransaction()
55 {
56 }
57
58 protected:
59 gpio_num_t _cs{GPIO_NUM_NC};
60 };
61
62#if defined(ARDUINO)
63 class SPIClassImpl : public SPIImpl {
64 public:
65 SPIClassImpl(SPIClass& serial, const SPISettings& settings, const gpio_num_t cs);
66 inline virtual SPIClass* getSPI() override
67 {
68 return _spi;
69 }
70 virtual void beginTransaction() override;
71 virtual void endTransaction() override;
72 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len) override;
73 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
74 const uint32_t stop) override;
75 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
76 const uint32_t stop) override;
77 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
78 const uint32_t stop) override;
79
80 protected:
81 SPIClass* _spi{};
82 SPISettings _settings{};
83 static uint32_t transaction_count;
84 };
85#endif
86
87#if defined(ESP_PLATFORM)
88 class ESPIDFImpl : public SPIImpl {
89 public:
90 ESPIDFImpl(spi_device_handle_t handle, const gpio_num_t cs);
91 virtual void beginTransaction() override;
92 virtual void endTransaction() override;
93 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len) override;
94 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
95 const uint32_t stop) override;
96 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
97 const uint32_t stop) override;
98 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
99 const uint32_t stop) override;
100
101 protected:
102 m5::hal::error::error_t do_transmit(const uint8_t* tx, uint8_t* rx, const size_t len);
103
104 private:
105 spi_device_handle_t _handle{};
106 gpio_num_t _cs{GPIO_NUM_NC};
107 bool _in_transaction{false};
108 };
109#endif
110
111#if defined(ARDUINO)
112 AdapterSPI(SPIClass& spi, const SPISettings& settings, const gpio_num_t cs);
113#endif
114#if defined(ESP_PLATFORM)
115 AdapterSPI(spi_device_handle_t handle, const gpio_num_t cs);
116#endif
117
118 inline SPIImpl* impl()
119 {
120 return static_cast<SPIImpl*>(_impl.get());
121 }
122 inline const SPIImpl* impl() const
123 {
124 return static_cast<SPIImpl*>(_impl.get());
125 }
126
127 inline gpio_num_t cs_pin() const
128 {
129 return impl()->cs_pin();
130 }
131
132 inline virtual void beginTransaction() override
133 {
134 impl()->beginTransaction();
135 }
136 inline virtual void endTransaction() override
137 {
138 impl()->endTransaction();
139 }
140
141protected:
142 AdapterSPI() : Adapter(Adapter::Type::SPI, new SPIImpl())
143 {
144 }
145
146protected:
147 gpio_num_t _cs{GPIO_NUM_NC};
148};
149
150} // namespace unit
151} // namespace m5
152#endif // ESP_PLATFORM
153#endif
Adapter base.
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.