@@ -142,28 +142,23 @@ SPIClass::SPIClass(uint32 spi_num) {
142142 * Set up/tear down
143143 */
144144void 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
152152void SPIClass::begin (void ) {
153-
154153 spi_init (_currentSetting->spi_d );
155154 configure_gpios (_currentSetting->spi_d , 1 );
156155 updateSettings ();
157156}
158157
159158void SPIClass::beginSlave (void ) {
160- if (_currentSetting->dataMode >= 4 ) {
161- ASSERT (0 );
162- return ;
163- }
164- uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE);
165159 spi_init (_currentSetting->spi_d );
166160 configure_gpios (_currentSetting->spi_d , 0 );
161+ uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE);
167162 #ifdef SPI_DEBUG
168163 Serial.print (" spi_slave_enable(" ); Serial.print (_currentSetting->dataMode ); Serial.print (" ," ); Serial.print (flags); Serial.println (" )" );
169164 #endif
@@ -195,7 +190,8 @@ void SPIClass::setClockDivider(uint32_t clockDivider)
195190 Serial.print (" Clock divider set to " ); Serial.println (clockDivider);
196191 #endif
197192 _currentSetting->clockDivider = clockDivider;
198- updateSettings ();
193+ uint32 cr1 = _currentSetting->spi_d ->regs ->CR1 & ~(SPI_CR1_BR);
194+ _currentSetting->spi_d ->regs ->CR1 = cr1 | (clockDivider & SPI_CR1_BR);
199195}
200196
201197void SPIClass::setBitOrder (BitOrder bitOrder)
@@ -204,7 +200,9 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
204200 Serial.print (" Bit order set to " ); Serial.println (bitOrder);
205201 #endif
206202 _currentSetting->bitOrder = bitOrder;
207- updateSettings ();
203+ uint32 cr1 = _currentSetting->spi_d ->regs ->CR1 & ~(SPI_CR1_LSBFIRST);
204+ if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST;
205+ _currentSetting->spi_d ->regs ->CR1 = cr1;
208206}
209207
210208/* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly.
@@ -213,11 +211,9 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
213211*/
214212void SPIClass::setDataSize (uint32 datasize)
215213{
216- uint32 cr1 = _currentSetting->spi_d ->regs ->CR1 ;
217- datasize &= SPI_CR1_DFF;
218- cr1 &= ~(SPI_CR1_DFF);
219- cr1 |= datasize;
220- _currentSetting->spi_d ->regs ->CR1 = cr1;
214+ _currentSetting->dataSize = datasize;
215+ uint32 cr1 = _currentSetting->spi_d ->regs ->CR1 & ~(SPI_CR1_DFF);
216+ _currentSetting->spi_d ->regs ->CR1 = cr1 | (datasize & SPI_CR1_DFF);
221217}
222218
223219void SPIClass::setDataMode (uint8_t dataMode)
@@ -236,13 +232,11 @@ SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge
236232On the STM32 it appears to be
237233
238234bit 1 - CPOL : Clock polarity
239-
240235 (This bit should not be changed when communication is ongoing)
241236 0 : CLK to 0 when idle
242237 1 : CLK to 1 when idle
243238
244239bit 0 - CPHA : Clock phase
245-
246240 (This bit should not be changed when communication is ongoing)
247241 0 : The first clock transition is the first data capture edge
248242 1 : The second clock transition is the first data capture edge
@@ -253,10 +247,10 @@ If someone finds this is not the case or sees a logic error with this let me kno
253247 Serial.print (" Data mode set to " ); Serial.println (dataMode);
254248 #endif
255249 _currentSetting->dataMode = dataMode;
256- updateSettings ();
250+ uint32 cr1 = _currentSetting->spi_d ->regs ->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA);
251+ _currentSetting->spi_d ->regs ->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA));
257252}
258253
259-
260254void SPIClass::beginTransaction (uint8_t pin, SPISettings settings)
261255{
262256 #ifdef SPI_DEBUG
@@ -267,10 +261,22 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
267261 // digitalWrite(_SSPin,LOW);
268262 setBitOrder (settings.bitOrder );
269263 setDataMode (settings.dataMode );
264+ setDataSize (settings.dataSize );
270265 setClockDivider (determine_baud_rate (_currentSetting->spi_d , settings.clock ));
271266 begin ();
272267}
273268
269+ void SPIClass::beginTransactionSlave (SPISettings settings)
270+ {
271+ #ifdef SPI_DEBUG
272+ Serial.println (F (" SPIClass::beginTransactionSlave" ));
273+ #endif
274+ setBitOrder (settings.bitOrder );
275+ setDataMode (settings.dataMode );
276+ setDataSize (settings.dataSize );
277+ beginSlave ();
278+ }
279+
274280void SPIClass::endTransaction (void )
275281{
276282 #ifdef SPI_DEBUG
@@ -354,6 +360,15 @@ void SPIClass::write(const uint8 *data, uint32 length) {
354360 }
355361}
356362
363+ uint16_t SPIClass::transfer16 (uint16_t wr_data) const {
364+ spi_tx_reg (_currentSetting->spi_d , wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)."
365+ while (spi_is_rx_nonempty (_currentSetting->spi_d ) == 0 ); // "4. Wait until RXNE=1 ..."
366+ uint16_t rd_data = spi_rx_reg (_currentSetting->spi_d ); // "... and read the last received data."
367+ // while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..."
368+ // while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."
369+ return rd_data;
370+ }
371+
357372uint8 SPIClass::transfer (uint8 byte) const {
358373 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)."
359374 while (spi_is_rx_nonempty (_currentSetting->spi_d ) == 0 ); // "4. Wait until RXNE=1 ..."
0 commit comments