Skip to content

Commit 4932a30

Browse files
committed
reworked update SPI settings
remove entirely the disturbing glitches on SCK line
1 parent 197844d commit 4932a30

2 files changed

Lines changed: 15 additions & 12 deletions

File tree

STM32F1/cores/maple/libmaple/spi.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ void spi_master_enable(spi_dev *dev,
6868
spi_reconfigure(dev, baud | flags | SPI_CR1_MSTR | mode);
6969
}
7070

71+
7172
/**
7273
* @brief Configure and enable a SPI device as a bus slave.
7374
*
@@ -157,8 +158,9 @@ void spi_rx_dma_disable(spi_dev *dev) {
157158
*/
158159

159160
static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) {
160-
spi_irq_disable(dev, SPI_INTERRUPTS_ALL);
161-
spi_peripheral_disable(dev);
162-
dev->regs->CR1 = cr1_config;
163-
spi_peripheral_enable(dev);
161+
#define MASK (SPI_CR1_CRCEN|SPI_CR1_DFF)
162+
spi_irq_disable(dev, SPI_INTERRUPTS_ALL);
163+
if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev);
164+
dev->regs->CR1 = cr1_config;
165+
spi_peripheral_enable(dev);
164166
}

STM32F1/libraries/SPI/src/SPI.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ void SPIClass::setClockDivider(uint32_t clockDivider)
195195
Serial.print("Clock divider set to "); Serial.println(clockDivider);
196196
#endif
197197
_currentSetting->clockDivider = clockDivider;
198-
updateSettings();
198+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR);
199+
_currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR);
199200
}
200201

201202
void SPIClass::setBitOrder(BitOrder bitOrder)
@@ -204,7 +205,9 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
204205
Serial.print("Bit order set to "); Serial.println(bitOrder);
205206
#endif
206207
_currentSetting->bitOrder = bitOrder;
207-
updateSettings();
208+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST);
209+
if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST;
210+
_currentSetting->spi_d->regs->CR1 = cr1;
208211
}
209212

210213
/* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly.
@@ -213,11 +216,8 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
213216
*/
214217
void SPIClass::setDataSize(uint32 datasize)
215218
{
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;
219+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF);
220+
_currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF);
221221
}
222222

223223
void SPIClass::setDataMode(uint8_t dataMode)
@@ -253,7 +253,8 @@ If someone finds this is not the case or sees a logic error with this let me kno
253253
Serial.print("Data mode set to "); Serial.println(dataMode);
254254
#endif
255255
_currentSetting->dataMode = dataMode;
256-
updateSettings();
256+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA);
257+
_currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA));
257258
}
258259

259260

0 commit comments

Comments
 (0)