SPIBase.h
Go to the documentation of this file.
1 /*
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * SPIBase.h
8  *
9  * Created on: Mar 2, 2016
10  * Author: harry-boe
11  *
12  */
13 
14 #pragma once
15 
16 #include "SPISettings.h"
17 #include <cstddef>
18 
19 // for compatibility when porting from Arduino
20 #define SPI_HAS_TRANSACTION 1
21 
31 static constexpr uint8_t SPI_PIN_DEFAULT{0xff};
32 
36 struct SpiPins {
40 
41  bool operator==(const SpiPins& other) const
42  {
43  return sck == other.sck && miso == other.miso && mosi == other.mosi;
44  }
45 };
46 
47 /*
48  * @brief Base class/interface for SPI implementations
49  */
50 class SPIBase
51 {
52 public:
54  {
55  }
56 
57  virtual ~SPIBase()
58  {
59  }
60 
64  virtual bool begin() = 0;
65 
69  virtual void end() = 0;
70 
74  void beginTransaction(SPISettings& settings)
75  {
76  prepare(settings);
77  }
78 
79  void beginTransaction(const SPISettings& settings)
80  {
81  SPISettings tmp{settings};
82  prepare(tmp);
83  }
84 
88  virtual void endTransaction()
89  {
90  }
91 
92  void write(uint8_t data)
93  {
94  transfer(data);
95  }
96 
97  void write16(uint16_t data)
98  {
99  transfer16(data);
100  }
101 
102  void write32(uint32_t data)
103  {
104  transfer32(data);
105  }
106 
121  virtual uint8_t read8()
122  {
123  return transfer(0xff);
124  }
125 
144  {
145  return transfer32(val, 8);
146  }
147 
157  {
158  return transfer32(val, 16);
159  }
160 
169  virtual uint32_t transfer32(uint32_t val, uint8_t bits = 32)
170  {
171  transfer(reinterpret_cast<uint8_t*>(&val), bits / 8);
172  return val;
173  }
174 
180  virtual void transfer(uint8_t* buffer, size_t size) = 0;
181 
189  virtual bool loopback(bool enable) = 0;
190 
198 
199  const SpiPins& pins{mPins};
200 
201 protected:
206  virtual void prepare(SPISettings& settings) = 0;
207 
211  void assignDefaultPins(const SpiPins& defPins)
212  {
213  if(pins.sck == SPI_PIN_DEFAULT) {
214  mPins.sck = defPins.sck;
215  }
216  if(pins.miso == SPI_PIN_DEFAULT) {
217  mPins.miso = defPins.miso;
218  }
219  if(pins.mosi == SPI_PIN_DEFAULT) {
220  mPins.mosi = defPins.mosi;
221  }
222  }
223 
225 };
226 
uint8_t transfer(uint8_t val)
Send/receive one byte of data.
Definition: SPIBase.h:143
const SpiPins & pins
Definition: SPIBase.h:199
void write32(uint32_t data)
Definition: SPIBase.h:102
SPI pin connections.
Definition: SPIBase.h:36
virtual bool loopback(bool enable)=0
For testing, tie MISO <-> MOSI internally.
void write(uint8_t data)
Definition: SPIBase.h:92
virtual void end()=0
Disable the SPI bus (leaving pin modes unchanged).
Definition: SPISettings.h:73
uint16_t transfer16(uint16_t val)
Send/receive one 16-bit word of data.
Definition: SPIBase.h:156
SpiPins mPins
Definition: SPIBase.h:224
void beginTransaction(SPISettings &settings)
Initialize the SPI bus using the defined SPISettings.
Definition: SPIBase.h:74
virtual uint8_t read8()
Read one byte from SPI without setting up registers.
Definition: SPIBase.h:121
uint8_t mosi
Definition: SPIBase.h:39
void write16(uint16_t data)
Definition: SPIBase.h:97
void assignDefaultPins(const SpiPins &defPins)
Assign any default pins.
Definition: SPIBase.h:211
virtual void endTransaction()
Stop using the SPI bus. Normally this is called after de-asserting the chip select,...
Definition: SPIBase.h:88
virtual uint32_t transfer32(uint32_t val, uint8_t bits=32)
Send/receive a word of variable size.
Definition: SPIBase.h:169
uint8_t miso
Definition: SPIBase.h:38
SPISettings SPIDefaultSettings
Default settings used by the SPI bus until reset by beginTransaction(SPISettings)
Definition: SPIBase.h:197
static constexpr uint8_t SPI_PIN_DEFAULT
SPI driver uses default pin assignment.
Definition: SPIBase.h:31
void enable(Handler &commandHandler, HardwareSerial &serial)
virtual void prepare(SPISettings &settings)=0
Prepare/configure with settings.
SPIBase(const SpiPins &pins)
Definition: SPIBase.h:53
virtual bool begin()=0
Initialize the SPI bus by setting SCK and MOSI to outputs, pulling SCK and MOSI low.
Definition: SPIBase.h:50
void beginTransaction(const SPISettings &settings)
Definition: SPIBase.h:79
virtual ~SPIBase()
Definition: SPIBase.h:57
uint8_t sck
Definition: SPIBase.h:37
bool operator==(const SpiPins &other) const
Definition: SPIBase.h:41