SPIv1 fixes.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15837 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-11-15 10:43:12 +00:00
parent 81475ef61e
commit 08130c4c1c
1 changed files with 17 additions and 26 deletions

View File

@ -121,18 +121,25 @@ SPIDriver SPID6;
/*===========================================================================*/
static void spi_lld_configure(SPIDriver *spip) {
uint32_t cr1, cr2;
/* Disabling SPI during (re)configuration.*/
spip->spi->CR1 = 0U;
/* Common CR1 and CR2 options.*/
cr1 = spip->config->cr1 & ~(SPI_CR1_MSTR | SPI_CR1_SPE);
cr2 = spip->config->cr2 | SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN;
/* SPI setup.*/
if (spip->config->slave) {
spip->spi->CR1 = spip->config->cr1 & ~(SPI_CR1_MSTR | SPI_CR1_SPE);
spip->spi->CR2 = spip->config->cr2 |
SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN;
}
else {
spip->spi->CR1 = (spip->config->cr1 | SPI_CR1_MSTR) & ~SPI_CR1_SPE;
spip->spi->CR2 = spip->config->cr2 | SPI_CR2_SSOE |
SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN;
if (spip->config->slave == false) {
cr1 |= SPI_CR1_MSTR;
cr2 |= SPI_CR2_SSOE;
}
/* New configuration.*/
spip->spi->CR2 = cr2;
spip->spi->CR1 = cr1;
spip->spi->CR1 = cr1 | SPI_CR1_SPE;
}
/**
@ -727,8 +734,6 @@ msg_t spi_lld_ignore(SPIDriver *spip, size_t n) {
dmaStreamEnable(spip->dmarx);
dmaStreamEnable(spip->dmatx);
spip->spi->CR1 |= SPI_CR1_SPE;
return HAL_RET_SUCCESS;
}
@ -764,8 +769,6 @@ msg_t spi_lld_exchange(SPIDriver *spip, size_t n,
dmaStreamEnable(spip->dmarx);
dmaStreamEnable(spip->dmatx);
spip->spi->CR1 |= SPI_CR1_SPE;
return HAL_RET_SUCCESS;
}
@ -798,8 +801,6 @@ msg_t spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
dmaStreamEnable(spip->dmarx);
dmaStreamEnable(spip->dmatx);
spip->spi->CR1 |= SPI_CR1_SPE;
return HAL_RET_SUCCESS;
}
@ -832,8 +833,6 @@ msg_t spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
dmaStreamEnable(spip->dmarx);
dmaStreamEnable(spip->dmatx);
spip->spi->CR1 |= SPI_CR1_SPE;
return HAL_RET_SUCCESS;
}
@ -874,18 +873,10 @@ msg_t spi_lld_stop_transfer(SPIDriver *spip, size_t *sizep) {
*/
uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) {
/* Enabling SPI for the exchange.*/
spip->spi->CR1 |= SPI_CR1_SPE;
spip->spi->DR = frame;
while ((spip->spi->SR & SPI_SR_RXNE) == 0U)
;
frame = spip->spi->DR;
/* Disabling SPI and done.*/
spip->spi->CR1 &= ~SPI_CR1_SPE;
return frame;
return spip->spi->DR;
}
#endif /* HAL_USE_SPI */