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