@@ -61,6 +61,7 @@ typedef struct {
6161 mxc_spi_tscontrol_t ts_control ;
6262
6363 // DMA Settings.
64+ bool dma_in_use ;
6465 mxc_dma_reva_regs_t * dma ;
6566 int tx_dma_ch ;
6667 int rx_dma_ch ;
@@ -294,6 +295,7 @@ static void MXC_SPI_RevA2_process(mxc_spi_reva_regs_t *spi)
294295
295296 // Target is done after callback (if valid) is handled.
296297 STATES [spi_num ].transaction_done = true;
298+ STATES [spi_num ].dma_in_use = false;
297299
298300 // Reset the SPI to complete the on-going transaction.
299301 // SPIn may remain busy (SPI_STAT) even after the target select input
@@ -330,6 +332,7 @@ static void MXC_SPI_RevA2_resetStateStruct(int8_t spi_num)
330332 STATES [spi_num ].ts_control = MXC_SPI_TSCONTROL_HW_AUTO ; // Default (0) state.
331333
332334 // DMA
335+ STATES [spi_num ].dma_in_use = false;
333336 STATES [spi_num ].dma = NULL ;
334337 STATES [spi_num ].tx_dma_ch = -1 ;
335338 STATES [spi_num ].rx_dma_ch = -1 ;
@@ -1090,6 +1093,7 @@ static void MXC_SPI_RevA2_transactionSetup(mxc_spi_reva_regs_t *spi, uint8_t *tx
10901093
10911094 // Initialize SPIn state to handle data.
10921095 STATES [spi_num ].transaction_done = false;
1096+ STATES [spi_num ].dma_in_use = use_dma ;
10931097
10941098 STATES [spi_num ].tx_buffer = tx_buffer ;
10951099 STATES [spi_num ].tx_count_bytes = 0 ;
@@ -1240,6 +1244,7 @@ static void MXC_SPI_RevA2_transactionSetup(mxc_spi_reva_regs_t *spi, uint8_t *tx
12401244 // does not trigger a CTZ interrupt.
12411245 if (rx_length_frames > 0 && rx_buffer != NULL ) {
12421246 STATES [spi_num ].transaction_done = true;
1247+ STATES [spi_num ].dma_in_use = false;
12431248 }
12441249
12451250 STATES [spi_num ].tx_done = true;
@@ -1378,11 +1383,6 @@ int MXC_SPI_RevA2_ControllerTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_bu
13781383
13791384 spi_num = MXC_SPI_GET_IDX ((mxc_spi_regs_t * )spi );
13801385
1381- // Make sure DMA is not initialized.
1382- if (STATES [spi_num ].dma_initialized == true) {
1383- return E_BAD_STATE ;
1384- }
1385-
13861386 // Make sure SPI Instance is in Controller mode (L. Master).
13871387 if (STATES [spi_num ].controller_target != MXC_SPI_TYPE_CONTROLLER ) {
13881388 return E_BAD_STATE ;
@@ -1406,6 +1406,7 @@ int MXC_SPI_RevA2_ControllerTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_bu
14061406 if (STATES [spi_num ].tx_done == true && STATES [spi_num ].rx_done == true) {
14071407 if (!(spi -> stat & MXC_F_SPI_REVA_STAT_BUSY )) {
14081408 STATES [spi_num ].transaction_done = true;
1409+ STATES [spi_num ].dma_in_use = false;
14091410 }
14101411 }
14111412
@@ -1424,11 +1425,6 @@ int MXC_SPI_RevA2_ControllerTransactionAsync(mxc_spi_reva_regs_t *spi, uint8_t *
14241425
14251426 spi_num = MXC_SPI_GET_IDX ((mxc_spi_regs_t * )spi );
14261427
1427- // Make sure DMA is not initialized.
1428- if (STATES [spi_num ].dma_initialized == true) {
1429- return E_BAD_STATE ;
1430- }
1431-
14321428 // Make sure SPI Instance is in Controller mode (L. Master).
14331429 if (STATES [spi_num ].controller_target != MXC_SPI_TYPE_CONTROLLER ) {
14341430 return E_BAD_STATE ;
@@ -1501,11 +1497,6 @@ int MXC_SPI_RevA2_TargetTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_buffer
15011497 // Ensure valid SPI Instance.
15021498 spi_num = MXC_SPI_GET_IDX ((mxc_spi_regs_t * )spi );
15031499
1504- // Make sure DMA is not initialized.
1505- if (STATES [spi_num ].dma_initialized == true) {
1506- return E_BAD_STATE ;
1507- }
1508-
15091500 // Make sure SPI Instance is in Target mode (L. Slave).
15101501 if (STATES [spi_num ].controller_target != MXC_SPI_TYPE_TARGET ) {
15111502 return E_BAD_STATE ;
@@ -1523,6 +1514,7 @@ int MXC_SPI_RevA2_TargetTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_buffer
15231514 if (STATES [spi_num ].tx_count_bytes == STATES [spi_num ].tx_length_bytes &&
15241515 STATES [spi_num ].rx_count_bytes == STATES [spi_num ].rx_length_bytes ) {
15251516 STATES [spi_num ].transaction_done = true;
1517+ STATES [spi_num ].dma_in_use = false;
15261518 }
15271519
15281520 MXC_SPI_RevA2_process (spi );
@@ -1543,11 +1535,6 @@ int MXC_SPI_RevA2_TargetTransactionAsync(mxc_spi_reva_regs_t *spi, uint8_t *tx_b
15431535 // Ensure valid SPI Instance.
15441536 spi_num = MXC_SPI_GET_IDX ((mxc_spi_regs_t * )spi );
15451537
1546- // Make sure DMA is not initialized.
1547- if (STATES [spi_num ].dma_initialized == true) {
1548- return E_BAD_STATE ;
1549- }
1550-
15511538 // Make sure SPI Instance is in Target mode (L. Slave).
15521539 if (STATES [spi_num ].controller_target != MXC_SPI_TYPE_TARGET ) {
15531540 return E_BAD_STATE ;
@@ -1612,6 +1599,7 @@ void MXC_SPI_RevA2_Handler(mxc_spi_reva_regs_t *spi)
16121599
16131600 // Controller is done after callback (if valid) is handled.
16141601 STATES [spi_num ].transaction_done = true;
1602+ STATES [spi_num ].dma_in_use = false;
16151603 }
16161604
16171605 // Handle RX Threshold
@@ -1662,6 +1650,7 @@ void MXC_SPI_RevA2_DMA_TX_Handler(mxc_spi_reva_regs_t *spi)
16621650 // TX Transaction is done if there's no RX transaction.
16631651 if (STATES [spi_num ].rx_length_bytes == 0 || STATES [spi_num ].tx_buffer == NULL ) {
16641652 STATES [spi_num ].transaction_done = true;
1653+ STATES [spi_num ].dma_in_use = false;
16651654 }
16661655 }
16671656
@@ -1707,6 +1696,7 @@ void MXC_SPI_RevA2_DMA_RX_Handler(mxc_spi_reva_regs_t *spi)
17071696 // RX transaction determines the controller is done if TX transaction is also present.
17081697 if (STATES [spi_num ].tx_length_bytes > 0 && STATES [spi_num ].tx_buffer != NULL ) {
17091698 STATES [spi_num ].transaction_done = true;
1699+ STATES [spi_num ].dma_in_use = false;
17101700 }
17111701 }
17121702
0 commit comments