SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
SensorCommArduino_SPI.hpp
Go to the documentation of this file.
1
31#pragma once
32
33#include "../SensorCommBase.hpp"
34
35#ifdef ARDUINO
36
37
38#if (defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32)) && !defined(ARDUINO_ARCH_MBED)
39#define __writeBytes(txBuf,size) spi.transfer(txBuf,nullptr,size)
40#elif defined(ARDUINO_ARCH_NRF52)
41#define __writeBytes(txBuf,size) spi.transfer(txBuf,nullptr,size)
42#elif defined(ARDUINO_ARCH_MBED) || defined(ARDUINO_ARCH_ZEPHYR)
43#define __writeBytes(txBuf,size) spi.transfer((void*)txBuf,size)
44#else
45#define __writeBytes(txBuf,size) spi.writeBytes(txBuf,size)
46#endif
47
48
49class SensorCommSPI : public SensorCommBase
50{
51public:
52 SensorCommSPI(SPIClass &spi, uint8_t csPin, SensorHal *hal) : spi(spi), csPin(csPin), hal(hal) {}
53 SensorCommSPI(SPIClass &spi, uint8_t csPin, int mosi, int miso, int sck, SensorHal *hal) : spi(spi),
54 csPin(csPin), hal(hal), mosi(mosi), miso(miso), sck(sck) {}
55
56 bool init() override
57 {
58 if (!hal) {
60 return false;
61 }
62 if (mosi != -1 && miso != -1 && sck != -1) {
63#if defined(ARDUINO_ARCH_NRF52)
64 spi.setPins(miso, sck, mosi);
65 spi.begin();
66#elif defined(ARDUINO_ARCH_ESP32)
67 spi.begin(sck, miso, mosi);
68#elif defined(ARDUINO_ARCH_RP2040)
69#if !defined(ARDUINO_ARCH_MBED)
70 spi.setSCK(sck);
71 spi.setRX(miso);
72 spi.setTX(mosi);
73#endif /*ARDUINO_ARCH_MBED*/
74 spi.begin();
75#elif defined(ARDUINO_ARCH_STM32)
76 spi.setMISO(miso);
77 spi.setMOSI(mosi);
78 spi.setSCLK(sck);
79 spi.begin();
80#else
81#warning "SPI custom GPIO mapping function is not implemented"
82#endif
83 } else {
84 // Use default pins
85 spi.begin();
86 }
87 hal->pinMode(csPin, OUTPUT);
88 hal->digitalWrite(csPin, HIGH);
89 return true;
90 }
91
92 void deinit() override
93 {
94 // Do not destroy spi bus
95 // spi.end();
96 }
97
98 int writeRegister(const uint8_t reg, uint8_t *buf, size_t len) override
99 {
100 if (hal == nullptr) {
102 }
103 hal->digitalWrite(csPin, LOW);
104 spi.beginTransaction(setting);
105 spi.transfer(reg);
106 for (size_t i = 0; i < len; ++i) {
107 spi.transfer(buf[i]);
108 }
109 spi.endTransaction();
110 hal->digitalWrite(csPin, HIGH);
111 return SENSOR_OK;
112 }
113
114 int readBuffer(uint8_t *buf, size_t len) override
115 {
116 if (hal == nullptr) {
118 }
119 hal->digitalWrite(csPin, LOW);
120 spi.beginTransaction(setting);
121 spi.transfer(0x00);
122 for (size_t i = 0; i < len; ++i) {
123 buf[i] = spi.transfer(0x00);
124 }
125 spi.endTransaction();
126 hal->digitalWrite(csPin, HIGH);
127 return SENSOR_OK;
128 }
129
130 int writeBuffer(uint8_t *buffer, size_t len) override
131 {
132 if (hal == nullptr) {
134 }
135 hal->digitalWrite(csPin, LOW);
136 spi.beginTransaction(setting);
137 if (buffer && len > 0) {
138 // spi.writeBytes(buffer, len);
139 __writeBytes(buffer, len);
140 }
141 spi.endTransaction();
142 hal->digitalWrite(csPin, HIGH);
143 return SENSOR_OK;
144 }
145
146 int readRegister(const uint8_t reg, uint8_t *buf, size_t len) override
147 {
148 if (hal == nullptr) {
150 }
151 hal->digitalWrite(csPin, LOW);
152 spi.beginTransaction(setting);
153 spi.transfer(reg | 0x80);
154#if defined(ARDUINO_ARCH_ESP32)
155 spi.transferBytes(NULL, buf, len);
156#else
157 for (size_t i = 0; i < len; i++) {
158 buf[i] = spi.transfer(0x00);
159 }
160#endif
161 spi.endTransaction();
162 hal->digitalWrite(csPin, HIGH);
163 return SENSOR_OK;
164 }
165
166 int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len) override
167 {
168 if (hal == nullptr) {
170 }
171 hal->digitalWrite(csPin, LOW);
172 spi.beginTransaction(setting);
173
174 // spi.writeBytes(write_buffer, write_len);
175 __writeBytes(write_buffer, write_len);
176
177 spi.endTransaction();
178
179 spi.beginTransaction(setting);
180 for (size_t i = 0; i < read_len; ++i) {
181 read_buffer[i] = spi.transfer(0x00);
182 }
183 spi.endTransaction();
184 hal->digitalWrite(csPin, HIGH);
185 return SENSOR_OK;
186 }
187
188 void setParams(const CommParamsBase &params) override
189 {
190#if defined(__cpp_rtti)
191 const auto pdat = dynamic_cast<const SPIParam *>(&params);
192#else
193 const auto pdat = static_cast<const SPIParam *>(&params);
194#endif
195 setting = pdat->getSetting();
196 }
197
198private:
199 SPIClass &spi;
200 uint8_t csPin;
201 SensorHal *hal;
202 SPISettings setting;
203 int mosi, miso, sck;
204};
205
206#undef __writeBytes
207
208#endif //*ARDUINO
209
210
211
212
213
214
215
216
@ SENSOR_OK
Definition SensorErr.hpp:37
@ SENSOR_ERR_INVALID_ARG
Definition SensorErr.hpp:43
Abstract base for all communication parameter objects.
SPI communication parameters.
SPISettings getSetting() const
Retrieve the stored SPI settings.
Emulation of Arduino's SPISettings class.
Abstract base class for low‑level sensor communication.
virtual int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len)=0
Perform a write followed by a read (e.g., for register‑based sensors).
virtual int readBuffer(uint8_t *buf, size_t len)=0
Read bytes directly from the device (no register address sent).
virtual int writeBuffer(uint8_t *buffer, size_t len)=0
Write a buffer directly to the device (no register address).
virtual void setParams(const CommParamsBase &params)=0
Apply communication parameters (e.g., I2C address, SPI settings).
virtual int readRegister(const uint8_t reg)
Read a single byte from a register.
virtual void deinit()=0
Deinitialise the communication interface (close device, etc.).
virtual bool init()=0
Initialise the communication interface (open device, etc.).
virtual int writeRegister(const uint8_t reg, uint8_t val)
Write a single byte to a register.
void setError(SENSOR_ERROR_CODE e)
Abstract hardware abstraction layer.
uint8_t i
char buf[64]