Skip to content

Commit 9fe188a

Browse files
committed
added SPI data size management to allow true 16 bit transfer
1 parent 9679eaa commit 9fe188a

2 files changed

Lines changed: 22 additions & 9 deletions

File tree

STM32F1/libraries/SPI/src/SPI.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,14 @@ SPIClass::SPIClass(uint32 spi_num) {
142142
* Set up/tear down
143143
*/
144144
void SPIClass::updateSettings(void) {
145-
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS);
145+
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS);
146146
#ifdef SPI_DEBUG
147147
Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
148148
#endif
149149
spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags);
150150
}
151151

152152
void SPIClass::begin(void) {
153-
154153
spi_init(_currentSetting->spi_d);
155154
configure_gpios(_currentSetting->spi_d, 1);
156155
updateSettings();
@@ -161,7 +160,7 @@ void SPIClass::beginSlave(void) {
161160
ASSERT(0);
162161
return;
163162
}
164-
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE);
163+
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE);
165164
spi_init(_currentSetting->spi_d);
166165
configure_gpios(_currentSetting->spi_d, 0);
167166
#ifdef SPI_DEBUG
@@ -216,6 +215,7 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
216215
*/
217216
void SPIClass::setDataSize(uint32 datasize)
218217
{
218+
_currentSetting->dataSize = datasize;
219219
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF);
220220
_currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF);
221221
}
@@ -268,6 +268,7 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
268268
//digitalWrite(_SSPin,LOW);
269269
setBitOrder(settings.bitOrder);
270270
setDataMode(settings.dataMode);
271+
setDataSize(settings.dataSize);
271272
setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock));
272273
begin();
273274
}

STM32F1/libraries/SPI/src/SPI.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,28 +96,40 @@
9696
#define SPI_MODE2 SPI_MODE_2
9797
#define SPI_MODE3 SPI_MODE_3
9898

99+
#define DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT
100+
#define DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT
101+
99102
class SPISettings {
100103
public:
101104
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
102105
if (__builtin_constant_p(clock)) {
103-
init_AlwaysInline(clock, bitOrder, dataMode);
106+
init_AlwaysInline(clock, bitOrder, dataMode, DATA_SIZE_8BIT);
107+
} else {
108+
init_MightInline(clock, bitOrder, dataMode, DATA_SIZE_8BIT);
109+
}
110+
}
111+
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) {
112+
if (__builtin_constant_p(clock)) {
113+
init_AlwaysInline(clock, bitOrder, dataMode, dataSize);
104114
} else {
105-
init_MightInline(clock, bitOrder, dataMode);
115+
init_MightInline(clock, bitOrder, dataMode, dataSize);
106116
}
107117
}
108-
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
118+
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); }
109119
private:
110-
void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
111-
init_AlwaysInline(clock, bitOrder, dataMode);
120+
void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) {
121+
init_AlwaysInline(clock, bitOrder, dataMode, dataSize);
112122
}
113-
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) {
123+
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) __attribute__((__always_inline__)) {
114124
this->clock = clock;
115125
this->bitOrder = bitOrder;
116126
this->dataMode = dataMode;
127+
this->dataSize = dataSize;
117128
}
118129
uint32_t clock;
119130
BitOrder bitOrder;
120131
uint8_t dataMode;
132+
uint32_t dataSize;
121133

122134
spi_dev *spi_d;
123135
uint8_t _SSPin;

0 commit comments

Comments
 (0)