Skip to content

Commit 932a8fd

Browse files
committed
SPI: added setBitOrder support; added end(pin) method.
1 parent 0d73715 commit 932a8fd

File tree

3 files changed

+43
-22
lines changed

3 files changed

+43
-22
lines changed

cores/arduino/wiring_constants.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ extern "C"{
4242
#define SERIAL 0x0
4343
#define DISPLAY 0x1
4444

45-
#define LSBFIRST 0
46-
#define MSBFIRST 1
45+
enum BitOrder {
46+
LSBFIRST = 0,
47+
MSBFIRST = 1
48+
};
4749

4850
#define CHANGE 1
4951
#define FALLING 2

libraries/SPI/SPI.cpp

+29-14
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ void SPIClass::begin() {
2525
// Default speed set to 4Mhz
2626
setClockDivider(BOARD_SPI_DEFAULT_SS, 21);
2727
setDataMode(BOARD_SPI_DEFAULT_SS, SPI_MODE0);
28+
setBitOrder(BOARD_SPI_DEFAULT_SS, MSBFIRST);
2829
}
2930

3031
void SPIClass::begin(uint8_t _pin) {
@@ -34,39 +35,50 @@ void SPIClass::begin(uint8_t _pin) {
3435
g_APinDescription[spiPin].ulPinType,
3536
g_APinDescription[spiPin].ulPin,
3637
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);
3941
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);
4049
}
4150

4251
void SPIClass::end() {
4352
SPI_Disable(spi);
4453
}
4554

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+
}
4959

5060
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;
5363
// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
5464
// 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));
5666
}
5767

5868
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;
6171
// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
6272
// 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));
6574
}
6675

6776
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);
7082
if (_mode == SPI_LAST)
7183
d |= SPI_TDR_LASTXFER;
7284

@@ -79,6 +91,9 @@ byte SPIClass::transfer(byte _pin, uint8_t _data, SPITransferMode _mode) {
7991
while ((spi->SPI_SR & SPI_SR_RDRF) == 0)
8092
;
8193
d = spi->SPI_RDR;
94+
// Reverse bit order
95+
if (bitOrder[ch] == LSBFIRST)
96+
d = __REV(__RBIT(d));
8297
return d & 0xFF;
8398
}
8499

libraries/SPI/SPI.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,27 @@ class SPIClass {
3636
void attachInterrupt(void);
3737
void detachInterrupt(void);
3838

39-
void begin(uint8_t _channel);
4039
void begin(void);
4140
void end(void);
4241

42+
// Attach/Detach pin to/from SPI controller
43+
void begin(uint8_t _pin);
44+
void end(uint8_t _pin);
45+
4346
// These methods sets a parameter on a single pin
44-
//void setBitOrder(uint8_t _channel, uint8_t);
45-
void setDataMode(uint8_t _channel, uint8_t);
46-
void setClockDivider(uint8_t _channel, uint8_t);
47+
void setBitOrder(uint8_t _pin, BitOrder);
48+
void setDataMode(uint8_t _pin, uint8_t);
49+
void setClockDivider(uint8_t _pin, uint8_t);
4750

48-
// These methods sets the same parameters but on default pin PIN_SPI_SS_DEFAULT
49-
//void setBitOrder(uint8_t _order) { setBitOrder(PIN_SPI_SS_DEFAULT, _order); };
51+
// These methods sets the same parameters but on default pin BOARD_SPI_DEFAULT_SS
52+
void setBitOrder(BitOrder _order) { setBitOrder(BOARD_SPI_DEFAULT_SS, _order); };
5053
void setDataMode(uint8_t _mode) { setDataMode(BOARD_SPI_DEFAULT_SS, _mode); };
5154
void setClockDivider(uint8_t _div) { setClockDivider(BOARD_SPI_DEFAULT_SS, _div); };
5255

5356
private:
5457
Spi *spi;
5558
uint32_t id;
59+
BitOrder bitOrder[SPI_CHANNELS_NUM];
5660
uint32_t divider[SPI_CHANNELS_NUM];
5761
uint32_t mode[SPI_CHANNELS_NUM];
5862
void (*initCb)(void);

0 commit comments

Comments
 (0)