Skip to content

Commit fcb6acd

Browse files
committed
SPI: port to ArduinoAPI
1 parent c76669c commit fcb6acd

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

libraries/SPI/src/SPI.cpp

Lines changed: 2 additions & 4 deletions
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;
@@ -67,7 +65,7 @@ void SPIClass::init()
6765
initialized = true;
6866
}
6967

70-
void SPIClass::config(SPISettings settings)
68+
void SPIClass::config(SPISettingsMegaAVR settings)
7169
{
7270
SPI0.CTRLA = settings.ctrla;
7371
SPI0.CTRLB = settings.ctrlb;
@@ -174,7 +172,7 @@ void SPIClass::reattachMaskedInterrupts() {
174172
}
175173
}
176174

177-
void SPIClass::beginTransaction(SPISettings settings)
175+
void SPIClass::beginTransaction(SPISettingsMegaAVR settings)
178176
{
179177
if (interruptMode != SPI_IMODE_NONE)
180178
{

libraries/SPI/src/SPI.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050

5151
#define EXTERNAL_NUM_INTERRUPTS NUM_TOTAL_PINS
5252

53-
class SPISettings {
53+
class SPISettingsMegaAVR : public arduino::SPISettings {
5454
public:
55-
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
55+
SPISettingsMegaAVR(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
5656
if (__builtin_constant_p(clock)) {
5757
init_AlwaysInline(clock, bitOrder, dataMode);
5858
} else {
@@ -61,7 +61,9 @@ class SPISettings {
6161
}
6262

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

6668
private:
6769
void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
@@ -140,12 +142,12 @@ class SPISettings {
140142
/* member variables containing the desired SPI settings */
141143
uint8_t ctrla;
142144
uint8_t ctrlb;
143-
friend class SPIClass;
145+
friend class SPIClassMegaAVR;
144146
};
145147

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

150152
byte transfer(uint8_t data);
151153
uint16_t transfer16(uint16_t data);
@@ -154,7 +156,10 @@ class SPIClass {
154156
// Transaction Functions
155157
void usingInterrupt(int interruptNumber);
156158
void notUsingInterrupt(int interruptNumber);
157-
void beginTransaction(SPISettings settings);
159+
void beginTransaction(SPISettingsMegaAVR settings);
160+
void beginTransaction(SPISettings settings) {
161+
beginTransaction(SPISettingsMegaAVR(settings));
162+
}
158163
void endTransaction(void);
159164

160165
void begin();
@@ -167,13 +172,16 @@ class SPIClass {
167172
private:
168173

169174
void init();
170-
void config(SPISettings settings);
175+
void config(SPISettingsMegaAVR settings);
176+
void config(SPISettings settings) {
177+
config(SPISettingsMegaAVR(settings));
178+
}
171179

172180
// These undocumented functions should not be used. SPI.transfer()
173181
// polls the hardware flag which is automatically cleared as the
174182
// AVR responds to SPI's interrupt
175-
inline static void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); }
176-
inline static void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); }
183+
inline void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); }
184+
inline void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); }
177185

178186
void detachMaskedInterrupts();
179187
void reattachMaskedInterrupts();
@@ -197,6 +205,7 @@ class SPIClass {
197205
#endif
198206
};
199207

208+
#define SPIClass SPIClassMegaAVR
200209

201210
#if SPI_INTERFACES_COUNT > 0
202211
extern SPIClass SPI;

0 commit comments

Comments
 (0)