Re: Ukončení přenosu využitím DMA

Jan Waclawek konfera na efton.sk
Středa Září 14 11:42:48 CEST 2016


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?

Chcelo by to pozriet ako je to prelozene. 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.

wek


----- Original Message ---------------
>Není. Přiąel jsem na to tak ľe mi neseděly kontrolní součty v datech
>a v bufferu zůstaly nuly.
>
>Kdyľ koukám na SPI signály log. analyzátorem, tak v případě zkrácení
>je několik znaků před předčasným koncem zaąkytnutí, je tam mezera cca na jeden
>znak (SPI na 24MHz). Potom doběhne jeątě pár znaků, zachytil jsem v
>rozsahu 4-13. Celkový počet i počet po mezeře jsou nekulatá čísla.
>
>Zřejmě dochází skutečně k zastavení kanálu, ale chyba nastavená není.
>
>A to vąe jen občas. Přeruąení je povolené, po 1ms běľí systémové
>hodiny, ale na SPI se nesahá.
>
>Tomáą
>
>
>> A nie je to nahodou naopak, t.j. ze ak kontrolujete Rx tak je to dobre, a
>> ak Tx tak Vam chybaju nejake prenesene data?
>
>> wek
>
>
>> ----- Original Message ---------------
>>>Zdravím vespolek
>>>
>>>Narazil jsem na problém, zdá se µe i opravil, ale netu±ím proč ta
>>>oprava funguje.
>>>
>>>Procesor STR912FAW46 (vím, moc lidí s ním uµ nepracuje, ale co kdyby)
>>>Přená±ím data přes SPI (externí flash) s vyuµitím DMA.
>>>Programově ode±lu záhlaví, pro přenos dat pouµiju DMA. Tzn. odesílám
>>>samá FF pomocí jednoho DMA kanálu, přijímám do bufferu pomocí druhého
>>>kanálu. To v±e synchronně, čekám na dokončení přenosu.
>>>
>>>Vypadá to zhruba takhle:
>>>
>>>    // tady je inicializace kanálů, oba na stejnou délku dat.
>>>
>>>    // rict SSP ze bude prenaset prijata data pomoci DMA / dtto pro odesilana
>>>    SSP_DMACmd(SSP1, SSP_DMA_Receive, ENABLE);
>>>    SSP_DMACmd(SSP1, SSP_DMA_Transmit, ENABLE);
>>>
>>>    // Enable DMA  Channels
>>>    DMA_ChannelCmd(SSP1_DMA_CHAN_RX, ENABLE);
>>>    DMA_ChannelCmd(SSP1_DMA_CHAN_TX, ENABLE);
>>>
>>>    // zde probiha prenos
>>>
>>>    // pockat na dokonceni DMA prenosu
>>>    //                                                 vvvvvv zde je to dulezite
>>>    while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}
>>>    // pockat az dobehne i SPI
>>>    while((SSP1->SR & SPI_SR_FLAG_BUSY)) {;}
>>>
>>>    // Disable DMA Channels
>>>    DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);
>>>    DMA_ChannelCmd(SSP1_DMA_CHAN_TX, DISABLE);
>>>
>>>    // Disable SPI RX/TX request
>>>    SSP_DMACmd(SSP1, SSP_DMA_Transmit, DISABLE);
>>>    SSP_DMACmd(SSP1, SSP_DMA_Receive, DISABLE);
>>>
>>>A teď ten problém: vět±inou to funguje, jen občas se přenos nedokončí,
>>>přesněji, ukončí předčasně. Nehlásíá se µádné chyb, jen se přenese
>>>míň neµ jsme zadával.
>>>
>>>Pokud na označené řádce kontroluju status Tx, tak to funguje.
>>>
>>>Délka dat pro oba kanály je inicializovaná ze stejné proměnné.
>>>Proč záleµí na tom který kanál testuju, kdyµ by oba měly z principu
>>>přenést stejné mnoµství dat?
>>>
>>>Tomá±
>>>



Další informace o konferenci Hw-list