Skip to content

Commit a1affdf

Browse files
committed
SPI: port to ArduinoAPI
1 parent 106ae6d commit a1affdf

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

Diff for: libraries/SPI/src/SPI.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
#define SPI_IMODE_EXTINT 1
2525
#define SPI_IMODE_GLOBAL 2
2626

27-
const SPISettings DEFAULT_SPI_SETTINGS = SPISettings();
28-
2927
SPIClass::SPIClass(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux)
3028
{
3129
initialized = false;
@@ -66,7 +64,7 @@ void SPIClass::init()
6664
initialized = true;
6765
}
6866

69-
void SPIClass::config(SPISettings settings)
67+
void SPIClass::config(SPISettingsMegaAVR settings)
7068
{
7169
SPI0.CTRLA = settings.ctrla;
7270
SPI0.CTRLB = settings.ctrlb;
@@ -173,7 +171,7 @@ void SPIClass::reattachMaskedInterrupts() {
173171
}
174172
}
175173

176-
void SPIClass::beginTransaction(SPISettings settings)
174+
void SPIClass::beginTransaction(SPISettingsMegaAVR settings)
177175
{
178176
if (interruptMode != SPI_IMODE_NONE)
179177
{

Diff for: libraries/SPI/src/SPI.h

+19-10
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
#define EXTERNAL_NUM_INTERRUPTS NUM_TOTAL_PINS
5353
#endif
5454

55-
class SPISettings {
55+
class SPISettingsMegaAVR : public arduino::SPISettings {
5656
public:
57-
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
57+
SPISettingsMegaAVR(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
5858
if (__builtin_constant_p(clock)) {
5959
init_AlwaysInline(clock, bitOrder, dataMode);
6060
} else {
@@ -63,7 +63,9 @@ class SPISettings {
6363
}
6464

6565
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
66-
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
66+
SPISettingsMegaAVR() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
67+
68+
SPISettingsMegaAVR(SPISettings& x) { SPISettingsMegaAVR(x.getClockFreq(), x.getBitOrder(), x.getDataMode()); }
6769

6870
private:
6971
void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
@@ -142,12 +144,12 @@ class SPISettings {
142144
/* member variables containing the desired SPI settings */
143145
uint8_t ctrla;
144146
uint8_t ctrlb;
145-
friend class SPIClass;
147+
friend class SPIClassMegaAVR;
146148
};
147149

148-
class SPIClass {
150+
class SPIClassMegaAVR : public arduino::HardwareSPI {
149151
public:
150-
SPIClass(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux);
152+
SPIClassMegaAVR(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux);
151153

152154
byte transfer(uint8_t data);
153155
uint16_t transfer16(uint16_t data);
@@ -156,7 +158,10 @@ class SPIClass {
156158
// Transaction Functions
157159
void usingInterrupt(int interruptNumber);
158160
void notUsingInterrupt(int interruptNumber);
159-
void beginTransaction(SPISettings settings);
161+
void beginTransaction(SPISettingsMegaAVR settings);
162+
void beginTransaction(SPISettings settings) {
163+
beginTransaction(SPISettingsMegaAVR(settings));
164+
}
160165
void endTransaction(void);
161166

162167
void begin();
@@ -169,13 +174,16 @@ class SPIClass {
169174
private:
170175

171176
void init();
172-
void config(SPISettings settings);
177+
void config(SPISettingsMegaAVR settings);
178+
void config(SPISettings settings) {
179+
config(SPISettingsMegaAVR(settings));
180+
}
173181

174182
// These undocumented functions should not be used. SPI.transfer()
175183
// polls the hardware flag which is automatically cleared as the
176184
// AVR responds to SPI's interrupt
177-
inline static void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); }
178-
inline static void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); }
185+
inline void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); }
186+
inline void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); }
179187

180188
void detachMaskedInterrupts();
181189
void reattachMaskedInterrupts();
@@ -199,6 +207,7 @@ class SPIClass {
199207
#endif
200208
};
201209

210+
#define SPIClass SPIClassMegaAVR
202211

203212
#if SPI_INTERFACES_COUNT > 0
204213
extern SPIClass SPI;

0 commit comments

Comments
 (0)