versuche meinen vs1052 code auf dma umzustellen.
Das Beschicken des mp3-Modulds funktioniert jetz - als Vorbereitung zur
dma - ohne Warteschleife per Interrupt:
1
voidSysTick_Handler(){//1ms
2
3
4
/* Increment performance counter */
5
//disk_timerproc(); /* Disk timer process */
6
7
if(Timer_fat)Timer_fat--;
8
9
if(Timer_down)
10
Timer_down--;
11
12
timer_smh++;
13
timer_timeout_up_ms++;
14
15
16
if(timer_smh%5==0){
17
18
if((vs_status&(1<<0))){
19
if((GPIOB->IDR&(1<<4))){
20
GPIOA->ODR|=(1<<9);//xdcs
21
GPIOA->ODR&=~(1<<9);//xdcs
22
23
uint8_ti;
24
for(i=0;i<32;i++){
25
SPI2->DR=*vs_pt++;
26
while(!(SPI2->SR&SPI_SR_RXNE));//0_rxne 1_txe 7_bsy// ok
27
(SPI2->DR);//return
28
zlisr++;
29
}
30
if(zlisr>vs_buffer_size-1){
31
vs_status&=~(1<<0);
32
}
33
}
34
}
35
#endif
36
}//%5
37
38
39
40
EinProblemhabeichmitstrcpy:
41
42
[c]/**/
43
u16j;
44
for(j=0;j<1965;j++){
45
vs_buffer[1965+j]=hello_mp3[+j];
46
vs_buffer[j]=hello_mp3[+j];
47
}
48
49
strcpy(vs_buffer,hello_mp3);
50
51
//vs_pt = hello_mp3; // Point "p" to the beginning of array
52
vs_pt=vs_buffer;// Point "p" to the beginning of array
53
vs_status|=(1<<0);
54
xdcs_h;
55
zlisr=0;
Wenn ich die for-Schleife auskommentiere, kommt im mp3-modul nichts mehr
an owohl der Speicherinhalt nach dem Debugger der gleiche ist.
Woran könnte das liegen?
bittereMedizin schrieb:> du hast doch offensichtlich ein Problem mit deinem spi-code.
??? Ich will es ja nicht völlig ausschließen, es ist aber eigentlich
problemloser code:
grundschüler schrieb:> strcpy(vs_buffer,hello_mp3);MP3 Daten können 0x00 enthalten und werden nicht mit 0x00 abgeschlossen.
Daher immer memcpy() und nicht strcpy() verwenden.
Jim M. schrieb:> grundschüler schrieb:>> strcpy(vs_buffer,hello_mp3);>> MP3 Daten können 0x00 enthalten und werden nicht mit 0x00 abgeschlossen.>> Daher immer memcpy() und nicht strcpy() verwenden.
strcpy hört bei 0 auf?
Danke, das leuchtet ein.
grundschüler schrieb:> strcpy hört bei 0 auf?> Danke, das leuchtet ein.
Ja,
Strings sind in C nichts weiter als ein Char-Array, welches am Ende noch
ein Terminator-Zeichen hat. Da die Arraygröße aus Sicht der meisten
Funktionen unbekannt ist, arbeiten die einfach so lange, bis dieses
Zeichen erreicht wird.
Das Zeichen wird '\0' geschrieben, wobei '\0' der 0 (siehe
ASCII-Tabelle) entspricht.
dasrotemopped schrieb:> wartest du darauf, das der DMA Transfer beendet wurde bevor du das 2.> Device an SPI ansprichst ? Und wie kannst du DMA benutzen wenn du> zwischen 2 CS umschalten musst ?
Nur dieser Teil
1
uint8_ti;
2
for(i=0;i<32;i++){
3
SPI2->DR=*vs_pt++;
4
while(!(SPI2->SR&SPI_SR_RXNE));//0_rxne 1_txe 7_bsy// ok
5
(SPI2->DR);//return
6
zlisr++;
7
}
wird durch den dma-Aufruf ersetzt. Da ist - bis auf RXNE - kein
Warteteil und kein CS drin. Müsste also so per dma klappen...
stimmt meine Vermutung, Nucleo-F103RB + Adafruit Music Maker Shield ?
Wenn nicht, wie ist deine aktuelle Pinbelegung / Doppelbelegung für
SDcard und VS1052 ?
Gruß,
dasrotemopped.