Skocz do zawartości

Czy interfejs SPI zablokuje programowanie przez USBASP?


MilordGibon

Pomocna odpowiedź

Mam pytanie - czy uruchomienie i używanie interfejsu SPI do komunikacji z np. zewnętrznym EPPROM lub WiFi, zablokuje mi możliwość programowania przez USBASP, które to używa tych samych portów?

Jeszcze jedno - czy jest możliwość komunikacji kilku mikrokontrolerów ATMEGA między sobą przez ten interfejs?

Link do komentarza
Share on other sites

Dopóki na swojej płytce korzystasz z SPI wyłącznie jak z wyjścia danych, np. posadziłeś długi rejestr do sterowania 50 diodkami LED - nie ma problemu. Wejścia rejestru nie obciążają w istotny sposób linii SCK ani MOSI i jest OK. Powinieneś tylko zadbać o to, by dane z programatora nie ładowały się do rejestru bo dostaniesz oczopląsu od mrugania.

Dużo więcej uwagi trzeba zwrócić, gdy w projekcie przewidujesz dwukierunkowe lub wejściowe wykorzystanie SPI. Wtedy istnieje niebezpieczeństwo, że dane powracające po linii MISO do procesora (np. z rejestru wczytującego stan 16 czujników) znajdą się w konflikcie z danymi wysyłanymi przez procesor w trybie programowania - warto to sobie narysować. Powodem jest oczywiście zmiana kierunku linii MISO. Podczas normalnej pracy systemu jest ona wejściem do procesora, ale w czasie programowania jest wyjściem. Konieczne jest użycie "separatora" odcinającego dane przychodzące po linii powrotnej SPI od nóżki MISO procesora i programatora. Wystarczy bramka trójstanowa np. popularna 741G125 sterowana odwróconym sygnałem RESETu. Musi się ona wyłączać/blokować, gdy RESET jest w stanie niskim, bo to oznacza podpięcie programatora do złącza KANDA i jego aktywność.

EDIT:

SPI nie jest interfejsem symetrycznym. Zawsze istnieje jakiś Master i jeden lub więcej urządzęń Slave. Master generuje zegar SCK, wysyła dane na MOSI i wskazuje/wybiera odpowiedniego Slave'a do współpracy a pozostali muszą być nieaktywni. Tylko jeden Slave może w danej chwili wysyłać swoje dane po MISO do Mastera.

Blok SPI w AVR może pracować w obu trybach, więc jeśli jeden z procesorów będzie z założenia Masterem a pozostałe będą pasywnie oczekującymi Slave'ami, będzie działać. To dość poważnie komplikuje programowanie, bo programator jest kolejnym urządzeniem które chce być Masterem i musi mieć możliwość wyboru wyłącznie jednego procesora (za pomocą linii RESET) do współpracy. Normalnie Master wybiera Slave'a poprzez uaktywnienie jego wejścia SS (Slave Select), więc musi mieć tyle wyjść SS0..SSn ile Slave'ów jest w systemie.

Robiłem takie systemy, ale trzeba mieć naprawdę dobry powód by gadać z wieloma procesorami po SPI. O wiele lepszym - wręcz stworzonym do tego celu interfejsem jest I2C.

EDIT2:

Używanie scalaków specjalnie przeznaczonych do SPI (np. EEPROMów) jest łatwe, bo wtedy ich wyjście wypuszczające dane na linię MOSI jest z definicji trójstanowe i wyłącza się gdy układ nie jest wybrany. Tak więc musisz zapewnić tylko to, by linia wyboru (zwykle CS lub CE) była nieaktywna gdy procesor jest programowany. Zwykle wystarcza podciągnięcie jej do Vcc przez 10k. Procesor wychodząc z RESETu i wykonując procedurę inicjalizacji portów I/O powinien wystawić tam stan 1 a potem, na czas każdej transmisji SPI musi zrobić 0. To jest właśnie taki Slave_Select.

  • Lubię! 1
Link do komentarza
Share on other sites

Czyli w skrócie:

Podczas programowania nie może być podłączone nic, co będzie wysyłać dane do kontrolera, bo powstanie konflikt?

Ale jeśli odłączę tę dodatkowy element na chwilę, to czy programowanie zadziała? Przecież wtedy pakiety danych nie będą ze sobą kolidować, nie będą na siebie nachodzić.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To właśnie napisałem: w czasie programowania nie możesz sterować linią podłączoną do MOSI procesora.

Naprawdę chce Ci się ręcznie odłączać coś za każdym programowaniem a potem to podłączać z powrotem? To równie dobrze możesz kupić procesor w obudowie DIP i wkładać go do podstawki programatora. Nie lepiej zastanowić się chwilę jak to zrobić porządnie? Za dziesiątym razem uznasz, że to wkurzające a po 50 zaczniesz znajdować sobie powody do porzucenia projektu.

Link do komentarza
Share on other sites

UART - podobnie jak SPI - też jest niesymetryczny. Jeden nadajnik (TXD) może co prawda wysyłać dane do wielu odbiorników (RXD), ale już w drugą stronę to nie zadziała. Ten protokół służy raczej do przesyłania informacji między dwoma równoprawnymi węzłami.

Jeżeli chcesz przy pomocy UARTów połączyć wiele równoprawnych procesorów, musisz zbudować architekturę magistralową. Przy takim podejściu trzeba rozwiązać jeden podstawowy problem: arbitraż dostępu do magistrali czyli zestaw reguł wg których postępują węzły by otrzymać prawo nadawania.

W warstwie sprzętowej podłączenie wielu nadajników do wspólnej linii odbywa się poprzez zrobienie "sumy na drucie" (wired-or) czyli takiego podejścia jak w I2C (wyjścia open-collector i linia podciągana do stanu nieaktywnego rezystorem) lub poprzez bufory trójstanowe (jak w RS485). Cokolwiek wybierzesz, rozwiązania synchronizacyjne na wyższej warstwie muszą zapobiegać jednoczesnemu używaniu magistrali przez więcej niż jeden węzeł nadający. Odbierać może (i powinien) bezkarnie każdy.

Ponieważ UART - gdy już zacznie nadawać dane nie jest w stanie tego przerwać w połowie to musi "wiedzieć" wcześniej czy w ogóle może zacząć nadawać. Program nim zarządzający musi rozumieć co się na magistrali dzieje i tylko wtedy odblokowywać swój nadajnik, gdy przyjęte reguły arbitrażu na to pozwalają.

Dość prostą koncepcją jest tzw. token ring czyli metoda cyklicznego przekazywania uprawnień (tokena). Poczytaj o tym.

Szyna I2C ma wbudowany mechanizm opierający się na niesymetrii stanów linii. Każdy może wysłać na nią stan niski (0) i nawet jeśli zrobi to równocześnie kilku nadających, nie ma żadnych konfliktów elektrycznych. Arbitraż przeprowadzany jest poprzez nasłuch oraz (jeśli to nie pomoże np. przy jednoczesnych zgłoszeniach) porównywanie adresów docelowych. Moduł I2C w AVR ma to wszystko zrobione w sprzęcie więc jeśli ograniczamy zasięg do jednej płytki lub jednego niewielkiego urządzenia, jest to rozwiązanie narzucające się.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.