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