@@ -34,33 +34,39 @@ typedef enum {
34
34
SPI_MODE3 = 3 ,
35
35
} SPIMode;
36
36
37
+ typedef enum {
38
+ SPI_CONTROLLER = 0 ,
39
+ SPI_PERIPHERAL = 1 ,
40
+ } SPIBusMode;
41
+
37
42
38
43
class SPISettings {
39
44
public:
40
- SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
45
+ SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
41
46
if (__builtin_constant_p (clock)) {
42
- init_AlwaysInline (clock, bitOrder, dataMode);
47
+ init_AlwaysInline (clock, bitOrder, dataMode, busMode );
43
48
} else {
44
- init_MightInline (clock, bitOrder, dataMode);
49
+ init_MightInline (clock, bitOrder, dataMode, busMode );
45
50
}
46
51
}
47
52
48
- SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode) {
53
+ SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
49
54
if (__builtin_constant_p (clock)) {
50
- init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode);
55
+ init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode, busMode );
51
56
} else {
52
- init_MightInline (clock, bitOrder, (SPIMode)dataMode);
57
+ init_MightInline (clock, bitOrder, (SPIMode)dataMode, busMode );
53
58
}
54
59
}
55
60
56
61
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
57
- SPISettings () { init_AlwaysInline (4000000 , MSBFIRST, SPI_MODE0); }
62
+ SPISettings () { init_AlwaysInline (4000000 , MSBFIRST, SPI_MODE0, SPI_CONTROLLER ); }
58
63
59
64
bool operator ==(const SPISettings& rhs) const
60
65
{
61
66
if ((this ->clockFreq == rhs.clockFreq ) &&
62
67
(this ->bitOrder == rhs.bitOrder ) &&
63
- (this ->dataMode == rhs.dataMode )) {
68
+ (this ->dataMode == rhs.dataMode ) &&
69
+ (this ->busMode == rhs.busMode )) {
64
70
return true ;
65
71
}
66
72
return false ;
@@ -80,22 +86,27 @@ class SPISettings {
80
86
BitOrder getBitOrder () const {
81
87
return (bitOrder);
82
88
}
89
+ SPIBusMode getBusMode () const {
90
+ return busMode;
91
+ }
83
92
84
93
private:
85
- void init_MightInline (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
86
- init_AlwaysInline (clock, bitOrder, dataMode);
94
+ void init_MightInline (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode ) {
95
+ init_AlwaysInline (clock, bitOrder, dataMode, busMode );
87
96
}
88
97
89
98
// Core developer MUST use an helper function in beginTransaction() to use this data
90
- void init_AlwaysInline (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) __attribute__((__always_inline__)) {
99
+ void init_AlwaysInline (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode ) __attribute__((__always_inline__)) {
91
100
this ->clockFreq = clock;
92
101
this ->dataMode = dataMode;
93
102
this ->bitOrder = bitOrder;
103
+ this ->busMode = busMode;
94
104
}
95
105
96
106
uint32_t clockFreq;
97
107
SPIMode dataMode;
98
108
BitOrder bitOrder;
109
+ SPIBusMode busMode;
99
110
100
111
friend class HardwareSPI ;
101
112
};
0 commit comments