From a01db5569c541eb6214030369b9b9e68d97409a4 Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 15 Aug 2017 12:46:21 +0800 Subject: [PATCH] fix(spi_dma): fix the receive error with RX DMA start with non-aligned address. --- components/driver/include/driver/spi_master.h | 2 +- components/driver/spi_master.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index 04f4c06994..099f3b7573 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -86,7 +86,7 @@ struct spi_transaction_t { void *rx_buffer; ///< Pointer to receive buffer, or NULL for no MISO phase. Written by 4 bytes-unit if DMA is used. uint8_t rx_data[4]; ///< If SPI_USE_RXDATA is set, data is received directly to this variable }; -}; +} ; //the rx data should start from a 32-bit aligned address to get around dma issue. typedef struct spi_device_t* spi_device_handle_t; ///< Handle for a device on a SPI bus diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index e6175ebae9..0e42be78f7 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -603,7 +603,7 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * //if not use RXDATA neither rx_buffer, buffer_to_rcv assigned to NULL trans_buf.buffer_to_rcv = trans_desc->rx_buffer; } - if ( trans_buf.buffer_to_rcv && handle->host->dma_chan && !esp_ptr_dma_capable( trans_buf.buffer_to_rcv )) { + if ( trans_buf.buffer_to_rcv && handle->host->dma_chan && (!esp_ptr_dma_capable( trans_buf.buffer_to_rcv ) || ((int)trans_buf.buffer_to_rcv%4!=0)) ) { //if rxbuf in the desc not DMA-capable, malloc a new one trans_buf.buffer_to_rcv = heap_caps_malloc((trans_desc->rxlength+7)/8, MALLOC_CAP_DMA); if ( trans_buf.buffer_to_rcv==NULL ) return ESP_ERR_NO_MEM;