You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/05/26 19:18:38 UTC

[nuttx] branch master updated: drivers/can/mcp2515.c Fix Configure Spi Bus on every bus lock

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang 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 ecaa62010a drivers/can/mcp2515.c Fix Configure Spi Bus on every bus lock
ecaa62010a is described below

commit ecaa62010a5f648f1df60ea19d89a9898b8b0da9
Author: paolovolpi <pa...@gmail.com>
AuthorDate: Fri May 26 14:20:53 2023 +0200

    drivers/can/mcp2515.c Fix Configure Spi Bus on every bus lock
---
 drivers/can/mcp2515.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c
index 82e05132cb..8642eddc90 100644
--- a/drivers/can/mcp2515.c
+++ b/drivers/can/mcp2515.c
@@ -226,6 +226,8 @@ struct mcp2515_can_s
 
 /* MCP2515 Register access */
 
+static void mcp2515_config_spi(FAR struct mcp2515_can_s *priv);
+
 static void mcp2515_readregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
               FAR uint8_t *buffer, uint8_t len);
 static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv,
@@ -302,6 +304,16 @@ static const struct can_ops_s g_mcp2515ops =
  * Private Functions
  ****************************************************************************/
 
+static void mcp2515_config_spi(FAR struct mcp2515_can_s *priv)
+{
+  /* Setup SPI frequency and mode */
+
+  SPI_SETFREQUENCY(priv->config->spi, CONFIG_MCP2515_SPI_SCK_FREQUENCY);
+  SPI_SETMODE(priv->config->spi, MCP2515_SPI_MODE);
+  SPI_SETBITS(priv->config->spi, 8);
+  SPI_HWFEATURES(priv->config->spi, 0);
+}
+
 static void mcp2515_read_2regs(FAR struct mcp2515_can_s *priv, uint8_t reg,
                                FAR uint8_t *v1, FAR uint8_t *v2)
 {
@@ -309,6 +321,7 @@ static void mcp2515_read_2regs(FAR struct mcp2515_can_s *priv, uint8_t reg,
   priv->spi_txbuf[1] = reg;
 
   SPI_LOCK(priv->config->spi, true);
+  mcp2515_config_spi(priv);
   SPI_SELECT(priv->config->spi, SPIDEV_CANBUS(0), true);
   SPI_EXCHANGE(priv->config->spi, priv->spi_txbuf, priv->spi_rxbuf, 4);
   SPI_SELECT(priv->config->spi, SPIDEV_CANBUS(0), false);
@@ -342,6 +355,8 @@ static void mcp2515_readregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
 
   SPI_LOCK(config->spi, true);
 
+  mcp2515_config_spi(priv);
+
   /* Select the MCP2515 */
 
   SPI_SELECT(config->spi, SPIDEV_CANBUS(0), true);
@@ -377,6 +392,8 @@ static void mcp2515_transfer(FAR struct mcp2515_can_s *priv, uint8_t len)
 
   SPI_LOCK(config->spi, true);
 
+  mcp2515_config_spi(priv);
+
   /* Select the MCP2515 */
 
   SPI_SELECT(config->spi, SPIDEV_CANBUS(0), true);
@@ -426,6 +443,8 @@ static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv,
 
   SPI_LOCK(config->spi, true);
 
+  mcp2515_config_spi(priv);
+
   /* Select the MCP2515 */
 
   SPI_SELECT(config->spi, SPIDEV_CANBUS(0), true);
@@ -475,6 +494,8 @@ static void mcp2515_modifyreg(FAR struct mcp2515_can_s *priv,
 
   SPI_LOCK(config->spi, true);
 
+  mcp2515_config_spi(priv);
+
   /* Select the MCP2515 */
 
   SPI_SELECT(config->spi, SPIDEV_CANBUS(0), true);
@@ -2499,13 +2520,6 @@ FAR struct mcp2515_can_s *
       return NULL;
     }
 
-  /* Setup SPI frequency and mode */
-
-  SPI_SETFREQUENCY(config->spi, CONFIG_MCP2515_SPI_SCK_FREQUENCY);
-  SPI_SETMODE(config->spi, MCP2515_SPI_MODE);
-  SPI_SETBITS(config->spi, 8);
-  SPI_HWFEATURES(config->spi, 0);
-
   /* Perform one time data initialization */
 
   memset(priv, 0, sizeof(struct mcp2515_can_s));