1 | void SPI2_DMA_init (unsigned char* rx_buff,unsigned char* tx_buff)
|
2 | {
|
3 |
|
4 | DMA_InitTypeDef DMA_InitStructure;
|
5 | NVIC_InitTypeDef NVIC_InitStructure;
|
6 |
|
7 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // enable DMA clock
|
8 |
|
9 |
|
10 | /*Configure DMA channel 4 to SPI2 -> memory -> Rx*/
|
11 | DMA_DeInit(DMA1_Channel4);
|
12 | DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_Address;
|
13 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) rx_buff;
|
14 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
15 | DMA_InitStructure.DMA_BufferSize = SPI2_BUFFER_SIZE_RX+2;
|
16 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
17 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
18 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
|
19 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
|
20 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
21 | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
22 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
23 | DMA_Init(DMA1_Channel4, &DMA_InitStructure);
|
24 |
|
25 | DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); // enable DMA interrupt
|
26 | DMA_Cmd(DMA1_Channel4, DISABLE); // disenable DMA
|
27 |
|
28 | /*Configure NVIC for DMA interrupt*/
|
29 | NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
|
30 | NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
|
31 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
32 | NVIC_Init(&NVIC_InitStructure);
|
33 |
|
34 | DMA_SetCurrDataCounter(DMA1_Channel4, 0);
|
35 | DMA_Cmd(DMA1_Channel4, ENABLE);
|
36 |
|
37 | /*Configure DMA channel 5 to memory -> SPI2 -> Tx*/
|
38 | DMA_DeInit(DMA1_Channel5);
|
39 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI2_DR_Address;
|
40 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)tx_buff;
|
41 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
42 | DMA_InitStructure.DMA_BufferSize = SPI2_BUFFER_SIZE_TX+2;
|
43 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
44 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
45 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
|
46 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
|
47 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
48 | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
49 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
50 | DMA_Init(DMA1_Channel5, &DMA_InitStructure);
|
51 |
|
52 | DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
|
53 | DMA_Cmd(DMA1_Channel5, DISABLE);
|
54 |
|
55 | NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
|
56 | NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
|
57 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
58 | NVIC_Init(&NVIC_InitStructure);
|
59 |
|
60 | DMA_SetCurrDataCounter(DMA1_Channel5, 0);
|
61 | DMA_Cmd(DMA1_Channel5, ENABLE);
|
62 | }
|