1 | void spi_handleDMA1Ch2Interrupt(void){
|
2 | uint8_t i;
|
3 | //Test on DMA1 Channel2 Transfer Complete interrupt
|
4 | if(DMA_GetITStatus(DMA1_IT_TC2))
|
5 | {
|
6 | //Clear DMA1 Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits
|
7 | DMA_ClearITPendingBit(DMA1_IT_GL2);
|
8 | while (DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET) {}
|
9 | // wait for tx to complete - page 692
|
10 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) {}
|
11 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {}
|
12 | DMA_ClearFlag(DMA1_FLAG_GL3); // Clear the global flag
|
13 |
|
14 | // Disable DMA
|
15 | DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, DISABLE);
|
16 | SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, DISABLE);
|
17 | DMA_Cmd(DMA1_Channel2, DISABLE);
|
18 | DMA_Cmd(DMA1_Channel3, DISABLE);
|
19 | // wait until DMA is actually off
|
20 | while (DMA1_Channel2->CCR & DMA_CCR2_EN);
|
21 | while (DMA1_Channel3->CCR & DMA_CCR3_EN);
|
22 | #ifdef SPI2_MASTER
|
23 | // Set NSS High
|
24 | GPIO_WriteBit(GPIOA, GPIO_Pin_4, SET);
|
25 | #endif
|
26 | // Copy RX buffer
|
27 | for(i=0;i<7;i++)
|
28 | {
|
29 | #ifdef SPI2_SLAVE
|
30 | SPI2Buffer[i]=SPI2CommandBuffer[i];
|
31 | #endif
|
32 | SPI2CommandBuffer[i]=SPI2RecBuffer[i];
|
33 | }
|
34 | #ifdef SPI2_MASTER
|
35 | // Set the SPI Bus free
|
36 | SPI2_FREE=1;
|
37 | #endif
|
38 | #ifdef SPI2_SLAVE
|
39 | // Set the number of transfers
|
40 | DMA_SetCurrDataCounter(DMA1_Channel2, 7);
|
41 | DMA_SetCurrDataCounter(DMA1_Channel3, 7);
|
42 | DMA_ClearITPendingBit(DMA1_IT_GL2); // clear again
|
43 | DMA_ClearFlag(DMA1_FLAG_GL3); // Clear the global flag
|
44 |
|
45 | // Start DMA controller again
|
46 | DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
|
47 | SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, ENABLE);
|
48 |
|
49 | // Initiate Transfer
|
50 | DMA_Cmd(DMA1_Channel2, ENABLE);
|
51 | DMA_Cmd(DMA1_Channel3, ENABLE);
|
52 | #endif
|
53 | }
|
54 | }
|
55 |
|
56 | void SPI2_send(void)
|
57 | {
|
58 | uint8_t i;
|
59 | // Lock SPI Bus
|
60 | SPI2_FREE=0;
|
61 | // Write Commands into TX Buffer
|
62 | for(i=0; i<7; i++)
|
63 | {
|
64 | SPI2Buffer[i]=CommandBuffer[i];
|
65 | }
|
66 | // Set the number of transfers
|
67 | DMA_SetCurrDataCounter(DMA1_Channel2, 7);
|
68 | DMA_SetCurrDataCounter(DMA1_Channel3, 7);
|
69 | DMA_ClearITPendingBit(DMA1_IT_GL2); // clear again
|
70 | DMA_ClearFlag(DMA1_FLAG_GL3); // Clear the global flag
|
71 |
|
72 | // Start DMA controller again
|
73 | DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
|
74 | SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, ENABLE);
|
75 |
|
76 | // Pull NSS Low
|
77 | GPIO_WriteBit(GPIOA, GPIO_Pin_4, RESET);
|
78 | // Initiate Transfer
|
79 | DMA_Cmd(DMA1_Channel2, ENABLE);
|
80 | DMA_Cmd(DMA1_Channel3, ENABLE);
|
81 | }
|