52
52
#define EXTERNAL_NUM_INTERRUPTS NUM_TOTAL_PINS
53
53
#endif
54
54
55
- class SPISettings {
55
+ class SPISettingsMegaAVR : public arduino :: SPISettings {
56
56
public:
57
- SPISettings (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
57
+ SPISettingsMegaAVR (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
58
58
if (__builtin_constant_p (clock )) {
59
59
init_AlwaysInline (clock , bitOrder, dataMode);
60
60
} else {
@@ -63,7 +63,9 @@ class SPISettings {
63
63
}
64
64
65
65
// 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 ()); }
67
69
68
70
private:
69
71
void init_MightInline (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
@@ -142,12 +144,12 @@ class SPISettings {
142
144
/* member variables containing the desired SPI settings */
143
145
uint8_t ctrla;
144
146
uint8_t ctrlb;
145
- friend class SPIClass ;
147
+ friend class SPIClassMegaAVR ;
146
148
};
147
149
148
- class SPIClass {
150
+ class SPIClassMegaAVR : public arduino ::HardwareSPI {
149
151
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);
151
153
152
154
byte transfer (uint8_t data);
153
155
uint16_t transfer16 (uint16_t data);
@@ -156,7 +158,10 @@ class SPIClass {
156
158
// Transaction Functions
157
159
void usingInterrupt (int interruptNumber);
158
160
void notUsingInterrupt (int interruptNumber);
159
- void beginTransaction (SPISettings settings);
161
+ void beginTransaction (SPISettingsMegaAVR settings);
162
+ void beginTransaction (SPISettings settings) {
163
+ beginTransaction (SPISettingsMegaAVR (settings));
164
+ }
160
165
void endTransaction (void );
161
166
162
167
void begin ();
@@ -169,13 +174,16 @@ class SPIClass {
169
174
private:
170
175
171
176
void init ();
172
- void config (SPISettings settings);
177
+ void config (SPISettingsMegaAVR settings);
178
+ void config (SPISettings settings) {
179
+ config (SPISettingsMegaAVR (settings));
180
+ }
173
181
174
182
// These undocumented functions should not be used. SPI.transfer()
175
183
// polls the hardware flag which is automatically cleared as the
176
184
// 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); }
179
187
180
188
void detachMaskedInterrupts ();
181
189
void reattachMaskedInterrupts ();
@@ -199,6 +207,7 @@ class SPIClass {
199
207
#endif
200
208
};
201
209
210
+ #define SPIClass SPIClassMegaAVR
202
211
203
212
#if SPI_INTERFACES_COUNT > 0
204
213
extern SPIClass SPI;
0 commit comments