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 {
37  uint8_t sck{SPI_PIN_DEFAULT};
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() = default;
58 
62  virtual bool begin() = 0;
63 
67  virtual void end() = 0;
68 
72  void beginTransaction(SPISettings& settings)
73  {
74  prepare(settings);
75  }
76 
77  void beginTransaction(const SPISettings& settings)
78  {
79  SPISettings tmp{settings};
80  prepare(tmp);
81  }
82 
86  virtual void endTransaction()
87  {
88  }
89 
90  void write(uint8_t data)
91  {
92  transfer(data);
93  }
94 
95  void write16(uint16_t data)
96  {
97  transfer16(data);
98  }
99 
100  void write32(uint32_t data)
101  {
102  transfer32(data);
103  }
104 
119  virtual uint8_t read8()
120  {
121  return transfer(0xff);
122  }
123 
141  uint8_t transfer(uint8_t val)
142  {
143  return transfer32(val, 8);
144  }
145 
154  uint16_t transfer16(uint16_t val)
155  {
156  return transfer32(val, 16);
157  }
158 
167  virtual uint32_t transfer32(uint32_t val, uint8_t bits = 32)
168  {
169  transfer(reinterpret_cast<uint8_t*>(&val), bits / 8);
170  return val;
171  }
172 
178  virtual void transfer(uint8_t* buffer, size_t size) = 0;
179 
187  virtual bool loopback(bool enable) = 0;
188 
196 
197  const SpiPins& pins{mPins};
198 
199 protected:
204  virtual void prepare(SPISettings& settings) = 0;
205 
209  void assignDefaultPins(const SpiPins& defPins)
210  {
211  if(pins.sck == SPI_PIN_DEFAULT) {
212  mPins.sck = defPins.sck;
213  }
214  if(pins.miso == SPI_PIN_DEFAULT) {
215  mPins.miso = defPins.miso;
216  }
217  if(pins.mosi == SPI_PIN_DEFAULT) {
218  mPins.mosi = defPins.mosi;
219  }
220  }
221 
223 };
224 
Definition: SPIBase.h:51
void beginTransaction(const SPISettings &settings)
Definition: SPIBase.h:77
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.
uint8_t transfer(uint8_t val)
Send/receive one byte of data.
Definition: SPIBase.h:141
uint16_t transfer16(uint16_t val)
Send/receive one 16-bit word of data.
Definition: SPIBase.h:154
virtual uint32_t transfer32(uint32_t val, uint8_t bits=32)
Send/receive a word of variable size.
Definition: SPIBase.h:167
void assignDefaultPins(const SpiPins &defPins)
Assign any default pins.
Definition: SPIBase.h:209
void write32(uint32_t data)
Definition: SPIBase.h:100
virtual void endTransaction()
Stop using the SPI bus. Normally this is called after de-asserting the chip select,...
Definition: SPIBase.h:86
virtual void transfer(uint8_t *buffer, size_t size)=0
Send/receive a variable-length block of data.
virtual void prepare(SPISettings &settings)=0
Prepare/configure with settings.
const SpiPins & pins
Definition: SPIBase.h:197
SpiPins mPins
Definition: SPIBase.h:222
virtual void end()=0
Disable the SPI bus (leaving pin modes unchanged).
void write16(uint16_t data)
Definition: SPIBase.h:95
SPISettings SPIDefaultSettings
Default settings used by the SPI bus until reset by beginTransaction(SPISettings)
Definition: SPIBase.h:195
void write(uint8_t data)
Definition: SPIBase.h:90
void beginTransaction(SPISettings &settings)
Initialize the SPI bus using the defined SPISettings.
Definition: SPIBase.h:72
virtual ~SPIBase()=default
virtual uint8_t read8()
Read one byte from SPI without setting up registers.
Definition: SPIBase.h:119
virtual bool loopback(bool enable)=0
For testing, tie MISO <-> MOSI internally.
Definition: SPISettings.h:74
static constexpr uint8_t SPI_PIN_DEFAULT
SPI driver uses default pin assignment.
Definition: SPIBase.h:31
void enable(Handler &commandHandler, HardwareSerial &serial)
SPI pin connections.
Definition: SPIBase.h:36
bool operator==(const SpiPins &other) const
Definition: SPIBase.h:41
uint8_t mosi
Definition: SPIBase.h:39
uint8_t sck
Definition: SPIBase.h:37
uint8_t miso
Definition: SPIBase.h:38