Skip to content

Commit 3fc6619

Browse files
jhokajarstevew817
authored andcommitted
SiLabs Pearl: SPI fixes
Added rx/tx clear before DMA transmit begins. RX DMA descriptor fixed
1 parent 81a9dd9 commit 3fc6619

File tree

1 file changed

+11
-1
lines changed
  • libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32

1 file changed

+11
-1
lines changed

libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/spi_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,10 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
877877
}
878878

879879
/* Save amount of TX done by DMA */
880+
880881
obj->tx_buff.pos += tx_length;
882+
/* Clear TX registers */
883+
obj->spi.spi->CMD = USART_CMD_CLEARTX;
881884

882885
LDMA_TransferCfg_t xferConf = LDMA_TRANSFER_CFG_PERIPHERAL(dma_periph);
883886
LDMA_Descriptor_t desc = LDMA_DESCRIPTOR_SINGLE_M2P_BYTE(txdata, target_addr, tx_length);
@@ -923,11 +926,18 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
923926
break;
924927
}
925928

929+
/* Clear RX registers */
930+
obj->spi.spi->CMD = USART_CMD_CLEARRX;
931+
926932
LDMA_TransferCfg_t xferConf = LDMA_TRANSFER_CFG_PERIPHERAL(dma_periph);
927-
LDMA_Descriptor_t desc = LDMA_DESCRIPTOR_SINGLE_M2P_BYTE(source_addr, rxdata, rx_length);
933+
LDMA_Descriptor_t desc = LDMA_DESCRIPTOR_SINGLE_P2M_BYTE(source_addr, rxdata, rx_length);
928934
if(obj->spi.bits >= 9){
935+
#ifdef USE_UINT16_BUFFER
936+
desc.xfer.size = ldmaCtrlSizeHalf;
937+
#else
929938
desc.xfer.size = ldmaCtrlSizeHalf;
930939
desc.xfer.srcInc = ldmaCtrlSrcIncTwo;
940+
#endif
931941
}
932942
LDMA_StartTransfer(obj->spi.dmaOptionsRX.dmaChannel, &xferConf, &desc, serial_dmaTransferComplete,obj->spi.dmaOptionsRX.dmaCallback.userPtr);
933943
}

0 commit comments

Comments
 (0)