1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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****/
|