@@ -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
145152void 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
156159void 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
198201void 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
257260void 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
272274void SPIClass::endTransaction (void )
@@ -346,13 +348,16 @@ void SPIClass::write(const uint8 *data, uint32 length) {
346348 }
347349 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 ..."
348350 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+ }
349355}
350356
351357uint8 SPIClass::transfer (uint8 byte) const {
352- uint8 b;
353358 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)."
354359 while (spi_is_rx_nonempty (_currentSetting->spi_d ) == 0 ); // "4. Wait until RXNE=1 ..."
355- 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."
356361 while (spi_is_tx_empty (_currentSetting->spi_d ) == 0 ); // "5. Wait until TXE=1 ..."
357362 while (spi_is_busy (_currentSetting->spi_d ) != 0 ); // "... and then wait until BSY=0 before disabling the SPI."
358363 return b;
0 commit comments