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

Tomáš Hamouz hamouz na divesoft.cz
Středa Září 14 09:01:23 CEST 2016


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áą
>>
>>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list