@@ -34,33 +34,39 @@ typedef enum {
3434 SPI_MODE3 = 3 ,
3535} SPIMode;
3636
37+ typedef enum {
38+ SPI_CONTROLLER = 0 ,
39+ SPI_PERIPHERAL = 1 ,
40+ } SPIBusMode;
41+
3742
3843class SPISettings {
3944 public:
40- SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
45+ SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
4146 if (__builtin_constant_p (clock)) {
42- init_AlwaysInline (clock, bitOrder, dataMode);
47+ init_AlwaysInline (clock, bitOrder, dataMode, busMode );
4348 } else {
44- init_MightInline (clock, bitOrder, dataMode);
49+ init_MightInline (clock, bitOrder, dataMode, busMode );
4550 }
4651 }
4752
48- SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode) {
53+ SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
4954 if (__builtin_constant_p (clock)) {
50- init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode);
55+ init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode, busMode );
5156 } else {
52- init_MightInline (clock, bitOrder, (SPIMode)dataMode);
57+ init_MightInline (clock, bitOrder, (SPIMode)dataMode, busMode );
5358 }
5459 }
5560
5661 // 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 ); }
5863
5964 bool operator ==(const SPISettings& rhs) const
6065 {
6166 if ((this ->clockFreq == rhs.clockFreq ) &&
6267 (this ->bitOrder == rhs.bitOrder ) &&
63- (this ->dataMode == rhs.dataMode )) {
68+ (this ->dataMode == rhs.dataMode ) &&
69+ (this ->busMode == rhs.busMode )) {
6470 return true ;
6571 }
6672 return false ;
@@ -80,22 +86,27 @@ class SPISettings {
8086 BitOrder getBitOrder () const {
8187 return (bitOrder);
8288 }
89+ SPIBusMode getBusMode () const {
90+ return busMode;
91+ }
8392
8493 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 );
8796 }
8897
8998 // 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__)) {
91100 this ->clockFreq = clock;
92101 this ->dataMode = dataMode;
93102 this ->bitOrder = bitOrder;
103+ this ->busMode = busMode;
94104 }
95105
96106 uint32_t clockFreq;
97107 SPIMode dataMode;
98108 BitOrder bitOrder;
109+ SPIBusMode busMode;
99110
100111 friend class HardwareSPI ;
101112};
0 commit comments