@@ -25,6 +25,7 @@ void SPIClass::begin() {
25
25
// Default speed set to 4Mhz
26
26
setClockDivider (BOARD_SPI_DEFAULT_SS, 21 );
27
27
setDataMode (BOARD_SPI_DEFAULT_SS, SPI_MODE0);
28
+ setBitOrder (BOARD_SPI_DEFAULT_SS, MSBFIRST);
28
29
}
29
30
30
31
void SPIClass::begin (uint8_t _pin) {
@@ -34,39 +35,50 @@ void SPIClass::begin(uint8_t _pin) {
34
35
g_APinDescription[spiPin].ulPinType ,
35
36
g_APinDescription[spiPin].ulPin ,
36
37
g_APinDescription[spiPin].ulPinConfiguration );
37
- // Default speed set to 4Mhz
38
- setClockDivider (_pin, 21 );
38
+
39
+ // Default speed set to 500Khz
40
+ setClockDivider (_pin, 168 );
39
41
setDataMode (_pin, SPI_MODE0);
42
+ setBitOrder (_pin, MSBFIRST);
43
+ }
44
+
45
+ void SPIClass::end (uint8_t _pin) {
46
+ uint32_t spiPin = BOARD_PIN_TO_SPI_PIN (_pin);
47
+ // Setting the pin as INPUT will disconnect it from SPI peripheral
48
+ pinMode (spiPin, INPUT);
40
49
}
41
50
42
51
void SPIClass::end () {
43
52
SPI_Disable (spi);
44
53
}
45
54
46
- // void SPIClass::setBitOrder(uint8_t _bitOrder, uint8_t _channel) {
47
- // // Not supported
48
- // }
55
+ void SPIClass::setBitOrder (uint8_t _pin, BitOrder _bitOrder) {
56
+ uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL (_pin);
57
+ bitOrder[ch] = _bitOrder;
58
+ }
49
59
50
60
void SPIClass::setDataMode (uint8_t _pin, uint8_t _mode) {
51
- uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL (_pin);
52
- mode[_channel ] = _mode | SPI_CSR_CSAAT;
61
+ uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL (_pin);
62
+ mode[ch ] = _mode | SPI_CSR_CSAAT;
53
63
// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
54
64
// transfer. Some device needs that for working properly.
55
- SPI_ConfigureNPCS (spi, _channel , mode[_channel ] | SPI_CSR_SCBR (divider[_channel ]) | SPI_CSR_DLYBCT (10 ) | ( 32 << 16 ));
65
+ SPI_ConfigureNPCS (spi, ch , mode[ch ] | SPI_CSR_SCBR (divider[ch ]) | SPI_CSR_DLYBCT (1 ));
56
66
}
57
67
58
68
void SPIClass::setClockDivider (uint8_t _pin, uint8_t _divider) {
59
- uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL (_pin);
60
- divider[_channel ] = _divider;
69
+ uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL (_pin);
70
+ divider[ch ] = _divider;
61
71
// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
62
72
// transfer. Some device needs that for working properly.
63
- // SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]) | SPI_CSR_DLYBCT(1));
64
- SPI_ConfigureNPCS (spi, _channel, mode[_channel] | SPI_CSR_SCBR (divider[_channel]) | SPI_CSR_DLYBCT (10 ) | (32 <<16 ));
73
+ SPI_ConfigureNPCS (spi, ch, mode[ch] | SPI_CSR_SCBR (divider[ch]) | SPI_CSR_DLYBCT (1 ));
65
74
}
66
75
67
76
byte SPIClass::transfer (byte _pin, uint8_t _data, SPITransferMode _mode) {
68
- uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL (_pin);
69
- uint32_t d = _data | SPI_PCS (_channel);
77
+ uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL (_pin);
78
+ // Reverse bit order
79
+ if (bitOrder[ch] == LSBFIRST)
80
+ _data = __REV (__RBIT (_data));
81
+ uint32_t d = _data | SPI_PCS (ch);
70
82
if (_mode == SPI_LAST)
71
83
d |= SPI_TDR_LASTXFER;
72
84
@@ -79,6 +91,9 @@ byte SPIClass::transfer(byte _pin, uint8_t _data, SPITransferMode _mode) {
79
91
while ((spi->SPI_SR & SPI_SR_RDRF) == 0 )
80
92
;
81
93
d = spi->SPI_RDR ;
94
+ // Reverse bit order
95
+ if (bitOrder[ch] == LSBFIRST)
96
+ d = __REV (__RBIT (d));
82
97
return d & 0xFF ;
83
98
}
84
99
0 commit comments