<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>