<html><head><title>Re: Ukončení přenosu využitím DMA</title>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">U Atmelu takovéhle problémy nemám, ten mi šlape perfektně. :-)<br>
<br>
Tohle není problém že jsou znaky ve FIFO a dosud nejsou odeslané.<br>
<br>
Volnou řečí dělám tohle:<br>
  - nastavím DMA přenos pro oba směry SPI na stejnou délku<br>
  - spustím <br>
  - čekám až doběhne DMA přenos = všechny znaky jsou buď odvysílané nebo alespoň ve FIFO <br>
  - čekám až se vyprázdní FIFO a odvysílá se poslední znak<br>
  - vypnu přenos <br>
<br>
A problém je že když konec DMA přenosu hlídám pomocí Tx DMA, tak to funguje.<br>
Když to hlídám pomocí Rx DMA, tak se to občas ukončí dřív a přenese se menší počet znaků.<br>
<br>
Tomáš<br>
<br>
<br>
</span><table>
<tr>
<td width=2 bgcolor= #0000ff><br>
</td>
<td width=563><br><br>
<span style=" font-family:'courier new'; font-size: 9pt;">Sleduji to tak nejak po ocku, jelikoz procesor jde mimo me,<br>
ale nemuze tam byt problem typu, ze treba u atmelu a serioveho<br>
portu byly dve informace ze z buferu sel znak na odeslani a bylo<br>
mozne plnit dalsi...<br>
Ale kdyz v tu chvili to clovek tipnul, vypnutim seriaku tak se nic neodeslalo,<br>
protoze znak byl sice prevzat hardwarem, ale jeste se neodvysilal ven..<br>
Tak jen myslenka jestli to nemuze byt takovy nejaky podobny problem...<br>
<br>
Zdenek Aster<br>
<br>
---------- Původní zpráva ----------<br>
Od: Jan Waclawek <konfera@efton.sk><br>
Komu: HW-news <hw-list@list.hw.cz><br>
Datum: 14. 9. 2016 11:42:57<br>
Předmět: Re: Ukončení přenosu využitím DMA<br>
<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>
Chcelo by to pozriet ako je to prelozene. 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>
wek<br>
<br>
<br>
----- Original Message ---------------<br>
>Není. Přiąel jsem na to tak ľe mi neseděly kontrolní součty v datech<br>
>a v bufferu zůstaly nuly.<br>
><br>
>Kdyľ koukám na SPI signály log. analyzátorem, tak v případě zkrácení<br>
>je několik znaků před předčasným koncem zaąkytnutí, je tam mezera cca na jeden<br>
>znak (SPI na 24MHz). Potom doběhne jeątě pár znaků, zachytil jsem v<br>
>rozsahu 4-13. Celkový počet i počet po mezeře jsou nekulatá čísla.<br>
><br>
>Zřejmě dochází skutečně k zastavení kanálu, ale chyba nastavená není.<br>
><br>
>A to vąe jen občas. Přeruąení je povolené, po 1ms běľí systémové<br>
>hodiny, ale na SPI se nesahá.<br>
><br>
>Tomáą<br>
><br>
><br>
>> A nie je to nahodou naopak, t.j. ze ak kontrolujete Rx tak je to dobre, a<br>
>> ak Tx tak Vam chybaju nejake prenesene data?<br>
><br>
>> wek<br>
><br>
><br>
>> ----- Original Message ---------------<br>
>>>Zdravím vespolek<br>
>>><br>
>>>Narazil jsem na problém, zdá se µe i opravil, ale netu±ím proč ta<br>
>>>oprava funguje.<br>
>>><br>
>>>Procesor STR912FAW46 (vím, moc lidí s ním uµ nepracuje, ale co kdyby)<br>
>>>Přená±ím data přes SPI (externí flash) s vyuµitím DMA.<br>
>>>Programově ode±lu záhlaví, pro přenos dat pouµiju DMA. Tzn. odesílám<br>
>>>samá FF pomocí jednoho DMA kanálu, přijímám do bufferu pomocí druhého<br>
>>>kanálu. To v±e synchronně, čekám na dokončení přenosu.<br>
>>><br>
>>>Vypadá to zhruba takhle:<br>
>>><br>
>>> // tady je inicializace kanálů, oba na stejnou délku dat.<br>
>>><br>
>>> // rict SSP ze bude prenaset prijata data pomoci DMA / dtto pro odesilana<br>
>>> SSP_DMACmd(SSP1, SSP_DMA_Receive, ENABLE);<br>
>>> SSP_DMACmd(SSP1, SSP_DMA_Transmit, ENABLE);<br>
>>><br>
>>> // Enable DMA Channels<br>
>>> DMA_ChannelCmd(SSP1_DMA_CHAN_RX, ENABLE);<br>
>>> DMA_ChannelCmd(SSP1_DMA_CHAN_TX, ENABLE);<br>
>>><br>
>>> // zde probiha prenos<br>
>>><br>
>>> // pockat na dokonceni DMA prenosu<br>
>>> // vvvvvv zde je to dulezite<br>
>>> while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}<br>
>>> // pockat az dobehne i SPI<br>
>>> while((SSP1->SR & SPI_SR_FLAG_BUSY)) {;}<br>
>>><br>
>>> // Disable DMA Channels<br>
>>> DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);<br>
>>> DMA_ChannelCmd(SSP1_DMA_CHAN_TX, DISABLE);<br>
>>><br>
>>> // Disable SPI RX/TX request<br>
>>> SSP_DMACmd(SSP1, SSP_DMA_Transmit, DISABLE);<br>
>>> SSP_DMACmd(SSP1, SSP_DMA_Receive, DISABLE);<br>
>>><br>
>>>A teď ten problém: vět±inou to funguje, jen občas se přenos nedokončí,<br>
>>>přesněji, ukončí předčasně. Nehlásíá se µádné chyb, jen se přenese<br>
>>>míň neµ jsme zadával.<br>
>>><br>
>>>Pokud na označené řádce kontroluju status Tx, tak to funguje.<br>
>>><br>
>>>Délka dat pro oba kanály je inicializovaná ze stejné proměnné.<br>
>>>Proč záleµí na tom který kanál testuju, kdyµ by oba měly z principu<br>
>>>přenést stejné mnoµství dat?<br>
>>><br>
>>>Tomá±<br>
>>><br>
<br>
_______________________________________________<br>
HW-list mailing list - sponsored by www.HW.cz<br>
Hw-list@list.hw.cz<br>
http://list.hw.cz/mailman/listinfo/hw-list</td>
</tr>
</table>
</body></html>