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

[atmega8][c]magistrala SPI dla dwóch urządzeń

24 Mar 2009 19:01 3371 8
  • Poziom 9  
    Witam

    mam problem z w/w magistralą SPI. Do portu B na tych liniach podpięte są dwa układy: CC1000PP i DS3234. Z SPI korzysta tylko DS3234. Pin CS z DS'a podpięty jest do pinu PC1, reszta wyjść magistrali jest podpięta do odpowiednich pinów DS'a (MOSI do DIN a MISO do DOUT), CC1000PP nie korzysta z SPI do komunikacji z układem (wiem że może ale nie korzysta) ale pin PB2 (SS) z atmegi jest podpięty do wejścia PDATA z CC1000PP. Całość działa następująco: jeśli mam włożony CC1000PP w port to układ nie może wyjść poza inicjalizację SPI, jeśli wyjmę CC to wszystko przebiega bez problemu, jeśli zakomentuję obsługę DS'a to CC działa bez problemu. Po paru twardych resetach całość "zaskakuje" i zaczyna działać...
    - w funkcji do obsługi DS'a (a tym samym SPI) mam wyraźnie zaznaczone czy SPI ma być aktywne czy nie (przez wpisanie odpowiedniego bitu do SPCR = (1<<SPE)|(1<<MSTR)itp i wyłączenie przez SPCR &=~(1<<SPE))
    - przeczytałem parę razy czy pin PB2 (SS) może być używany (tak może być ustawiony dowolnie nawet gdy SPI działa ale tylko w trybie master - innego nie używam i tak) ale na wszelki wypadek wyłączam SPI aby się porozumieć z CC
    Moje pytanie na chwilę obecną jest następujące:
    - czy SPI w trybie master może korzystać z pinu PB2 (SS) do czegokolwiek czy mogę korzystać z innego pinu by używać SPI
    - czy używając pinu PB2 (SS) do innych funkcji niż SPI będzie powodować jakieś dziwne zachowania całego układu??

    Wiem że to dużo informacji na jeden raz i mogłem co pomieszać, proszę pisać w razie potrzeby wyjaśnienia czegoś. Jeśli chodzi o newralgiczne fragmenty programu to mogę oczywiście zamieścić tak jak i schemat.

    Pozdrawiam.
  • Poziom 24  
    Linia SS jest normalnym portem I/O. W nowszych rdzeniach implementowane są automatyczne "maszyny" do zmiany urządzenia, ale dla AVR z rodziny mega i tiny można go wykorzystać w dowolny sposób. Wyboru urządzenia do komunikacji przez SPI można również dokonywać przez dowolny port mikrokontrolera.

    Oznaczenie SS oznacza port mikrokontrolera wymagany do rozpoznania trybu pracy urządzenia realizującego zarówno transmisję master jak i slave. Od stanu tego portu zależy w jaki sposób będzie zachowywał się mikrokontroler i jaką będzie pełnił rolę. Na jednej magistrali SPI nie może znajdować się więcej niż jeden układ master, dlatego każdy powinien mieć możliwość przełączenia pozostałych układów w tryb slave(device) w celu komunikacji z master'em lub przełączenie ich w tryb pasywny, aby nie wywoływały błędów transmisji.
  • Poziom 34  
    Dokumentacja mówi wyraźnie:
    atmega8.pdf napisał:
    Master Mode
    ...
    If SS is configured as an input, it must be held high to ensure Master SPI operation.

    Jeśli pin PB2(SS) jest wyjściem, może normalnie zostać wysterowany. Jeśli jednak jest wejściem, jest silnie zależny od SPI i jakakolwiek zmiana na stan niski będzie powodować przełączenie się SPI w tryb slave.
  • Poziom 13  
    Dorzucając trzy grosze do zdania wyżej , to radze nie ignorować tego i pamiętać o tym szczególe . Swojego czasu nie jedną godzine spędziłem na sprawdzaniu czemu SPI się "zawiesza " . Chodziło oczywiście o przełączenie z trybu Master na Slave.
  • Poziom 43  
    A ja straciłem na to może kilkadziesiąt godzin. Teraz trzymam się od pinu SS z daleka. Trzeba go ustawić jako wyjście i nadać mu stan wysoki i więcej go nie dotykać.
  • Poziom 27  
    W zasadzie kolego ten pin możesz używać do woli do innych celów pytanie tylko do jakich ? Przed rozpoczęciem transmisji musisz na niego podać logiczne "0" które wskazuje podłączonym układom SPI które w danej chwili jest wybrane aby obsługiwać bieżącą transmisję. Pin SS musisz obsłużyć "ręcznie" to nie jest tak że uP sam zadba o jego aktywację. Z tego też powodu pod pozostałe linie SPI możesz podpiąć wiele różnych układów i takich SS-ów zdefiniować sobie wiele jednak który układ będzie w danej chwili obsługiwany zależy już od programu sterującego który będzię kolejno podawał logiczne "0" na odpowiedni SS dla stosownego układu SPI. Teraz sobie wyobraź że pod twój SS jest podpięta np dioda LED która coś tam ma sygnalizować. Jakaś część programu go zapala a tymczasem inny fragment programu aktywuje do transmisji układ SPI któremu ten pin jest przy okazji "użyczony". Ponieważ pojawia się tam "0" LED zgaśnie. Czyli trzeba by cały czas stanu tego pinu pilnować. Praktycznie nie widzę powodu dla takiej komplikacji więc pin-y SS powinno się stosować tylko na potrzeby transmisji SPI i zarezerwować ich taką ilość ile jest obsługiwanych układów SPI. Jeśli masz za mało końcówek procesora użyj może innego zamiast martwić się o to jak wydolić na wszystkie pinowe potrzeby.
  • Poziom 9  
    Witam,

    jak już napisałem: tylko jedno z urządzeń korzysta z SPI i tylko wtedy gdy wpiszę do odpowiednich rejestrów że SPI ma być aktywne - bez tego pin SS to standardowe we/wy przecież...chyba że się mylę i sama aktywność na tym pinie może powodować że układ "myśli" że coś ma się dziać za pomocą SPI??????

    Poza tym jak również napisałem wcześniej jak nie ma inicjalizacji układu który korzysta z SPI to da się rozmawiać z innym urządzeniem za pomocą tego portu...

    Mam nadzieję że trochę rozjaśniłem :)

    Pozdrawiam
  • Poziom 27  
    Popatrz w notę tam powinno być napisane co się stanie kiedy podasz "0" na SS i układ zacznie "myśleć". Może np. otworzyć sobie porty 3-stanowe więc takie zachowanie może spowodować "myślenie" innych układów. SPI jest proste jak konstrukcja cepa.
    Twój pin SS kiedy pojawi się tam zero daje tym samym sygnał do odbiornika że ma przygotować się na transmisję. Zasadnicza transmisja nastąpi wtedy kiedy wpiszesz jakąkolwiek liczbę w nadawczy rejestr uP. Wtedy uruchomiony zostaje zegar i w takt jego idzie 8 bitów transmisji szeregowej. Działa to w dwie strony bo jednocześnie układ Slave wysyła swoje bity do uP (oczywiście jeśli ma do tego odpowiednie wyjście) . Zatem nie można sobie do SS podłączać dowolnych układów bo ten pin jest zarezerwowany do transmisji SPI.Na twoim miejscu zastanowiłbym się czy ten scalak który masz podpięty pod magistralę SPI a z niej nie korzysta nie powoduje przypadkiem wymuszenia jakiś poziomów logicznych podczas trwania transmisji do scalaka który jej akurat używa. Możesz wówczas ustawiać SS jak się należy ale masz zakłócony przepływ danych na samej magistrali.
  • Poziom 9  
    Witam,

    dzięki za wskazanie kierunku - najprawdopodobniej całkowicie wyeliminuje ten pin z jakichkolwiek połączeń dla świętego spokoju :) Jeśli poprawi w jakiś sposób zmieni to działanie układu to napiszę :)

    Pozdrawiam