logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATXMega - USART w trybie MASTER SPI, wadliwie działa.

czarusgg 21 Lip 2015 01:39 1335 4
REKLAMA
  • #1 14863643
    czarusgg
    Poziom 12  
    Witam wszystkich!

    mam takie małe marzenie :) Posiadam ATXmegę 128A3U i modulik wyświetlacza oparty o ILI9341. Moduł udostępnia magistralę SPI wraz z linią dodatkową D/C.

    Wpadłem na szatański pomysł, by wykorzystać USART w trybie SPI MASTER do obsługi LCD.

    Dlaczego USART a nie SPI? Sprawa prosta, DMA nie umie współpracować z SPI MASTER, zaś z USARTem a i owszem. Pomyślałem, że zamiast wysyłać w pętli 153600 (cały ekranik) to zaprzęgnę sobie do tego DMA :) Przyrost wydajności powinien być olbrzymi. Najpierw oczywiście próby z pojedynczymi bajtami poprzez takie SPI via USART.

    No i niestety natknąłem się na problem. Prosta procedura wysłania bajtu przez takie SPI zawodzi :(

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Otóż taka konstrukcja powoduje ustawienie flagi TRANSMIT COMPLETE w rejestrze STATUS USARTA zanim jeszcze skończy się właściwa transmisja i to dużo wcześniej.

    Skoro USART posiada jedno-bajtowy bufor, stwierdziłem, że nie ma problemu, ale jednak problem jest, ponieważ przeplatane sa między sobą bajty danych i poleceń, to przez tą sytuację zmienia się w złym momencie stan linii D/C (w połowie bajtu) i wszystko szlag trafia.

    Gdy zaimplementowałem SPI softwareowo, to oczywiście wszystko działało OK. Po podłączeniu do analizatora stanów zobaczyłem, że wysłanie jednego bajtu trwa prawie 1us, także jeśli bezpośrednio po instrukcji inicjującej transmisję (USARTC1.DATA = D) dam instrukcję _delay_us (1); to tez wszystko dobrze śmiga. Ale nie jest to rozwiązanie które mnie zadowala, ponieważ całkowicie przekreśla użycie DMA.

    Próbowałem też użyć flagi USART_DRIE_bm, ale z oczywistych względów nic to nie daje, bo ta flaga przy pierwszym bajcie zapala się praktycznie od razu (bufor od razu jest opróżniany).

    Jak ktoś się spotkał z czymś takim i rozwiązał problem, to niech się pochwali i mnie wiedzą swą poratuje...

    Na poparcie moich wniosków zrzuty z analizatora:

    ATXMega - USART w trybie MASTER SPI, wadliwie działa. ATXMega - USART w trybie MASTER SPI, wadliwie działa.


    Dorzucam jeszcze sposób skonfigurowania USART'a:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam, CzarusGG
  • REKLAMA
  • #2 14863889
    -rafal-
    Poziom 15  
    Witaj CzarusGG!

    Owszem a i spotkał się ktoś i to dosłownie wczoraj na ATxmega32A4U. A szczerze to myślałem już że ja coś źle robię (może i tak jest inni się wypowiedzą) jednak jako najszybsze rozwiązanie jakie zadziałało u mnie to w przerwaniu od DMA włączenie przerwania od końca transmisji USARTA i w tym przerwaniu skasowanie flagi przerwania i wykonanie tego co potrzeba. Spróbuj i daj znać czy działa.

    Przerwanie DMA:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przerwanie końca transmisji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam Rafał.
  • REKLAMA
  • #3 14863905
    czarusgg
    Poziom 12  
    Dzięki Rafale za info. Znaczy, że Atmel to zwalił :( Ponieważ potrzebne mi jest to obsługi LCD, to i tak czekam na koniec wszelkich transmisji. W tym momencie, gra nie warta świeczki (znaczy edukacyjnie można), ale wydajnościowo, to niestety kiepsko.

    Według tmf w książce "Praktyczne projekty" na wstępie do DMA jest mowa, że zgrabna pętelka potrzebuje od CPU 6 taktów zegara, by przesłać 1 bajt.

    Tutaj sama reakcja na obsługę przerwania, prologi i epilogi zeżrą tyle mocy CPU, że szkoda gadać :(

    No ale cóż :)

    Zysk oczywiście jest we współbieżności :) Tylko zamiast 80% CPU zostaje nam ze 20% - 30%, reszta idzie na obsługę przerwań :)

    Przepraszam, musiałem sobie ponarzekać :P
  • REKLAMA
  • Pomocny post
    #4 14864161
    tmf
    VIP Zasłużony dla elektroda
    I narzekasz zupełnie niepotrzebnie. Jeśli nie masz to ściągnij przykłądy do mojej drugiej książki o XMEGA - układy peryferyjne. Tam masz przykład DMA + master SPI USART dla kart SD - jest dokładnie ten sam problem ze zmianą sygnału CS po zakończeniu ostatniej transmisji. I oczywiście jest jego rozwiązanie - przeanalizuj przykłady. Oczywiści da się uzyskać pełną moc z połączenia USART-SPI + DMA.
  • #5 14865239
    czarusgg
    Poziom 12  
    Dzięki tmf za nakierowanie.
    ponieważ na razie używam USARTA jak zwykłego SPI z ATMEG bez przerwań, wystarczyło ręcznie skasować flagę końca transmisji i zaczęło działać :)

    Pozdrawiam, także dla -rafal- jeszcze ostateczny kod wysłania bajtu :P

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    U mnie zabrakło przedostatniej linijki :)
REKLAMA