aboutsummaryrefslogtreecommitdiff
path: root/src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c')
-rw-r--r--src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c b/src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c
new file mode 100644
index 0000000..6f21b79
--- /dev/null
+++ b/src/sample/io_sample/SPI/GDMA_Singleblock/io_gdma.c
@@ -0,0 +1,128 @@
+/**
+*********************************************************************************************************
+* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved.
+**********************************************************************************************************
+* @file io_gdma.c
+* @brief This file provides demo code of meomory to memory transfer by gdma.
+* @details
+* @author echo
+* @date 2021-05-24
+* @version v1.0
+*********************************************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "io_gdma.h"
+#include "io_UART.h"
+
+
+/* Globals ------------------------------------------------------------------*/
+uint8_t GDMA_WriteCmdBuffer[5] = {0x0B, 0x01, 0x00, 0x00, 0x00};
+uint8_t GDMA_Recv_Buffer[GDMA_TRANSFER_SIZE];
+
+/**
+ * @brief Initialize gdma peripheral.
+ * @param No parameter.
+ * @return void
+ */
+void driver_spi_gdma_init(void)
+{
+ /*----------------test buffer init------------------*/
+ memset(GDMA_Recv_Buffer, 0, sizeof(GDMA_Recv_Buffer) / sizeof(GDMA_Recv_Buffer[0]));
+
+ SPI_InitTypeDef SPI_InitStructure;
+ GDMA_InitTypeDef GDMA_InitStruct;
+
+ SPI_DeInit(FLASH_SPI);
+ RCC_PeriphClockCmd(APBPeriph_SPI0, APBPeriph_SPI0_CLOCK, ENABLE);
+
+ /*----------------------SPI init---------------------------------*/
+ SPI_StructInit(&SPI_InitStructure);
+ SPI_InitStructure.SPI_Direction = SPI_Direction_EEPROM;//SPI_Direction_RxOnly;
+ SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+ SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
+ SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+ SPI_InitStructure.SPI_BaudRatePrescaler = 100;
+ SPI_InitStructure.SPI_FrameFormat = SPI_Frame_Motorola;
+ SPI_InitStructure.SPI_NDF = GDMA_READ_SIZE_MAX - 1;
+ SPI_InitStructure.SPI_RxDmaEn = ENABLE;
+ SPI_InitStructure.SPI_RxWaterlevel = 1;
+ SPI_Init(FLASH_SPI, &SPI_InitStructure);
+
+ /*---------------------GDMA initial------------------------------*/
+ GDMA_StructInit(&GDMA_InitStruct);
+ GDMA_InitStruct.GDMA_ChannelNum = GDMA_CHANNEL_NUM;
+ GDMA_InitStruct.GDMA_DIR = GDMA_DIR_PeripheralToMemory;
+ GDMA_InitStruct.GDMA_BufferSize = GDMA_TRANSFER_SIZE;
+ GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Fix;
+ GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Inc;
+
+ GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Byte;
+ GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Byte;
+ GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_1;
+ GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_1;
+
+ GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)FLASH_SPI->DR;
+ GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)GDMA_Recv_Buffer;
+ GDMA_InitStruct.GDMA_SourceHandshake = GDMA_Handshake_SPI0_RX;
+ GDMA_InitStruct.GDMA_ChannelPriority = 1;
+ GDMA_InitStruct.GDMA_Multi_Block_En = 0;
+
+ GDMA_Init(GDMA_Channel, &GDMA_InitStruct);
+
+ /*-----------------GDMA IRQ-----------------------------*/
+ NVIC_InitTypeDef NVIC_InitStruct;
+ NVIC_InitStruct.NVIC_IRQChannel = GDMA_Channel_IRQn;
+ NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
+ NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
+ NVIC_Init(&NVIC_InitStruct);
+
+ /* Enable transfer interrupt */
+ GDMA_INTConfig(GDMA_CHANNEL_NUM, GDMA_INT_Transfer, ENABLE);
+ GDMA_Cmd(GDMA_CHANNEL_NUM, ENABLE);
+ SPI_Cmd(FLASH_SPI, ENABLE);
+
+ /* Send read data command */
+ SPI_SendBuffer(FLASH_SPI, GDMA_WriteCmdBuffer, 5);
+}
+
+/**
+ * @brief Handle gdma data function.
+ * @param No parameter.
+ * @return void
+ */
+void io_handle_gdma_msg(T_IO_MSG *io_gdma_msg)
+{
+ uint8_t *p_buf = io_gdma_msg->u.buf;
+ uint16_t data_len = (GDMA_TRANSFER_SIZE);
+ APP_PRINT_INFO1("[io_gdma] io_handle_gdma_msg: read data complete,data_len = %d", data_len);
+ uart_senddata_continuous(UART0, &p_buf[data_len], data_len);
+}
+
+/**
+ * @brief GDMA channel interrupt handler function.
+ * @param No parameter.
+ * @return void
+ */
+void GDMA_Channel_Handler(void)
+{
+ GDMA_INTConfig(GDMA_CHANNEL_NUM, GDMA_INT_Transfer, DISABLE);
+
+ T_IO_MSG int_gdma_msg;
+
+ int_gdma_msg.type = IO_MSG_TYPE_GDMA;
+ int_gdma_msg.subtype = 0;
+ int_gdma_msg.u.buf = (void *)GDMA_Recv_Buffer;
+ if (false == app_send_msg_to_apptask(&int_gdma_msg))
+ {
+ APP_PRINT_ERROR0("[io_gdma]GDMA_Channel_Handler: Send int_gdma_msg failed!");
+ //Add user code here!
+ GDMA_ClearINTPendingBit(GDMA_CHANNEL_NUM, GDMA_INT_Transfer);
+ return;
+ }
+ GDMA_ClearINTPendingBit(GDMA_CHANNEL_NUM, GDMA_INT_Transfer);
+ GDMA_INTConfig(GDMA_CHANNEL_NUM, GDMA_INT_Transfer, ENABLE);
+}
+
+/******************* (C) COPYRIGHT 2019 Realtek Semiconductor Corporation *****END OF FILE****/