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