From 24fe2130d7699cf4eb123354363fd6f80fc6afbe Mon Sep 17 00:00:00 2001 From: Alexander Krutwig Date: Mon, 17 Oct 2016 14:36:49 +0200 Subject: 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 a7cf5834d4..c742e83337 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 3f44a4e1f1..86950aecab 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; -- cgit v1.2.3