@@ -876,10 +876,7 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
876
876
}
877
877
878
878
/* Save amount of TX done by DMA */
879
-
880
879
obj -> tx_buff .pos += tx_length ;
881
- /* Clear TX registers */
882
- obj -> spi .spi -> CMD = USART_CMD_CLEARTX ;
883
880
884
881
LDMA_TransferCfg_t xferConf = LDMA_TRANSFER_CFG_PERIPHERAL (dma_periph );
885
882
LDMA_Descriptor_t desc = LDMA_DESCRIPTOR_SINGLE_M2P_BYTE (txdata , target_addr , tx_length );
@@ -925,9 +922,6 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
925
922
break ;
926
923
}
927
924
928
- /* Clear RX registers */
929
- obj -> spi .spi -> CMD = USART_CMD_CLEARRX ;
930
-
931
925
LDMA_TransferCfg_t xferConf = LDMA_TRANSFER_CFG_PERIPHERAL (dma_periph );
932
926
LDMA_Descriptor_t desc = LDMA_DESCRIPTOR_SINGLE_P2M_BYTE (source_addr , rxdata , rx_length );
933
927
if (obj -> spi .bits >= 9 ){
@@ -989,9 +983,6 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
989
983
rxDescrCfg .hprot = 0 ;
990
984
DMA_CfgDescr (obj -> spi .dmaOptionsRX .dmaChannel , true, & rxDescrCfg );
991
985
992
- // Clear RX registers - Useful if previous command transfered don't
993
- obj -> spi .spi -> CMD = USART_CMD_CLEARRX ;
994
-
995
986
/* Activate RX channel */
996
987
DMA_ActivateBasic (obj -> spi .dmaOptionsRX .dmaChannel , true, false, rxdata , (void * )& (obj -> spi .spi -> RXDATA ),
997
988
rx_length - 1 );
@@ -1006,9 +997,6 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
1006
997
txDescrCfg .hprot = 0 ;
1007
998
DMA_CfgDescr (obj -> spi .dmaOptionsTX .dmaChannel , true, & txDescrCfg );
1008
999
1009
- /* Clear TX registers */
1010
- obj -> spi .spi -> CMD = USART_CMD_CLEARTX ;
1011
-
1012
1000
/* Activate TX channel */
1013
1001
DMA_ActivateBasic ( obj -> spi .dmaOptionsTX .dmaChannel ,
1014
1002
true,
@@ -1028,9 +1016,6 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
1028
1016
rxDescrCfg .hprot = 0 ;
1029
1017
DMA_CfgDescr (obj -> spi .dmaOptionsRX .dmaChannel , true, & rxDescrCfg );
1030
1018
1031
- // Clear RX registers - Useful if previous command transfered don't
1032
- obj -> spi .spi -> CMD = USART_CMD_CLEARRX ;
1033
-
1034
1019
/* Activate RX channel */
1035
1020
DMA_ActivateBasic (obj -> spi .dmaOptionsRX .dmaChannel , true, false, rxdata , (void * )& (obj -> spi .spi -> RXDATAX ),
1036
1021
(rx_length / 2 ) - 1 );
@@ -1044,9 +1029,6 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
1044
1029
txDescrCfg .hprot = 0 ;
1045
1030
DMA_CfgDescr (obj -> spi .dmaOptionsTX .dmaChannel , true, & txDescrCfg );
1046
1031
1047
- /* Clear TX registers */
1048
- obj -> spi .spi -> CMD = USART_CMD_CLEARTX ;
1049
-
1050
1032
/* Activate TX channel */
1051
1033
DMA_ActivateBasic ( obj -> spi .dmaOptionsTX .dmaChannel ,
1052
1034
true,
@@ -1078,6 +1060,9 @@ void spi_master_transfer_dma(spi_t *obj, const void *txdata, void *rxdata, int t
1078
1060
{
1079
1061
/* Init DMA here to include it in the power figure */
1080
1062
dma_init ();
1063
+ /* Clear TX and RX registers */
1064
+ obj -> spi .spi -> CMD = USART_CMD_CLEARTX ;
1065
+ obj -> spi .spi -> CMD = USART_CMD_CLEARRX ;
1081
1066
/* If the DMA channels are already allocated, we can assume they have been setup already */
1082
1067
if (hint != DMA_USAGE_NEVER && obj -> spi .dmaOptionsTX .dmaUsageState == DMA_USAGE_ALLOCATED ) {
1083
1068
/* setup has already been done, so just activate the transfer */
@@ -1172,8 +1157,6 @@ uint32_t spi_irq_handler_asynch(spi_t* obj)
1172
1157
void * tx_pointer = (char * )obj -> tx_buff .buffer + obj -> tx_buff .pos ;
1173
1158
uint32_t tx_length = obj -> tx_buff .length - obj -> tx_buff .pos ;
1174
1159
1175
- /* Wait previous transmit to complete */
1176
- while (!(obj -> spi .spi -> STATUS & USART_STATUS_TXC ));
1177
1160
/* Begin transfer. Rely on spi_activate_dma to split up the transfer further. */
1178
1161
spi_activate_dma (obj , obj -> rx_buff .buffer , tx_pointer , tx_length , obj -> rx_buff .length );
1179
1162
@@ -1200,6 +1183,8 @@ uint32_t spi_irq_handler_asynch(spi_t* obj)
1200
1183
obj -> spi .dmaOptionsTX .dmaUsageState = DMA_USAGE_OPPORTUNISTIC ;
1201
1184
}
1202
1185
1186
+ /* Wait transmit to complete, before user code is indicated*/
1187
+ while (!(obj -> spi .spi -> STATUS & USART_STATUS_TXC ));
1203
1188
unblockSleepMode (SPI_LEAST_ACTIVE_SLEEPMODE );
1204
1189
/* return to CPP land to say we're finished */
1205
1190
return SPI_EVENT_COMPLETE ;
@@ -1307,6 +1292,8 @@ uint32_t spi_irq_handler_asynch(spi_t* obj)
1307
1292
obj -> spi .dmaOptionsTX .dmaUsageState = DMA_USAGE_OPPORTUNISTIC ;
1308
1293
}
1309
1294
1295
+ /* Wait transmit to complete, before user code is indicated*/
1296
+ while (!(obj -> spi .spi -> STATUS & USART_STATUS_TXC ));
1310
1297
unblockSleepMode (SPI_LEAST_ACTIVE_SLEEPMODE );
1311
1298
1312
1299
/* return to CPP land to say we're finished */
0 commit comments