Ukončení přenosu využitím DMA
Hynek Sladky
econf na centrum.cz
Středa Září 14 13:21:45 CEST 2016
Ted jsem si vzpomnel na jedno podobne podivne chovani:
Procesor byl STM32L051, IDE Keil, debugger Ulink2.
Pri ladeni zobrazene registry periferie (zde treba SPI).
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.
Jakmile jsem vypnul zobrazeni periferie pri ladeni nebo pustil program
bez ladeni, podivne nahodne chyby zmizely a vse se chovalo dle ocekavani.
Nemuze to byt podobny problem?
Hynek Sladky
Dne 14.9.2016 12:47, Tomáš Hamouz napsal(a):
>> 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?
> 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.
>
>> while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}
> (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é.
>
>> DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);
>> DMA_ChannelCmd(SSP1_DMA_CHAN_TX, DISABLE);
> 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.
>
>
>> Chcelo by to pozriet ako je to prelozene.
> 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
>
>
>
>> 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.
> Přesně tak jsem to dělal.
>
> Tomáš
>
>> wek
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20160914/01ae35af/attachment.html>
Další informace o konferenci Hw-list