<html><head><title>Re: Ukončení přenosu využitím DMA</title>
<META http-equiv=Content-Type content="text/html; charset=windows-1250">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">Tohle znám taky, ale není to ten případ. Dělá to i když to pustím úplně samostatně bez debuggeru. <br>
<br>
Tomáš<br>
<br>
<br>
<br>
</span><table bgcolor="#ffffff">
<tr>
<td width=2 bgcolor= #0000ff><br>
</td>
<td width=808><span style=" font-family:'arial'; font-size: 9pt;">Ted jsem si vzpomnel na jedno podobne podivne chovani:<br>
<br>
Procesor byl STM32L051, IDE Keil, debugger Ulink2.<br>
Pri ladeni zobrazene registry periferie (zde treba SPI).<br>
Debugger pravidelne vycita stavy registru a zobrazuje je. To ale obcas zpusobilo nulovani nejakeho bitu. Kdyz se to seslo, tak se funkce programu prerusila, protoze cekal na bit, ktery se ale vynuloval ctenim debuggeru.<br>
<br>
Jakmile jsem vypnul zobrazeni periferie pri ladeni nebo pustil program bez ladeni, podivne nahodne chyby zmizely a vse se chovalo dle ocekavani.<br>
<br>
Nemuze to byt podobny problem?<br>
<br>
Hynek Sladky<br>
<br>
<br>
<br>
<br>
<span style=" font-family:'courier new';">Dne 14.9.2016 12:47, Tomáš Hamouz napsal(a):<br>
No toto mi vobec nedava zmysel. Takze nakoniec sa aj pri tom "zakopnuti"<br>
prenesie ocakavany pocet znakov (/ 8 = pocet clockov zodpovedajuci poctu<br>
bytov nastavenych v Tx DMA), ale v Rx buffri nie su?<br>
<br>
Pokud dojde k zakopnutí, tak se přenos ukončí předčasně. Z nějakého<br>
důvodu vypadne ze smyčky kde se čeká až Rx kanál DMA skončí přenos.<br>
<br>
<br>
while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}<br>
<br>
(Ta funkce jen testuje příslušný bit, nic jiného)<br>
<br>
Kanál se dle DS zastaví buď přenesením daného počtu přenosů, nebo<br>
výskytem chyby, nebo ručně.<br>
<br>
Standardně po ukončení přenosu v následujícím kódu oba kanály (pro<br>
sichr) zastavím ručně. Za normálních okolností jsou už oba stopnuté.<br>
<br>
<br>
DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);<br>
DMA_ChannelCmd(SSP1_DMA_CHAN_TX, DISABLE);<br>
<br>
Protože mi vypadne z výše uvedené smyčky dříve, utnu tím i Tx kanál.<br>
Tím se vysvětluje proč se přestane odesílat FF, ale záhadou je proč<br>
dojde k předčasnému stopnutí Rx kanálu. Přitom Tx kanál se<br>
pravděpodbně nezastaví, tak až pak zastavím v kódu.<br>
<br>
<br>
<br>
Chcelo by to pozriet ako je to prelozene.<br>
<br>
Ta čekací smyčka, o kterou předpokládám jde<br>
<br>
Debug build<br>
<br>
while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}<br>
0000EC68 E1A00000 mov r0, r0<br>
0000EC6C E59F3130 ldr r3, 0x0000EDA4<br>
0000EC70 E5933000 ldr r3, [r3]<br>
0000EC74 E1A00003 mov r0, r3<br>
0000EC78 E59F3130 ldr r3, 0x0000EDB0<br>
0000EC7C E12FFF33 blx r3<br>
0000EC80 E1A03000 mov r3, r0<br>
0000EC84 E3530001 cmp r3, #1<br>
0000EC88 0AFFFFF7 beq 0x0000EC6C<br>
<br>
0000EDA4 040006DC .word 0x040006DC ; *DMA_Channel5<br>
0000EDB0 0000C498 .word 0x0000C498 ; DMA_GetChannelActiveStatus<br>
<br>
<br>
<br>
Release build<br>
0000A320 E59F4088 ldr r4, 0x0000A3B0<br>
while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_TX)) {;}<br>
0000A324 E59F0080 ldr r0, 0x0000A3AC<br>
0000A328 E12FFF34 blx r4<br>
0000A32C E3500001 cmp r0, #1<br>
0000A330 0AFFFFFB beq 0x0000A324<br>
<br>
0000A3AC 780001A0 .word 0x780001A0 ; DMA_Channel5<br>
0000A3B0 00007C18 .word 0x00007C18 ; DMA_GetChannelActiveStatus<br>
<br>
<br>
<br>
<br>
Bolo by tiez dobre mat pred,<br>
medzi a za tymi while nejaku znacku (zacvicit nejakym pinom) a pozerat<br>
osciloskopom/LA spolu s tymi hodinami od SPI.<br>
<br>
Přesně tak jsem to dělal.<br>
<br>
Tomáš<br>
<br>
<br>
wek<br>
</td>
</tr>
</table>
</body></html>