5252#define EXTERNAL_NUM_INTERRUPTS NUM_TOTAL_PINS
5353#endif
5454
55- class SPISettings {
55+ class SPISettingsMegaAVR : public arduino :: SPISettings {
5656public:
57- SPISettings (uint32_t clock, BitOrder bitOrder,uint8_t dataMode) {
57+ SPISettingsMegaAVR (uint32_t clock, BitOrder bitOrder,uint8_t dataMode) {
5858if (__builtin_constant_p (clock)) {
5959init_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
6870private:
6971void init_MightInline (uint32_t clock, BitOrder bitOrder,uint8_t dataMode) {
@@ -142,12 +144,12 @@ class SPISettings {
142144/* member variables containing the desired SPI settings*/
143145uint8_t ctrla;
144146uint8_t ctrlb;
145- friend class SPIClass ;
147+ friend class SPIClassMegaAVR ;
146148};
147149
148- class SPIClass {
150+ class SPIClassMegaAVR : public arduino ::HardwareSPI {
149151public:
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 bytetransfer (uint8_t data);
153155uint16_t transfer16 (uint16_t data);
@@ -156,7 +158,10 @@ class SPIClass {
156158// Transaction Functions
157159void usingInterrupt (int interruptNumber);
158160void notUsingInterrupt (int interruptNumber);
159- void beginTransaction (SPISettings settings);
161+ void beginTransaction (SPISettingsMegaAVR settings);
162+ void beginTransaction (SPISettings settings) {
163+ beginTransaction (SPISettingsMegaAVR (settings));
164+ }
160165void endTransaction (void );
161166
162167void begin ();
@@ -169,13 +174,16 @@ class SPIClass {
169174private:
170175
171176void 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
180188void detachMaskedInterrupts ();
181189void reattachMaskedInterrupts ();
@@ -199,6 +207,7 @@ class SPIClass {
199207 #endif
200208};
201209
210+ #define SPIClass SPIClassMegaAVR
202211
203212#if SPI_INTERFACES_COUNT > 0
204213extern SPIClass SPI;