This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new b628aec268f arch/arm/rp23xx: spi unset peripheral before to modify Spi parameters b628aec268f is described below commit b628aec268f61797242964bd41ef22d7f006b1d1 Author: paolo <paolo.vo...@gmail.com> AuthorDate: Fri Jul 11 10:34:53 2025 +0200 arch/arm/rp23xx: spi unset peripheral before to modify Spi parameters As done by Pico Sdk is better to unset SSPCR1.SSE bit before to modify Spi parameters (Mode, Frequency as Bits) --- arch/arm/src/rp23xx/rp23xx_spi.c | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/arch/arm/src/rp23xx/rp23xx_spi.c b/arch/arm/src/rp23xx/rp23xx_spi.c index f1c78de9586..14f89775d36 100644 --- a/arch/arm/src/rp23xx/rp23xx_spi.c +++ b/arch/arm/src/rp23xx/rp23xx_spi.c @@ -127,6 +127,8 @@ static void spi_dmarecvblock(struct spi_dev_s *dev, /* SPI methods */ static int spi_lock(struct spi_dev_s *dev, bool lock); +static void spi_enable_ssp(struct spi_dev_s *dev); +static void spi_disable_ssp(struct spi_dev_s *dev); static uint32_t spi_setfrequency(struct spi_dev_s *dev, uint32_t frequency); static void spi_setmode(struct spi_dev_s *dev, enum spi_mode_e mode); @@ -136,6 +138,7 @@ static void unused_code spi_exchange(struct spi_dev_s *dev, const void *txbuffer, void *rxbuffer, size_t nwords); + #ifndef CONFIG_SPI_EXCHANGE static void spi_sndblock(struct spi_dev_s *dev, const void *buffer, size_t nwords); @@ -340,6 +343,50 @@ static int spi_lock(struct spi_dev_s *dev, bool lock) } } +/**************************************************************************** + * Name: spi_enable_ssp + * + * Description: + * Enable Spi PrimeCell SSP peripheral. + * + * Input Parameters: + * dev - Device-specific state data + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void spi_enable_ssp(struct spi_dev_s *dev) +{ + struct rp23xx_spidev_s *priv = (struct rp23xx_spidev_s *)dev; + uint32_t regval = spi_getreg(priv, RP23XX_SPI_SSPCR1_OFFSET); + regval |= RP23XX_SPI_SSPCR1_SSE; + spi_putreg(priv, RP23XX_SPI_SSPCR1_OFFSET, regval); +} + +/**************************************************************************** + * Name: spi_disable_ssp + * + * Description: + * Disable Spi PrimeCell SSP peripheral. + * + * Input Parameters: + * dev - Device-specific state data + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void spi_disable_ssp(struct spi_dev_s *dev) +{ + struct rp23xx_spidev_s *priv = (struct rp23xx_spidev_s *)dev; + uint32_t regval = spi_getreg(priv, RP23XX_SPI_SSPCR1_OFFSET); + regval &= ~RP23XX_SPI_SSPCR1_SSE; + spi_putreg(priv, RP23XX_SPI_SSPCR1_OFFSET, regval); +} + /**************************************************************************** * Name: spi_setfrequency * @@ -382,6 +429,10 @@ static uint32_t spi_setfrequency(struct spi_dev_s *dev, divisor = (divisor + 1) & ~1; + /* Disable Spi PrimeCell SSP peripheral */ + + spi_disable_ssp(dev); + /* Save the new divisor value */ spi_putreg(priv, RP23XX_SPI_SSPCPSR_OFFSET, divisor); @@ -395,6 +446,10 @@ static uint32_t spi_setfrequency(struct spi_dev_s *dev, priv->frequency = frequency; priv->actual = actual; + /* Enable Spi PrimeCell SSP peripheral */ + + spi_enable_ssp(dev); + spiinfo("Frequency %" PRId32 "->%" PRId32 "\n", frequency, actual); return actual; } @@ -425,6 +480,10 @@ static void spi_setmode(struct spi_dev_s *dev, enum spi_mode_e mode) { /* Yes... Set CR0 appropriately */ + /* Disable Spi PrimeCell SSP peripheral */ + + spi_disable_ssp(dev); + regval = spi_getreg(priv, RP23XX_SPI_SSPCR0_OFFSET); regval &= ~(RP23XX_SPI_SSPCR0_SPO | RP23XX_SPI_SSPCR0_SPH); @@ -454,6 +513,10 @@ static void spi_setmode(struct spi_dev_s *dev, enum spi_mode_e mode) spi_putreg(priv, RP23XX_SPI_SSPCR0_OFFSET, regval); + /* Enable Spi PrimeCell SSP peripheral */ + + spi_enable_ssp(dev); + /* Save the mode so that subsequent re-configurations will be faster */ priv->mode = mode; @@ -488,11 +551,19 @@ static void spi_setbits(struct spi_dev_s *dev, int nbits) { /* Yes... Set CR0 appropriately */ + /* Disable Spi PrimeCell SSP peripheral */ + + spi_disable_ssp(dev); + regval = spi_getreg(priv, RP23XX_SPI_SSPCR0_OFFSET); regval &= ~RP23XX_SPI_SSPCR0_DSS_MASK; regval |= ((nbits - 1) << RP23XX_SPI_SSPCR0_DSS_SHIFT); spi_putreg(priv, RP23XX_SPI_SSPCR0_OFFSET, regval); + /* Enable Spi PrimeCell SSP peripheral */ + + spi_enable_ssp(dev); + /* Save the selection so that re-configurations will be faster */