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

[ATmega128][C] SPI w trybie Master

Jozin 06 Maj 2010 11:15 1462 3
REKLAMA
  • #1 8041834
    Jozin
    Poziom 10  
    Witajcie,

    Próbuję podłączyć ATmega128 z dwoma urządzeniami za pomocą intefejsu SPI.
    uC ma pracować w trybie Master. Problem pojawia się na samym początku. Analizując kod programu w symulatorze AVR Studio zauważyłem, że ATmega nie pracuje w trybie Master.

    Nie wiem w czym jest problem, ponieważ procedura włączania SPI nie jest skomplikowana, u mnie wygląda następująco:

    
       void SPI_MasterInit(void)
    	{
    	/* Ustawia MOSI i SCK jako wyścia, pozostałe w DDRB bez zmian */
    	DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
    	/* Aktywuje SPI, Tryb Master, częstotliwość sygnału zegarowego fck/16 */
    	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    	}
    


    W symulatorze AVR Studio, po wykonaniu tej czynności, SPI wygląda tak:
    [ATmega128][C] SPI w trybie Master

    Dodam, że Pin SS w ATmega ustawiony jest jako wejście, i nic nie jest do niego podpięte.

    Czy ktoś ma pomysł jak rozwiązać ten problem?
  • REKLAMA
  • #2 8041959
    nsvinc
    Poziom 35  
    1) Warto trzymac sie zasady, ze NAJPIERW konfigurujesz peryferium, a NASTEPNIE wlaczasz. u ciebie ta kolejnosc nie jest zachowana...

    2) Mastera nie powinien obchodzic stan CSa - ale jesli go obchodzi, to
    na pewno ten pin powinien byc WYJSCIEM i miec na nim ustawione 1.
    Skoro wisisz pinem w powietrzu, w rzeczyswistym ukladzie ten pin bedzie ci zbierał zakłócenia jesli bedzie on hi-Z
  • REKLAMA
  • #3 8042363
    Jozin
    Poziom 10  
    Nie ukrywam, że jestem początkujący w programowaniu uC. Każdej rady z uwagą wysłucham i dziękuję za odpowiedź.

    Odnośnie punktu 1 to rzeczywiście logika nakazuje najpierw skonfigurować, potem włączyć. Jednak procedura inicjalizacji SPI, którą zamieściłem jest identyczna jak przykład z dokumentacji ATmegi128. Wydaje mi się, że w trybie SPI urządzenie peryferyjne zaczyna odbierać/nadawać dopiero gdy CS jest w stanie niskim.
    Ja wcześniej ustawiam CS jako wyście (w stanie wysokim).

    Co do punktu 2, to pisałem o pinie SS (Slave Select). Myślałem, że informacja o tym, że nie jest do niczego podpięty, może uprzedzić czyjeś pytanie.

    Symulacja bespośrednio po tym kroku:
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); 

    Ustawia SPI odpowiednio, jednak kolejny krok kasuje znacznik przy MASTER i ustawia SPI Interrupt Flag

    Skąd takie czary?

    //EDIT
    Sprawa wyjaśniona. Gdybym lepiej czytał dokumentację to bym wiedział. Problemem był wspomniany SS. Jeżeli jest ustawiony jako wejście to uC automatycznie dezaktywuje tryb Master i przechodzi w tryb Slave. Ustawiłem SS jako wyście i problemu nie ma. Dziękuję za zainteresowanie tematem i za pomoc.


    Dręczy mnie jeszcze coś.
    W dokumentacji ATmega128 pokazany jest przykład zapisu w trybie Master oraz odczytu w trybie Slave. Nie wiem jak czytać w trybie Master. Czytałem, że komunikacja w SPI odbywa się jednocześnie, tzn odczyt następuje w czasie zapisu, ale co w sytuacji gdy muszę wysłać komunikat do urządzenia, a urządzenie na ten komunikat odpowiada?
    Jeszcze mam pytanie jak w SPI wysłać/odebrać komendę 16 bitową.
    Łączę się z zewnętrznym przetwornikiem A/C, w którym rejestr danych jest 16 bitowy. W jaki sposób to odczytać?

    Za każdą odpowiedź będę ogromnie wdzięczny.
  • #4 8042680
    nsvinc
    Poziom 35  
    dopoki odpowiada, nie mozesz wyslac innego rozkazu, a jedyne co mozesz
    to machnąć CSem, jeszcze raz wyslac rozkaz i odbierac/wysylac dane.

    Zgadza się, ze SPI jest z definicji full duplex (chociaz istnieja rozne inne wersje).

    Jak tx/rx 16bitow jak dostepne tylko osiem? Wyslij 16bitowe slowo PO OSIEM BITOW, tylko pamietaj o "endianness"...:]

    Faktycznie, jak wysylasz rozkaz do urzadzenia, to urzadzenie odpowiada na ten komunikat o ile generujesz zegary i nie machasz CSem...Wiec GDZIE JEST PROBLEM?...
REKLAMA