<html>
<head>
<meta content="text/html; charset=windows-1250"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<font face="Helvetica, Arial, sans-serif">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>
</font>
<div class="moz-cite-prefix">Dne 14.9.2016 12:47, Tomáš Hamouz
napsal(a):<br>
</div>
<blockquote cite="mid:859464808.20160914124705@divesoft.cz"
type="cite">
<blockquote type="cite">
<pre wrap="">No toto mi vobec nedava zmysel. Takze nakoniec sa aj pri tom "zakopnuti"
prenesie ocakavany pocet znakov (/ 8 = pocet clockov zodpovedajuci poctu
bytov nastavenych v Tx DMA), ale v Rx buffri nie su?
</pre>
</blockquote>
<pre wrap="">
Pokud dojde k zakopnutí, tak se přenos ukončí předčasně. Z nějakého
důvodu vypadne ze smyčky kde se čeká až Rx kanál DMA skončí přenos.
</pre>
<blockquote type="cite">
<pre wrap=""> while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}
</pre>
</blockquote>
<pre wrap="">(Ta funkce jen testuje příslušný bit, nic jiného)
Kanál se dle DS zastaví buď přenesením daného počtu přenosů, nebo
výskytem chyby, nebo ručně.
Standardně po ukončení přenosu v následujícím kódu oba kanály (pro
sichr) zastavím ručně. Za normálních okolností jsou už oba stopnuté.
</pre>
<blockquote type="cite">
<pre wrap=""> DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);
DMA_ChannelCmd(SSP1_DMA_CHAN_TX, DISABLE);
</pre>
</blockquote>
<pre wrap="">
Protože mi vypadne z výše uvedené smyčky dříve, utnu tím i Tx kanál.
Tím se vysvětluje proč se přestane odesílat FF, ale záhadou je proč
dojde k předčasnému stopnutí Rx kanálu. Přitom Tx kanál se
pravděpodbně nezastaví, tak až pak zastavím v kódu.
</pre>
<blockquote type="cite">
<pre wrap="">Chcelo by to pozriet ako je to prelozene.
</pre>
</blockquote>
<pre wrap="">Ta čekací smyčka, o kterou předpokládám jde
Debug build
while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}
0000EC68 E1A00000 mov r0, r0
0000EC6C E59F3130 ldr r3, 0x0000EDA4
0000EC70 E5933000 ldr r3, [r3]
0000EC74 E1A00003 mov r0, r3
0000EC78 E59F3130 ldr r3, 0x0000EDB0
0000EC7C E12FFF33 blx r3
0000EC80 E1A03000 mov r3, r0
0000EC84 E3530001 cmp r3, #1
0000EC88 0AFFFFF7 beq 0x0000EC6C
0000EDA4 040006DC .word 0x040006DC ; *DMA_Channel5
0000EDB0 0000C498 .word 0x0000C498 ; DMA_GetChannelActiveStatus
Release build
0000A320 E59F4088 ldr r4, 0x0000A3B0
while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_TX)) {;}
0000A324 E59F0080 ldr r0, 0x0000A3AC
0000A328 E12FFF34 blx r4
0000A32C E3500001 cmp r0, #1
0000A330 0AFFFFFB beq 0x0000A324
0000A3AC 780001A0 .word 0x780001A0 ; DMA_Channel5
0000A3B0 00007C18 .word 0x00007C18 ; DMA_GetChannelActiveStatus
</pre>
<blockquote type="cite">
<pre wrap="">Bolo by tiez dobre mat pred,
medzi a za tymi while nejaku znacku (zacvicit nejakym pinom) a pozerat
osciloskopom/LA spolu s tymi hodinami od SPI.
</pre>
</blockquote>
<pre wrap="">
Přesně tak jsem to dělal.
Tomáš
</pre>
<blockquote type="cite">
<pre wrap="">wek
</pre>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>