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

Xmega128A3U - błędna konfiguracja DMA czy błąd debugera?

Kudzu 31 Lip 2018 09:40 294 2
  • #1 17358847
    Kudzu
    Poziom 14  
    Witam,

    wymyśliłem sobie, że dane z czujnika PMSA003 będę odczytywał UARTem z udziałem DMA.
    Wygląda to zatem tak, że na poczatku:

    deklaruję tablicę o rozmiarze ramki z czujnika
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


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


    Definiuję jeszcze funkcję odpowiedzialną za rozpoczęcie pracy DMA
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I to koniec wstępu.
    Następnie, w trakcie działania programu, w odpowiednim dla mnie momencie uruchamiam taką oto funkcję
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jej zadaniem jest włączenie DMA, a następnie wysłanie do czujnika PMS żądania przesłania danych - po tym zapytaniu czujnik odpowiada ramką 32-bajtową.

    Na koniec obsługuję przerwanie od zakończenia transakcji DMA i program leci sobie dalej (obróbka danych itd.)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Problem polega na tym, że w trakcie debugowania okazuje się, iż dane w tablicy nie są właściwe. Ramka powinna zaczynać się od bajtów startu 0x44 i 0x4D, a wg debugera takie wartości pojawiają się też w środku tablicy - tak, jakby początek ramki z czujnika nie pokrywał się z początkiem tablicy.

    I teraz mam dwa podejrzenia - albo niepoprawnie skonfigurowałem DMA i coś się źle przeładowuje albo w czasie debugowania wartości zmiennych są nieprawidłowe.
  • #2 17359054
    Konto nie istnieje
    Konto nie istnieje  
  • #3 17359138
    Kudzu
    Poziom 14  
    z3planety napisał:
    Kudzu napisał:
    Wygląda to zatem tak, że po uruchomieniu zasilania:

    deklaruję tablicę o rozmiarze ramki z czujnika


    Przy każdym odpaleniu zasilania musisz pisać kod i go kompilować? Nie zazdroszczę. A jak byś sprzedał 10000 urządzeń i musiałbyś do każdego biegać przy każdym odpaleniu zasilania.

    Edytowałem.
    Ukłony.

    EDIT...

    Zrezygnowałem z DMA, którego nie jestem pewny, na rzecz przerwania i podłączyłem analizator stanów. Okazało się, że na polecenia moduł odpowiada echem (i to nie zawsze), czego nie ma w dokumentacji. Dlatego ramka po transmisji DMA była dziwna. Będę informował o postępach.
REKLAMA