The main change is that SPI is started at the end of the spibus
initialization, so the SPI is not switched on and off each time
the data are to be sent. The reason is to let Kinetis chip manage
SPI communication and make timing more predictable. (Avoid on/off
delays.)

The second change is refactoring-out of writeword and readword
procedures -- send data procedure now containts the whole exchange
of a single SPI frame.
---
 arch/arm/src/kinetis/kinetis_spi.c | 92 ++++++------------------------
 1 file changed, 18 insertions(+), 74 deletions(-)

diff --git a/arch/arm/src/kinetis/kinetis_spi.c 
b/arch/arm/src/kinetis/kinetis_spi.c
index e156d8cf8c..f74a24325a 100644
--- a/arch/arm/src/kinetis/kinetis_spi.c
+++ b/arch/arm/src/kinetis/kinetis_spi.c
@@ -132,9 +132,6 @@ static inline void     spi_putreg16(struct kinetis_spidev_s 
*priv,
                                     uint8_t offset, uint16_t value);
 static inline void     spi_putreg8(struct kinetis_spidev_s *priv,
                                    uint8_t offset, uint8_t value);
-static inline uint16_t spi_readword(struct kinetis_spidev_s *priv);
-static inline void     spi_writeword(struct kinetis_spidev_s *priv,
-                                     uint16_t word);
 
 static inline void     spi_run(struct kinetis_spidev_s *priv,
                                bool enable);
@@ -569,58 +566,6 @@ static inline void spi_write_control(struct 
kinetis_spidev_s *priv,
               (uint16_t) (control >> 16));
 }
 
-/****************************************************************************
- * Name: spi_writeword
- *
- * Description:
- *   Write one 16 bit word to SPI TX FIFO
- *
- * Input Parameters:
- *   priv - Device-specific state data
- *   word - word to send
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-static inline void spi_writeword(struct kinetis_spidev_s *priv,
-                                 uint16_t word)
-{
-  /* Wait until there is space in the fifo */
-
-  spi_wait_status(priv, SPI_SR_TFFF);
-
-  /* Write the data to transmitted to the SPI Data Register */
-
-  spi_putreg16(priv, KINETIS_SPI_PUSHR_OFFSET, SPI_PUSHR_TXDATA(word));
-}
-
-/****************************************************************************
- * Name: spi_readword
- *
- * Description:
- *   Read one 16 bit word from SPI RX FIFO
- *
- * Input Parameters:
- *   priv - Device-specific state data
- *
- * Returned Value:
- *   The 8-bit value from the FIFO
- *
- ****************************************************************************/
-
-static inline uint16_t spi_readword(struct kinetis_spidev_s *priv)
-{
-  /* Wait until transfer completes and the data is in the RX FIFO */
-
-  spi_wait_status(priv, SPI_SR_RFDF | SPI_SR_TCF);
-
-  /* Return the data */
-
-  return spi_getreg16(priv, KINETIS_SPI_POPR_OFFSET);
-}
-
 /****************************************************************************
  * Name: spi_run
  *
@@ -1163,30 +1108,27 @@ static uint16_t spi_send_data(struct kinetis_spidev_s 
*priv, uint16_t wd,
 {
   uint16_t ret;
 
-  /* On first write set control word and start transfer */
+  DEBUGASSERT(spi_getreg(priv, KINETIS_SPI_SR_OFFSET) & SPI_SR_TXRXS);
 
-  if (0 == (spi_getreg(priv, KINETIS_SPI_SR_OFFSET) & SPI_SR_TXRXS))
-    {
-      spi_run(priv, true);
-      spi_write_control(priv, SPI_PUSHR_CTAS_CTAR0 | SPI_PUSHR_CTCNT);
-    }
+  /* Wait until there is space in the fifo */
 
-  spi_writeword(priv, wd);
-  ret = spi_readword(priv);
+  spi_wait_status(priv, SPI_SR_TFFF);
 
-  if (!last)
-    {
-      /* Clear the Transfer complete and the RX FIFO RDY */
+  /* Write the data to transmitted to the SPI Data Register */
 
-      spi_write_status(priv, SPI_SR_TCF | SPI_SR_RFDF);
-    }
-  else
-    {
-      /* Clear all status */
+  spi_putreg16(priv, KINETIS_SPI_PUSHR_OFFSET, SPI_PUSHR_TXDATA(wd));
 
-      spi_write_status(priv, spi_getreg(priv, KINETIS_SPI_SR_OFFSET));
-      spi_run(priv, false);
-    }
+  /* Wait until transfer completes and the data is in the RX FIFO */
+
+  spi_wait_status(priv, SPI_SR_RFDF | SPI_SR_TCF);
+
+  /* Return the data */
+
+  ret = spi_getreg16(priv, KINETIS_SPI_POPR_OFFSET);
+
+  spi_write_status(priv, SPI_SR_TCF | SPI_SR_RFDF);
+
+  spiinfo("%04x -> %04x", wd, ret);
 
   return ret;
 }
@@ -1875,6 +1817,8 @@ struct spi_dev_s *kinetis_spibus_initialize(int port)
     }
 #endif
 
+  spi_run(priv, true);
+
   return &priv->spidev;
 }
 
-- 
2.47.3

Reply via email to