@@ -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 {
3944public:
40- SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
45+ SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
4146if (__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 ) {
4954if (__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
5964bool operator ==(const SPISettings& rhs)const
6065 {
6166if ((this ->clockFreq == rhs.clockFreq ) &&
6267 (this ->bitOrder == rhs.bitOrder ) &&
63- (this ->dataMode == rhs.dataMode )) {
68+ (this ->dataMode == rhs.dataMode ) &&
69+ (this ->busMode == rhs.busMode )) {
6470return true ;
6571 }
6672return false ;
@@ -80,22 +86,27 @@ class SPISettings {
8086 BitOrdergetBitOrder ()const {
8187return (bitOrder);
8288 }
89+ SPIBusModegetBusMode ()const {
90+ return busMode;
91+ }
8392
8493private:
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__)) {
91100this ->clockFreq = clock;
92101this ->dataMode = dataMode;
93102this ->bitOrder = bitOrder;
103+ this ->busMode = busMode;
94104 }
95105
96106uint32_t clockFreq;
97107 SPIMode dataMode;
98108 BitOrder bitOrder;
109+ SPIBusMode busMode;
99110
100111friend class HardwareSPI ;
101112};