Skip to content

Commit f87b4ad

Browse files
committed
additional function updateSettings() to replace the call to begin().
removes unwanted glitches before getting SCK active caused by setting parameters after begin().
1 parent 37fbb64 commit f87b4ad

1 file changed

Lines changed: 18 additions & 17 deletions

File tree

STM32F1/libraries/SPI/src/SPI.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,19 @@ SPIClass::SPIClass(uint32 spi_num) {
141141
/*
142142
* Set up/tear down
143143
*/
144+
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);
146+
#ifdef SPI_DEBUG
147+
Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
148+
#endif
149+
spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags);
150+
}
144151

145152
void SPIClass::begin(void) {
146153

147-
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS);
148154
spi_init(_currentSetting->spi_d);
149155
configure_gpios(_currentSetting->spi_d, 1);
150-
#ifdef SPI_DEBUG
151-
Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
152-
#endif
153-
spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags);
156+
updateSettings();
154157
}
155158

156159
void SPIClass::beginSlave(void) {
@@ -192,7 +195,7 @@ void SPIClass::setClockDivider(uint32_t clockDivider)
192195
Serial.print("Clock divider set to "); Serial.println(clockDivider);
193196
#endif
194197
_currentSetting->clockDivider = clockDivider;
195-
this->begin();
198+
updateSettings();
196199
}
197200

198201
void SPIClass::setBitOrder(BitOrder bitOrder)
@@ -201,7 +204,7 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
201204
Serial.print("Bit order set to "); Serial.println(bitOrder);
202205
#endif
203206
_currentSetting->bitOrder = bitOrder;
204-
this->begin();
207+
updateSettings();
205208
}
206209

207210
/* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly.
@@ -250,8 +253,8 @@ If someone finds this is not the case or sees a logic error with this let me kno
250253
Serial.print("Data mode set to "); Serial.println(dataMode);
251254
#endif
252255
_currentSetting->dataMode = dataMode;
253-
this->begin();
254-
}
256+
updateSettings();
257+
}
255258

256259

257260
void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
@@ -266,7 +269,6 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
266269
setDataMode(settings.dataMode);
267270
setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock));
268271
begin();
269-
270272
}
271273

272274
void SPIClass::endTransaction(void)
@@ -322,11 +324,7 @@ void SPIClass::write(uint16 data) {
322324

323325
spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)."
324326
while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..."
325-
while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."
326-
// taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection
327-
if (spi_is_rx_nonempty(_currentSetting->spi_d)) {
328-
uint8_t b = spi_rx_reg(_currentSetting->spi_d);
329-
}
327+
while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."
330328
}
331329

332330
//void SPIClass::write(uint8 byte) {
@@ -350,13 +348,16 @@ void SPIClass::write(const uint8 *data, uint32 length) {
350348
}
351349
while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..."
352350
while (spi_is_busy(_currentSetting->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete."
351+
- // taken from SdSpiSTM32F1.cpp - Victor's lib, and adapted to support device selection
352+
- if (spi_is_rx_nonempty(_currentSetting->spi_d)) {
353+
- uint8_t b = spi_rx_reg(_currentSetting->spi_d);
354+
- }
353355
}
354356

355357
uint8 SPIClass::transfer(uint8 byte) const {
356-
uint8 b;
357358
spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)."
358359
while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..."
359-
b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data."
360+
uint8 b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data."
360361
while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..."
361362
while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."
362363
return b;

0 commit comments

Comments
 (0)