Guten Tag Ich versuche den DMA bei einem STM32 welcher als SPI fungiert, während der SPI Übertragung neuzustarten. Das sieht wie folgt aus: CS ------|____________________|-------- SCK |||| |||| |||| |||| DMA |----------------- Ein SCK Grüppchen |||| entspricht 8 Clocks bzw. einem Byte Ich triggere intern auf die 5te Flanke des ersten Bytes und möchte ab da für die folgenden Bytes den DMA parat haben, so dass dieser die nächsten Bytes sendet. Dazu habe ich folgenden Code getestet:
1 | void DMA_Config(void) |
2 | {
|
3 | DMA_InitTypeDef DMA_InitStructure; |
4 | |
5 | DMA_DeInit(DMA1_Channel5); |
6 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR; //0x4000380C; |
7 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&dataSendA[0]; |
8 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; |
9 | DMA_InitStructure.DMA_BufferSize = 3; |
10 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; |
11 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; |
12 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; |
13 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; |
14 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; |
15 | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; |
16 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; |
17 | DMA_Init(DMA1_Channel5, &DMA_InitStructure); |
18 | |
19 | //DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
|
20 | |
21 | DMA_Cmd(DMA1_Channel5, DISABLE); |
22 | |
23 | |
24 | //DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
|
25 | SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE); |
26 | }
|
27 | |
28 | |
29 | |
30 | |
31 | |
32 | .....
|
33 | //Neustarten:
|
34 | |
35 | //DMA Deaktivieren
|
36 | DMA1_Channel5->CCR &= (uint16_t)(~DMA_CCR1_EN); |
37 | |
38 | //Adresse
|
39 | DMA1_Channel5->CMAR = (uint32_t)&dataSendA[0]; |
40 | |
41 | //DMA Counter auf 3 Bytes
|
42 | DMA1_Channel5->CNDTR = 3; |
43 | |
44 | //SPI TX DMA Kanal aktivieren
|
45 | SPI2->CR2 |= SPI_I2S_DMAReq_Tx; |
46 | |
47 | //DMA Aktivieren
|
48 | DMA1_Channel5->CCR |= DMA_CCR1_EN; |
Leider funktioniert dies nicht wie gewünscht. Das erste Byte ist willkürlich. das zweite stimmt dann das dritte ist 0. Hat jemand eine Idee?