You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

49 regels
1.7 KiB

/************************************************************************
 * 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
}