From 4a48136e9c6d55ff9d9427a91ef43d44d26333d7 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Wed, 14 Feb 2018 16:53:49 +0100 Subject: spi, can and general improvements SPI: -move to single transfer read -clear interrupt register on read -perform multibyte read transfers with DMA -make frame format consistant CAN: -move from mailbox to CAN FIFO -implement buffering -support for reading multiple frames per transfer General: -use PLL at 100MHz -remove debug task -do not compile release with debug console enabled -bumped version to 0.13 Signed-off-by: Dominik Sliwa --- drivers/fsl_dspi.c | 54 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 18 deletions(-) (limited to 'drivers/fsl_dspi.c') diff --git a/drivers/fsl_dspi.c b/drivers/fsl_dspi.c index dcd93aa..0da640a 100644 --- a/drivers/fsl_dspi.c +++ b/drivers/fsl_dspi.c @@ -1248,9 +1248,9 @@ status_t DSPI_SlaveTransferNonBlocking(SPI_Type *base, dspi_slave_handle_t *hand handle->errorCount = 0; - uint8_t whichCtar = (transfer->configFlags & DSPI_SLAVE_CTAR_MASK) >> DSPI_SLAVE_CTAR_SHIFT; - handle->bitsPerFrame = - (((base->CTAR_SLAVE[whichCtar]) & SPI_CTAR_SLAVE_FMSZ_MASK) >> SPI_CTAR_SLAVE_FMSZ_SHIFT) + 1; + //uint8_t whichCtar = (transfer->configFlags & DSPI_SLAVE_CTAR_MASK) >> DSPI_SLAVE_CTAR_SHIFT; + handle->bitsPerFrame = 8; + //(((base->CTAR_SLAVE[whichCtar]) & SPI_CTAR_SLAVE_FMSZ_MASK) >> SPI_CTAR_SLAVE_FMSZ_SHIFT) + 1; DSPI_StopTransfer(base); @@ -1316,9 +1316,11 @@ static void DSPI_SlaveTransferFillUpTxFifo(SPI_Type *base, dspi_slave_handle_t * /* Transmit data */ if (handle->remainingSendByteCount > 0) { +#if 0 /* Have data to transmit, update the transmit data and push to FIFO */ if (handle->bitsPerFrame <= 8) { +#endif /* bits/frame is 1 byte */ if (handle->txData) { @@ -1333,6 +1335,7 @@ static void DSPI_SlaveTransferFillUpTxFifo(SPI_Type *base, dspi_slave_handle_t * /* Decrease remaining dataSize */ --handle->remainingSendByteCount; +#if 0 } /* bits/frame is 2 bytes */ else @@ -1375,6 +1378,7 @@ static void DSPI_SlaveTransferFillUpTxFifo(SPI_Type *base, dspi_slave_handle_t * transmitData = (uint16_t)((uint16_t)(dummyPattern) << 8) | dummyPattern; } } +#endif } else { @@ -1440,8 +1444,7 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) { assert(handle); - uint8_t dummyPattern = DSPI_DUMMY_DATA; - uint32_t dataReceived; + volatile uint32_t dataReceived; uint32_t dataSend = 0; /* Because SPI protocol is synchronous, the number of bytes that that slave received from the @@ -1462,12 +1465,15 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) DSPI_ClearStatusFlags(base, kDSPI_RxFifoDrainRequestFlag); /* If bits/frame is one byte */ +#if 0 if (handle->bitsPerFrame <= 8) { +#endif if (handle->rxData) { - if ((handle->totalByteCount - handle->remainingReceiveByteCount) == 1){ - if ( *(handle->rxData - 1) == APALIS_TK1_K20_BULK_WRITE_INST) { + if ((handle->totalByteCount - handle->remainingReceiveByteCount) == 2){ + + if ( *(handle->rxData - 2) == APALIS_TK1_K20_BULK_WRITE_INST) { handle->remainingReceiveByteCount += dataReceived; handle->totalByteCount += dataReceived; handle->remainingSendByteCount += dataReceived; @@ -1478,25 +1484,35 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) ++handle->rxData; } - /* Descrease remaining receive byte count */ + /* Decrease remaining receive byte count */ --handle->remainingReceiveByteCount; - + if (handle->remainingSendByteCount == 0){ + if ( *(handle->rxData - 2) == APALIS_TK1_K20_READ_INST) + { + base->PUSHR_SLAVE = registers[dataReceived]; + } + else + { + base->PUSHR_SLAVE = 0x55; + } + } if (handle->remainingSendByteCount > 0) { - if (handle->txData) - { - dataSend = *handle->txData; - ++handle->txData; - } - else - { - dataSend = dummyPattern; - } + if (handle->txData) + { + dataSend = *handle->txData; + ++handle->txData; + } + else + { + dataSend = dataReceived; + } --handle->remainingSendByteCount; /* Write the data to the DSPI data register */ base->PUSHR_SLAVE = dataSend; } +#if 0 } else /* If bits/frame is 2 bytes */ { @@ -1572,6 +1588,7 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) base->PUSHR_SLAVE = dataSend; } } +#endif /* Try to clear TFFF by writing a one to it; it will not clear if TX FIFO not full */ DSPI_ClearStatusFlags(base, kDSPI_TxFifoFillRequestFlag); @@ -1585,6 +1602,7 @@ void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle) if ((handle->remainingReceiveByteCount == 0) || (handle->state == kDSPI_Error)) { /* Other cases, stop the transfer. */ + dataReceived = base->POPR; DSPI_SlaveTransferComplete(base, handle); return; } -- cgit v1.2.3