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

Tomáš Hamouz hamouz na divesoft.cz
Čtvrtek Září 15 10:42:06 CEST 2016


> 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?

Jsou to dva problémy. Jednat detekovat zakopnutí, abych mohl přečíst
registry, a to mne nenapadá jak.
Potom přečíst počet přenesených bytů, a to naráží na podivnosti DMA
kontroléru. Pole TC (Terminal Count) v registru DMA_CCx se chová dost nezvykle.

Už jsem si na tom nabil hubu, než se mi podařilo DMA vůbec rozeběhnout,
konkrétně Tx stranu. Problém byl v tom, že jsem používal dodanou
knihovnu (no comment), a pomocí ní se registr DMA_CC nastavuje nadvakrát,
nejdřív většina polí a potom se nastavuje bit SourceIncrement či DestinationIncrement.
Implementace tak že se udělá OR nebo AND se stávající hodnotou.
Ovšem pokud je kanál zastavený (což při konfiguraci být musí), tak se
při čtení v poli TC vrátí NULA, i když byl předtím na nějakou hodnotu nastavený.
A protože je OR implementovaný jako  read-modify-write, pole TC se
elegantně vynuluje a následně se DMA přenos vůbec nespustí.

K věci: zkusil jsem vypisovat pole TC po ukončení přenosu, konkrétně
mezi čekáním na dokončení přenostu SPI a ručním disablováním kanálu.
Většinou se přečetla nula, ale občas se přečetla jiná, nenulová
hodnota, ač data byly v pořádku. V takovém příadě se hodnoty Tx a Rx
lišily o 1.


Ještě zkusím počítat počet přenesených bytů ne z TC, ale z příslušné
adresy. Ty se snad chovají determinističtěji.



> 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?

Původně se nekontrolovalo nic, nenapadlo mě že by zde mohlo dojít
k chybě. Kontroly byly výše, kde se kontrolovalo CRC a podobně.

Teď se kontroluje zda není nastaven příznak chyby přenosu.
Ani jednou se nenastavil, tak musím ještě nějak ověřit že to funguje.
Kontroluju to v registru  DMA_ERISR (Error raw interrupt status, tedy
ještě před maskováním).

Tomáš




Další informace o konferenci Hw-list