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

[Rozwiązano] Komunikacja SPI, master -> slave

karolczyzycki 23 Sty 2009 15:22 7642 13
  • #1 6042230
    karolczyzycki
    Poziom 20  
    Czy do transmisji przez SPI, master -> salve, samymi przewodami wystarczy takie połączenie jak na schemacie i programy?
    Jeśli można to proszę o sprawdzenie
    Komunikacja SPI, master -> slave
    MASTER
    $regfile = "m16def.dat"
    $crystal = 4000000
    Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
    Dim Bajt As Byte
    Bajt = 100                                                  'przykładowa wartość
    
    Spiinit
    
    Do
    Spiout Bajt , 1
    Wait 1
    Loop

    SLAVE
    $regfile = "m16def.dat"
    $crystal = 4000000
    Config Spi = Hard , Data Order = Msb , Master = no , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
    
    Dim Bajt As Byte
    Bajt = 100 'przykładowa wartość
    
    Spiinit
    
    Do
    Spiin Bajt , 1
    Wait 1
    Loop
  • #2 6042361
    d3zerter
    Poziom 12  
    no we slave trzeba zmasować ss, i mosi(slave) musi być połączony z mosi(mastera)
  • #3 6042424
    karolczyzycki
    Poziom 20  
    Jeśli chcę sterować programowo tym który jest master a który slave, to powinienem połączyć SS ze sobą?
    I wtedy w programie sterować jednym MASTER port.x=1 a w SLAVE port.x=1 a jak w drugą stronę do na odwrót?
  • #4 6042439
    d3zerter
    Poziom 12  
    jeśli chcesz w obie strony to tak było by chyba najlepiej, ale jak zmienisz ze slave na mastera w jednym to równocześnie bedziesz musiał zmienić na slave w drugim, zeby nie było przypadkiem dwóch masterów
  • #5 6042702
    karolczyzycki
    Poziom 20  
    Ale można zmienić w konfigurację w trakcie działania programu?
    Np. Dwa podprogramy w dwóch prockach. Jeden procek podprogram - nadawanie
    W tym samym czasie drugi procek jest w podprogramie odbiór.
    w podprogramach po prostu zrobić dodatkową konfigurację.
    Ale co z pinami SS jak je w takim przypadku podłączyć, se sobą?
  • #6 6042793
    d3zerter
    Poziom 12  
    no myślę że można, ale po co?? master tylko inicjuje i steruje transmisją, wymiana danych jest w obu kierunkach.
  • #7 6270009
    elvis921
    Poziom 11  
    może dzięki temu rysunkowi kolega lepiej zrozumie na czym polega istota komunikacji SPI
    Komunikacja SPI, master -> slave

    czyli jeżeli z mastera chcemy odczytać slave'a to możemy to zrobić w taki sposób: wysyłamy do slave'a 8 jakichkolwiek bitów, zawartość slave'a przesunie się do rejestru mastera. Wtedy wystarczy już tylko odczytać rejestr mastera.

    Master od slave'a różni się tylko tym że generuje zegar.
  • #8 7453728
    karolczyzycki
    Poziom 20  
    Wracam do tematu...
    Czy sprzętowym SPI można w trakcie zmieniać to który procesor ma być MASTER i SLAVE?
    Mam przykład kodu, w który nie działa i nie wiem czy taki zapis jest poprawny:
    Oba procki mają podobne kody i chciałbym żeby działały jako master (wysyłały), po wciśnięciu przycisku.
    Układ działa, wysyła, kiedy konfiguracja SPI jest, tylko jedna i na samym początku, po warunki IF, już nie działa.


    Do
    
     If Pinc.0 = 0 Then
    
           Config Spi = Hard , Master = Yes     ' master - wysyłanie, po wciśnięciu przycisku
           Spiinit                                                     
    
           Var = 10
           Spiout Var , 1
    
        Else
    
           Config Spi = Hard , Master = No      ' slave - nasłuchiwanie, gdy przycisk jest zwolniony
           Spiinit
    
           Var = 4
           Spiin Var , 1
    
     End If
    End
     Print Var
    Loop


    Czy zrobić to w taki sposób, że zapoczątkować transmisję jednym i wtedy się wymieniać? Ale w takim przypadku będe musiał cały czas "uruchomione" SPI, praktycznie nie używane.
  • #9 7454800
    czmi3l
    Poziom 14  
    Można zmieniać ustawienia MASTER/SLAVE podczas pracy programu, ale wiąże się to z połączeniem wszystkich pinów potrzebnych do transmisji SPI:

    CLK<->CLK
    MOSI<->MISO
    MISO<->MOSI
    CS <-> CS a nie CS do zasilania jak na schemacie, ponieważ możesz sobie zrobić wielką kupę podczas transmisji. Wystarczy, że przyjdzie jakieś zakłócenie na CLK i już się możesz nie zsynchronizować kiedy jest początek, a kiedy koniec bajtu.
  • #10 7456942
    BoskiDialer
    Poziom 34  
    Nikt oprócz d3zerter nie zauważył, że poprawne połączenie to MOSI<->MOSI i MISO<->MISO, czyli bez łączenia na krzyż. Wystarczy rozwinąć nazwy (Master Output/Slave Input, drugie analogicznie). W takim przypadku:
    w pierwszym poście od karolczyzycki pojawia się łączenie dwóch wyjść co jest błędem.
    W poście z rysunkiem od elvis921 wyjście od slave jest opisane jako MOSI (slave input?) co jest błędem.

    Wymiana danych przez SPI jest samo z siebie zawsze dwukierunkowe: w momencie kiedy master wysyła dane do slave, to slave drugim przewodem używając tego samego zegara wysyła dane do mastera. Co najwyżej jeden z układów może wysyłać dane nic nie znaczące (0x00, 0xFF lub poprzednio odebrany bajt).
    Master zawsze inicjuje transmisję np jeśli chce coś wysłać to wpisuje do SPI bajt, który jest następnie wysyłany. Jednak żeby coś odebrać (zgodnie z zasadą działania SPI) to musi coś wysłać - tak więc wpisuje się jakąś wartość, np 0xFF, czeka na koniec wymiany i można z SPI odczytać odebrany bajt. SPI w masterze nigdy samo z siebie nie zacznie wystawiać zegara. Tak więc raczej nigdy nie ma uzasadnienia zamiana układów rolami. Jeśli jednak, to lepiej użyć przerwania zewnętrznego w masterze, aby slave mógł poinformować, że ma coś do wysłania - przy zamianie rolami zawsze istnieje ryzyko kolizji, że oba układy będą masterami.

    -- edit: jak zwykle nie zauważyłem, że temat odgrzewany. Jakkolwiek treść na miejscu.
  • #11 7457248
    kamyczek
    Poziom 38  
    Tak jak napisał kolega źle połączone prawidlowe połaczenie to : miso-miso mosi-mosi clk-clk. Trzeba definiować kierunek działania wyprowadzeń bo przy zamianie master , slave zmienia się tylko to wyprowadzenie ,które ma być wejściem resztę trzeba zmienić samodzielnie. Dla upartych SS nie proponiję łączyć ss<->ss bo łatwo doprowadzić do stanu wyjście <->wyjście i będzie ciepło... Lepszym rozwiązaniem jest podłączenie dodatkowego wyprowadzenia z urządzenia podrzędnego ,które będzie informowało o posiadaniu danych i obsługę tego zdarzenia przerwaniem zewnętrznym od pinu np INT0. Można też wysyłać cały czas 0Xff i po odebraniu sprawdzać czy slave odesłał 0xff czy coś innego.Pozbawi to nas konieczności marnowania jeszcze jednego pinu master slave.
  • #12 7457848
    Freddy
    Poziom 43  
    elvis921 :arrow: skąd wziąłeś zati rysunek, u mnie w Bascomie w helpie jest inaczej.
    Komunikacja SPI, master -> slave
  • #13 7468421
    Nawigator
    Poziom 33  
    Freddy masz lepszy rysunek.
    Ale jest na nim mylące SHIFT ENABLE.
    Wydaje mi się że CLK powinien być podłączony do SHIFT rejestru, natomiast ENABLE do /SS czyli SLAVE SELECT.
    Naprawiłeś już to radio?

    N.
  • #14 7468632
    Freddy
    Poziom 43  
    To jest z helpa do Bascoma 1.11.9.5.
    Radio jeszcze nie, poprosiłem kolege o pomoc
REKLAMA