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