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

Tomáš Hamouz hamouz na divesoft.cz
Čtvrtek Září 15 12:24:03 CEST 2016


Tak jsem to zřejmě našel.

Chyba byla v tom, že jsem si špatně vyložil význam příznaku Active.
Ten je aktivní jen v případě že jsou ve FIFO DMA nějaká data.
Neznamená to že je kanál povolený!

Fungovalo to takto: V podstatě ihned po zahájení přenosu se
vypadlo ze smyčky čekání na DMA a čekalo se jen na idle SPI.
Stačilo nějaké škobrtnutí na sběrnici (hodně pushovaných registrů ?)
a SPI se při té rychlosti stačilo vyprázdnit. O useknutí přenosu jsem
se pak přičinil sám tím ručním (pro sichr) zastavením obou kanálů.

    while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;} <-- tady to skoro vůbec nečekalo
    while((SSP1->SR & SPI_SR_FLAG_BUSY)) {;}  <-- tady to čekalo do prvního škobrtnutí.

    DMA_ChannelCmd(SSP1_DMA_CHAN_RX, DISABLE);  <-- tady jsem si to sám zkazil

Děkuji wekovi za neustálé nakopávání kam dívat :-)


Pro zajímavost jak jsem to odhalil:
Přidal jsem na závěr porovnání pointerů, kolik se přeneslo dat. A
pokud byla hodnota jiná než jsem předpokládal, tak se vypsalo debug
hlášení. K tomu se zacvičilo za pin, který sloužil jako post
trigger pro LA.
K mému údivu i v případech kdy se hlásila chyba přenos doběhl do
konce, jen zaškobrtnutí bylo někde uprostřed. Tím mi došlo že
předčasné ukončení si opravdu dělám sám a pak už jsem jen hledal proč
je Active bit nulový.

Tomáš




> Aha, a este jedna otazka: ak nastane to zakopnutie, v Rx buffri je kolko
> dat - tolko kolko bolo prenesene pred zakopnutim, alebo sucet toho pred a
> po zakopnuti?

> Mierim na pripad, ze nastane nejaka chyba na Rx DMA. Mimochodom, je taka
> chyba nejako osetrovana (prerusenim)? Co presne kontroluje ta funkcia na
> koniec prenosu?

> wek




Další informace o konferenci Hw-list