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.

DMA+SPI - zakłócanie pracy 2 urządzeń na wspólnej magistrali

aplov 28 Sty 2018 15:37 501 6
  • #1 28 Sty 2018 15:37
    aplov
    Poziom 6  

    Witam,
    Napisałem sobie sterownik do obsługi wyświetlacza OLED opartego na sterowniku SSD1306.
    Komunikuję się z nim poprzez SPI (8MHz). Na tej samej magistrali znajduję się również IMU(LSM330DLC).
    Aby usprawnić prace uC(xmega128a3u 32MHz), chciałem wykorzystać DMA do przesyłania 1024 jedno bajtowych elementów tablicy(bufora oleda). Udało mi się w taki sposób odświeżać obraz lecz problem pojawił się gdy chciałem odczytać rejestry z IMU.
    Przed odczytem rejestrów IMU sprawdzam czy kanał DMA jest włączony(wyczytałem z dokumentacji, że kanał wyłącza się po zakończonej transakcji).
    Niestety jedyne co otrzymuje po odczycie rejestru to 255. Gdy "ręcznie" przesyłam bufor do OLEDa, rejestry zwracają poprawne wartości.
    Po zakończeniu transakcji resetuje(DMA.CH0.CTRLA=DMA_RESET_bm;) i zeruje flagę(DMA.CH0.CTRLB=DMA_CH_TRNIF_bm;) w przerwaniu, a przed rozpoczęciem konfiguruje DMA ponownie.

    Przesyłanie bufora:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerwanie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 6
  • Pomocny post
    #2 28 Sty 2018 16:11
    tmf
    Moderator Mikrokontrolery Projektowanie

    Weź pod uwagę, że koniec transferu DMA nie oznacza końca transferu SPI. SPI ma bufor, w efekcie w chwili zakończenia transferu DMA masz w nim jeden znak do nadania i drugi, który jest w trakcie nadawania.
    Poza tym wg noty transfer DMA do SPI jest dostępny tylko w trybie slave SPI. Dla master użyj UART w trybie SPI.

    0
  • #3 28 Sty 2018 16:37
    aplov
    Poziom 6  

    tmf napisał:
    Poza tym wg noty transfer DMA do SPI jest dostępny tylko w trybie slave SPI. Dla master użyj UART w trybie SPI.

    Sprawdziłem i rzeczywiście jest tak napisane, co mnie w sumie dziwi bo u mnie ten transfer działa.
    Z zastosowaniem UARTa w trybie Master SPI będę miał problem bo wszystkie połączenia są na PCB. Gdybym chciał tak zrobić musiałbym zamienić MOSI i SCK miejscami :(

    Próbowałem testowo dodać delaye po 10ms po wykryciu końca transferu DMA i następnie odczytu rejestrów IMU lecz bez skutecznie.

    0
  • #4 28 Sty 2018 16:55
    tmf
    Moderator Mikrokontrolery Projektowanie

    aplov napisał:
    Z zastosowaniem UARTa w trybie Master SPI będę miał problem bo wszystkie połączenia są na PCB. Gdybym chciał tak zrobić musiałbym zamienić MOSI i SCK miejscami

    Od tego masz rejestr REMAP.
    Zrób najpierw transmisję klasycznie, potem dopiero w to zaprzegnij DMA. Pokaż gdzie konkretnie masz problem z odczytem.

    0
  • #5 28 Sty 2018 17:47
    aplov
    Poziom 6  

    inicjalizuje UARTA w tryb spi:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie jestem pewny co do wartości BSEL(77) i BSCALE(-7). Chcę uzyskać 10 MHz.
    DMA+SPI - zakłócanie pracy 2 urządzeń na wspólnej magistrali

    Wysyłanie bajta:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odbieranie bajta:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Próbuje inicjalizacji wyświetlacza ale niestety musiałem coś źle skonfigurować. Robię to w taki sam sposób jak przy użyciu 'normalnego' SPI, tylko podmieniłem ciała podstawowych funkcji aby odpowiadały UARTowi w trybie SPi

    0
  • Pomocny post
    #6 28 Sty 2018 18:28
    tmf
    Moderator Mikrokontrolery Projektowanie

    W trybie SPI baudrate dla UART nie zawiera części odpowiedzialnej za generator frakcyjny - ze wzoru z manuala - BSEL=Fper/(2*Fbaud)-1.
    BTW, DRE to data register empty - budor masz tu 2 bajtowy + dana w nadajniku. Stąd też ten bit zmieni stan dopiero gdy wyślesz 3 bajty. Dlatego dla SPI trzeba być uważnym, aby nierozsynchronizować nadajnika z odbiornikiem. Możesz sprawdzać TXCIF - zmienia stan po każdorazowym nadaniu bajtu.
    BTW, możesz skorzystać z darmowych przykładów dla XMEGA, pobierz np. te z książki o LCD. Tam masz realizację komunikacji z kontrolerem przy pomocy SPI. Potem to uzupełnisz o DMA. Zresztą jest tam też gotowiec dla sprzęgnięcia USART z DMA w trybie SPI.

    0
  • #7 29 Sty 2018 02:11
    aplov
    Poziom 6  

    Połączyłem funkcje nadania i odbioru aby uniknąć desynchronizacji:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Inicjalizacja:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Cały czas mam problem z komunikacją :(.
    Szukałem w internecie przykładów konfiguracji USARTa tryb master SPI i praktycznie ta inicjalizacja, którą przedstawiłem niczym sie od nich nie różni.
    Poprawne są te funkcję ? Bo już nie wiem gdzie szukać błędu.

    0