|
|
/************************************************************************
|
|
|
* Copyright(c) 2023 Levetop Semiconductor Co.,Led. All rights reserved.
|
|
|
* @file dma.c
|
|
|
* @author UartTFT Application Team
|
|
|
* @version V1.0.0
|
|
|
* @date 2023-2-24
|
|
|
* @brief
|
|
|
*************************************************************************/
|
|
|
|
|
|
#include "dma.h"
|
|
|
#include "dmac_drv.h"
|
|
|
#include "spi_drv.h"
|
|
|
|
|
|
void SPI2_DMA_Tran(UINT8 *Tx_Addr, UINT8 *Rx_Addr, UINT32 length)
|
|
|
{
|
|
|
DMA_Init(DMA1_BASE_ADDR);
|
|
|
SPI2->SPIDMACR |= 0x03; // Enable DMA of SPI TX RX
|
|
|
|
|
|
m_dma_control->DMA_CONFIG = 1;
|
|
|
// Tx configuration
|
|
|
m_dma_channel[0]->DMA_SADDR = (UINT32)Tx_Addr;
|
|
|
m_dma_channel[0]->DMA_DADDR = (UINT32)&SPI2->SPIDR;
|
|
|
m_dma_channel[0]->DMA_CTRL_HIGH = length;
|
|
|
m_dma_channel[0]->DMA_CTRL = DNOCHG | SIEC | M2P_DMA;
|
|
|
m_dma_channel[0]->DMA_CFG = (HS_SEL_SRC_SOFT);
|
|
|
m_dma_channel[0]->DMA_CFG_HIGH = DST_PER_SPI_TX(1) | SRC_PER_SPI_TX(1);
|
|
|
|
|
|
// Rx configuration
|
|
|
m_dma_channel[1]->DMA_SADDR = (UINT32)&SPI2->SPIDR;
|
|
|
m_dma_channel[1]->DMA_DADDR = (UINT32)Rx_Addr;
|
|
|
m_dma_channel[1]->DMA_CTRL_HIGH = length;
|
|
|
m_dma_channel[1]->DMA_CTRL = SNOCHG | DIEC | P2M_DMA;
|
|
|
m_dma_channel[1]->DMA_CFG = (HS_SEL_DST_SOFT);
|
|
|
m_dma_channel[1]->DMA_CFG_HIGH = SRC_PER_SPI_RX(4) | DST_PER_SPI_RX(4);
|
|
|
|
|
|
m_dma_control->DMA_MASKTFR = CHANNEL_UMASK(0) | CHANNEL_UMASK(1);
|
|
|
m_dma_control->DMA_CHEN = CHANNEL_WRITE_ENABLE(0) | CHANNEL_ENABLE(0) | CHANNEL_WRITE_ENABLE(1) | CHANNEL_ENABLE(1);
|
|
|
}
|
|
|
|
|
|
void SPI2_DMA_Wait(void)
|
|
|
{
|
|
|
while ((m_dma_control->DMA_RAWTFR & (CHANNEL_STAT(0) | CHANNEL_STAT(1))) != (CHANNEL_STAT(0) | CHANNEL_STAT(1)));
|
|
|
|
|
|
m_dma_control->DMA_CLRTFR = (CHANNEL_STAT(0) | CHANNEL_STAT(1));
|
|
|
|
|
|
m_dma_control->DMA_CHEN = 0;
|
|
|
m_dma_control->DMA_CONFIG = 0;
|
|
|
SPI2->SPIDMACR &= ~0x03; // Disable DMA of SPI TX RX
|
|
|
}
|