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

hamouz na divesoft.cz hamouz na divesoft.cz
Úterý Září 13 16:47:41 CEST 2016


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