1 | void StartDMATransferToBuffer (uint16_t u16Titel)
|
2 | {
|
3 | /**
|
4 | Test wie man Daten über die DMA Schnittstelle vom Mem an die SPI sendet
|
5 | DMA SPI1 TX -> DMA1 CH3
|
6 | kann nur 16 Bit sein wenn SPI auch 16 bit empfangen kann !!!
|
7 | hoffentlich!
|
8 | **/
|
9 | DMA_InitTypeDef DMA_InitStructure;
|
10 | uint8_t rw_workbyte[] = { 0x55 };
|
11 | uint32_t u32Laufvar;
|
12 |
|
13 | float tCPU = 1.0/TIMFREQUENZ;
|
14 | float tSampling = 1.0/get_SampleRate( u16Titel );
|
15 |
|
16 | fQuantisationTime = (uint16_t)(tSampling/tCPU);
|
17 |
|
18 | fSkalierungsfaktorXAchse = fQuantisationTime/(pow(2,get_BitsPerSample(u16Titel)));
|
19 |
|
20 | for(u32Laufvar = 0 ; u32Laufvar < (BUFFER_WIDE*2) ; u32Laufvar++)
|
21 | {
|
22 | u16MasterOutBuffer[u32Laufvar] = fQuantisationTime/2;
|
23 | }
|
24 |
|
25 | //Alle Puffer gelten als leer
|
26 | u8DoubleBufferCommunicationControl = 0;
|
27 |
|
28 | DMA_DeInit(DMA1_Channel3);
|
29 |
|
30 | RCC_Configuration_DMA();
|
31 | RCC_Configuration_PWM();
|
32 | NVIC_Configuration_DMA();
|
33 |
|
34 | u16BytesToTransferPerDMACycle = BUFFER_WIDE * get_BlockAlign(u16Titel);
|
35 |
|
36 | //Neue Adresse im Flash da immer ein Byte übersprungen wurde
|
37 | u32JumpAdressDuringBufferChanging = get_AudioStartAdress(u16Titel);
|
38 | PrepareFlashToRead(u32JumpAdressDuringBufferChanging);
|
39 |
|
40 | DMA_DeInit(DMA1_Channel3);
|
41 |
|
42 | DMA_Cmd(DMA1_Channel2, DISABLE);
|
43 | DMA_Cmd(DMA1_Channel3, DISABLE);
|
44 |
|
45 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
|
46 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&rw_workbyte[0];
|
47 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
48 |
|
49 | DMA_InitStructure.DMA_BufferSize = u16BytesToTransferPerDMACycle;//(uint32_t)(get_AudioEndAdress(u16Titel)-get_AudioStartAdress(u16Titel)); //<-wie viel
|
50 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
51 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
|
52 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
|
53 | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
54 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
55 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
|
56 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
|
57 |
|
58 |
|
59 | //TX Chanel um Clock zu erzwingen
|
60 | DMA_Init(DMA1_Channel3, &DMA_InitStructure);
|
61 | //---------------------------------9---------------------
|
62 |
|
63 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
64 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
|
65 |
|
66 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&(u16DoubleBuffer1[0]);
|
67 |
|
68 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//DMA_MemoryInc_Enable;
|
69 |
|
70 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
71 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//DMA_MemoryDataSize_HalfWord;
|
72 | //DMA_InitStructure.DMA_BufferSize = (uint32_t)0x4; //<-wie viel
|
73 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
74 | //RX Chanel um zu empfangen
|
75 | DMA_Init(DMA1_Channel2, &DMA_InitStructure);
|
76 | //PufferWahl();
|
77 |
|
78 | DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
|
79 | //------------------------------------------------------
|
80 | SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, ENABLE);
|
81 |
|
82 | DMA_Cmd(DMA1_Channel2, ENABLE);
|
83 | DMA_Cmd(DMA1_Channel3, ENABLE);
|
84 |
|
85 | InitPWM((uint16_t)fQuantisationTime,0,0);
|
86 |
|
87 | StartDMATransferToSpeaker(BUFFER_WIDE);
|
88 |
|
89 | //Stimmt das? nachprüfen
|
90 | // while (DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET) { ; }
|
91 |
|
92 | // SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, DISABLE);
|
93 | // DMA_Cmd(DMA1_Channel2, DISABLE);
|
94 | // DMA_Cmd(DMA1_Channel3, DISABLE);
|
95 | }
|