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
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:
Dorzucam jeszcze sposób skonfigurowania USART'a:
Pozdrawiam, CzarusGG
mam takie małe marzenie
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
No i niestety natknąłem się na problem. Prosta procedura wysłania bajtu przez takie SPI zawodzi
Kod: C / C++
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:
Dorzucam jeszcze sposób skonfigurowania USART'a:
Kod: C / C++
Pozdrawiam, CzarusGG