SPISettings.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  * SPISettings.h
8  *
9  * Created on: Mar 2, 2016
10  * Author: harry
11  *
12  ****/
13 
14 #pragma once
15 
16 #include <Digital.h>
17 #include <sming_attr.h>
18 #ifdef SPI_DEBUG
19 #include <debug_progmem.h>
20 #endif
21 
26 // Mode Clock Polarity (CPOL) Clock Phase (CPHA)
27 // SPI_MODE0 0 0
28 // SPI_MODE1 0 1
29 // SPI_MODE2 1 0
30 // SPI_MODE3 1 1
31 
32 enum SpiMode : uint8_t {
33  SPI_MODE0 = 0x00,
34  SPI_MODE1 = 0x0F,
35  SPI_MODE2 = 0xF0,
36  SPI_MODE3 = 0xFF,
37 };
38 
39 const uint32_t SPI_SPEED_DEFAULT = 4000000UL;
40 
45 struct SPISpeed {
46  uint32_t frequency{0};
47  uint32_t regVal{0};
48 
49  SPISpeed(uint32_t freq = SPI_SPEED_DEFAULT) : frequency(freq)
50  {
51  }
52 
53  SPISpeed& operator=(uint32_t freq)
54  {
55  setFrequency(freq);
56  return *this;
57  }
58 
59  bool operator==(const SPISpeed& speed) const
60  {
61  return frequency == speed.frequency;
62  }
63 
64  void setFrequency(uint32_t freq)
65  {
66  if(freq != frequency) {
67  frequency = freq;
68  regVal = 0;
69  }
70  }
71 };
72 
74 {
75 public:
77  {
78 #ifdef SPI_DEBUG
79  debugf("SPISettings::SPISettings() default");
80 #endif
81  }
82 
103  {
104 #ifdef SPI_DEBUG
105  debugf("SPISettings(int %i, uint8 %u, uint8 %u)", speed, bitOrder, dataMode);
106 #endif
107  }
108 
109  /*
110  * Arduino libraries use non-typed dataMode
111  */
112  SPISettings(uint32_t speed, uint8_t bitOrder, uint8_t dataMode)
114  {
115  }
116 
117  // overload operator to check whether the settings are equal
118  bool operator==(const SPISettings& other) const
119  {
120  return (speed == other.speed) && (bitOrder == other.bitOrder) && (dataMode == other.dataMode);
121  }
122 
123  void print(const char* s)
124  {
125 #ifdef SPI_DEBUG
126  debugf("-> %s -> SPISettings(%u, %u, %u)", s, speed.frequency, bitOrder, dataMode);
127 #endif
128  }
129 
134  static uint8_t getModeNum(SpiMode mode)
135  {
136  return (mode <= 3) ? mode : ((mode & 0x10) >> 3) | (mode & 0x01);
137  }
138 
140  uint8_t bitOrder{MSBFIRST};
142 };
143 
#define MSBFIRST
Definition: WConstants.h:63
Definition: SPISettings.h:74
SpiMode dataMode
Definition: SPISettings.h:141
SPISpeed speed
Definition: SPISettings.h:139
SPISettings()
Definition: SPISettings.h:76
SPISettings(uint32_t speed, uint8_t bitOrder, uint8_t dataMode)
Definition: SPISettings.h:112
void print(const char *s)
Definition: SPISettings.h:123
SPISettings(uint32_t speed, uint8_t bitOrder, SpiMode dataMode)
constructor for SPISettings
Definition: SPISettings.h:101
bool operator==(const SPISettings &other) const
Definition: SPISettings.h:118
uint8_t bitOrder
Definition: SPISettings.h:140
static uint8_t getModeNum(SpiMode mode)
Get number 0-3 corresponding to an SpiMode setting.
Definition: SPISettings.h:134
#define debugf
Definition: debug_progmem.h:127
SpiMode
Definition: SPISettings.h:32
const uint32_t SPI_SPEED_DEFAULT
Definition: SPISettings.h:39
@ SPI_MODE2
Definition: SPISettings.h:35
@ SPI_MODE0
Definition: SPISettings.h:33
@ SPI_MODE1
Definition: SPISettings.h:34
@ SPI_MODE3
Definition: SPISettings.h:36
Contains bus frequency and corresponding divisor/prescaler settings.
Definition: SPISettings.h:45
SPISpeed & operator=(uint32_t freq)
Definition: SPISettings.h:53
void setFrequency(uint32_t freq)
Definition: SPISettings.h:64
uint32_t regVal
Cached clock register value.
Definition: SPISettings.h:47
uint32_t frequency
Definition: SPISettings.h:46
bool operator==(const SPISpeed &speed) const
Definition: SPISettings.h:59
SPISpeed(uint32_t freq=SPI_SPEED_DEFAULT)
Definition: SPISettings.h:49