Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC32mx575 - Transfer danych SPI przy użyciu DMA

cyber90 01 Cze 2015 20:22 1884 5
  • #1 01 Cze 2015 20:22
    cyber90
    Poziom 15  

    Próbuję napisać program obsługujący SPI przy użyciu DMA, poniżej fragment kodu.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teoretycznie to powinno odczytać dane z SPI, ale brakuje wysyłania, pomoże ktoś?

    0 5
  • #2 02 Cze 2015 14:06
    94075
    Użytkownik usunął konto  
  • #3 02 Cze 2015 21:27
    cyber90
    Poziom 15  

    Tak wiem wiem. Chciałbym użyć drugiego kanału do wysyłania, ale najpierw próbuję odczytać dane z SPI. Poniżej wklejam mój kod testowy, sprawdzam w debugerze elementy TAB[]. Coś odbiera ale to jakieś przypadkowe wartości. Nie rozumiem do końca w jaki sposób działa DMA, czy za każdym razem musze wyłączać i włączać kanał? Czy za każdym razem sam pobiera wartość z Bufera SPI, jak widzi wektor przerwania odbioru SPI2.
    Jeżeli widzicie jakiś błąd proszę napisać. Jak zabrać się za wysyłanie w DMA?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 03 Cze 2015 07:56
    94075
    Użytkownik usunął konto  
  • #5 04 Cze 2015 14:44
    cyber90
    Poziom 15  

    Kod: objc
    Zaloguj się, aby zobaczyć kod

    Nie wpisałem do kodu definicji pinów do których podłączone są linie SPI.

    1. Odnośnie wysyłania po SPI, to w DCH0SSA muszę wpisać tablicę która posiada 256 elementów, czy wystarczy jedna zmienna? Wydaje mi się że wystarczy zmienna, do której przypiszę to co chcę wysyłać. A do DCH0DSA podam SPI2BUF.

    2. Odnośnie numeru przerwania to w przypadku kanału zerowego czyli odbierania danych wpisuję do CHSIRQ (chanel transfer START) 39 (SPI2 transfer bit done), czyli startuj kanał jeśli dane zostały wysłane , a w przypadku wysyłania 38, czyli startuj kanał wysyłający jeśli odbiór został zakończony? Patrzę na IRQ number , a nie na Vector number?

    PIC32mx575 - Transfer danych SPI przy użyciu DMA

    3. Czy muszę zmienić w jakiś sposó konfigurację SPI, przeglądnąłem cały SPI i nie znalazłem tam rejestrów, czy bitów odpowiedzialnych za jaką kolwiek konfigurację SPI pod kątem DMA.

    4. Globalne przerwania odblokowuje się w ten sposób? :
    Kod: objc
    Zaloguj się, aby zobaczyć kod


    5. Jeszcze jedno pytanie, jeżeli np w pętli wyślę, czyli wpiszę do SPI2BUFF jakąś zmienną, a później włączę kanał przy takiej konfiguracji:
    Kod: objc
    Zaloguj się, aby zobaczyć kod

    to tablica TAB zostanie wypełniona 256 razy elementami 4 bajtowymi? No raczej nie bo SPI działa na zasadzie rejestru przesuwnego i trzeba najpierw coś wysłać aby otrzymać odpowiedź. I właśnie tutaj się zatrzymałem i się zastanawiam jak to zrobić.
    Napisałem funkcję która wysyła po SPI dane:
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    i jeżeli w pętli while będę wysyłał odpowiednią daną to gdzie wywołać funkcję DMA_Setup() ? W main przed pętlą while? W sumie DMA jest tak skonfigurowane że po odbiorze danych powinno się wyłączyć, więc teoretycznie powinienem odebrać te 256 4 bajtowych danych? Proszę o szybką odpowiedź.

    0
  • #6 05 Cze 2015 17:36
    94075
    Użytkownik usunął konto