Ukončení přenosu využitím DMA
Jan Waclawek
konfera na efton.sk
Úterý Září 13 17:16:39 CEST 2016
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