[rtems commit] atsam: multiple messages on one cs low level

Sebastian Huber sebh at rtems.org
Mon Oct 17 12:49:14 UTC 2016


Module:    rtems
Branch:    master
Commit:    24fe2130d7699cf4eb123354363fd6f80fc6afbe
Changeset: http://git.rtems.org/rtems/commit/?id=24fe2130d7699cf4eb123354363fd6f80fc6afbe

Author:    Alexander Krutwig <alexander.krutwig at embedded-brains.de>
Date:      Mon Oct 17 14:36:49 2016 +0200

atsam: multiple messages on one cs low level

---

 c/src/lib/libbsp/arm/atsam/include/atsam-spi.h |  1 +
 c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c | 21 +++++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h b/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
index a7cf583..c742e83 100644
--- a/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
+++ b/c/src/lib/libbsp/arm/atsam/include/atsam-spi.h
@@ -44,6 +44,7 @@ typedef struct {
 	uint32_t dma_rx_channel;
 	bool rx_transfer_done;
 	bool tx_transfer_done;
+	bool spi_switched_on;
 } atsam_spi_bus;
 
 int spi_bus_register_atsam(
diff --git a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
index 3f44a4e..86950ae 100644
--- a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
+++ b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c
@@ -97,7 +97,6 @@ static void atsam_interrupt_handler(void *arg)
       } else {
         /* Block end interrupt for LLI dma mode */
         if (XDMAC_GetChannelIsr(xdmac, channel) & XDMAC_CIS_BIS) {
-          atsam_finish_command(spid);
         }
       }
 
@@ -110,7 +109,6 @@ static void atsam_interrupt_handler(void *arg)
       }
 
       if (bus->rx_transfer_done && bus->tx_transfer_done) {
-        atsam_finish_command(spid);
         sc = rtems_event_transient_send(bus->task_id);
         assert(sc == RTEMS_SUCCESSFUL);
       }
@@ -149,6 +147,7 @@ static void atsam_set_phase_and_polarity(uint32_t mode, uint32_t *csr)
       *csr |= SPI_CSR_CPOL;
       break;
   }
+  *csr |= SPI_CSR_CSAAT;
 }
 
 static void atsam_configure_spi(atsam_spi_bus *bus)
@@ -370,14 +369,18 @@ static uint32_t atsam_send_command(
     return SPID_ERROR_LOCK;
   }
 
-  /* Enable the SPI Peripheral */
-  PMC_EnablePeripheral(spid->spiId);
+  if(!bus->spi_switched_on){
+    /* Enable the SPI Peripheral */
+    PMC_EnablePeripheral(spid->spiId);
 
-  /* SPI chip select */
-  SPI_ChipSelect(pSpiHw, 1 << msg->cs);
+    /* SPI chip select */
+    SPI_ChipSelect(pSpiHw, 1 << msg->cs);
 
-  /* Enables the SPI to transfer and receive data. */
-  SPI_Enable (pSpiHw);
+    /* Enables the SPI to transfer and receive data. */
+    SPI_Enable (pSpiHw);
+  }
+
+  bus->spi_switched_on = true;
 
   /* Start DMA 0(RX) && 1(TX) */
   if (XDMAD_StartTransfer(spid->pXdmad, bus->dma_rx_channel)) {
@@ -453,6 +456,8 @@ static int atsam_spi_setup_transfer(atsam_spi_bus *bus)
     bus->tx_transfer_done = false;
     if (msgs[i].cs_change > 0) {
       SPI_ReleaseCS(bus->SpiDma.pSpiHw);
+      atsam_finish_command(&bus->SpiDma);
+      bus->spi_switched_on = false;
     }
   }
   return rv;




More information about the vc mailing list