46
46
#define SPI_MIN_CLOCK_DIVIDER (uint8_t )(1 + ((F_CPU - 1 ) / 12000000 ))
47
47
#endif
48
48
49
+ class SPISettingsSAMD : public arduino ::SPISettings {
50
+ public:
51
+ SPISettingsSAMD (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
52
+ if (__builtin_constant_p (clock )) {
53
+ init_AlwaysInline (clock , bitOrder, dataMode);
54
+ } else {
55
+ init_MightInline (clock , bitOrder, dataMode);
56
+ }
57
+ }
58
+
59
+ // Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
60
+ SPISettingsSAMD () { init_AlwaysInline (4000000 , MSBFIRST, SPI_MODE0); }
61
+
62
+ SPISettingsSAMD (SPISettings& x) { SPISettingsSAMD (x.getClockFreq (), x.getBitOrder (), x.getDataMode ()); }
63
+
64
+ private:
65
+ void init_MightInline (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
66
+ init_AlwaysInline (clock , bitOrder, dataMode);
67
+ }
68
+
69
+ void init_AlwaysInline (uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) {
70
+ this ->clockFreq = (clock >= (F_CPU / SPI_MIN_CLOCK_DIVIDER) ? F_CPU / SPI_MIN_CLOCK_DIVIDER : clock );
71
+
72
+ this ->bitOrder = (bitOrder == MSBFIRST ? MSB_FIRST : LSB_FIRST);
73
+
74
+ switch (dataMode)
75
+ {
76
+ case SPI_MODE0:
77
+ this ->dataMode = SERCOM_SPI_MODE_0; break ;
78
+ case SPI_MODE1:
79
+ this ->dataMode = SERCOM_SPI_MODE_1; break ;
80
+ case SPI_MODE2:
81
+ this ->dataMode = SERCOM_SPI_MODE_2; break ;
82
+ case SPI_MODE3:
83
+ this ->dataMode = SERCOM_SPI_MODE_3; break ;
84
+ default :
85
+ this ->dataMode = SERCOM_SPI_MODE_0; break ;
86
+ }
87
+ }
88
+
89
+ uint32_t clockFreq;
90
+ SercomSpiClockMode dataMode;
91
+ SercomDataOrder bitOrder;
92
+
93
+ friend class SPIClassSAMD ;
94
+ };
95
+
49
96
class SPIClassSAMD : public arduino ::HardwareSPI {
50
97
public:
51
98
SPIClassSAMD (SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, SercomSpiTXPad, SercomRXPad);
@@ -57,7 +104,10 @@ class SPIClassSAMD : public arduino::HardwareSPI {
57
104
// Transaction Functions
58
105
void usingInterrupt (int interruptNumber);
59
106
void notUsingInterrupt (int interruptNumber);
60
- void beginTransaction (SPISettings settings);
107
+ void beginTransaction (SPISettingsSAMD settings);
108
+ void beginTransaction (SPISettings settings) {
109
+ beginTransaction (SPISettingsSAMD (settings));
110
+ }
61
111
void endTransaction (void );
62
112
63
113
// SPI Configuration methods
@@ -73,7 +123,10 @@ class SPIClassSAMD : public arduino::HardwareSPI {
73
123
74
124
private:
75
125
void init ();
76
- void config (SPISettings settings);
126
+ void config (SPISettingsSAMD settings);
127
+ void config (SPISettings settings) {
128
+ config (SPISettingsSAMD (settings));
129
+ }
77
130
78
131
SERCOM *_p_sercom;
79
132
uint8_t _uc_pinMiso;
0 commit comments