Jak zaprojektować i debugować niestandardowy system master-slave I2C?

10

Jak postępować, gdy potrzebujesz niestandardowego systemu master-slave I2C?

Jakie kryteria projektowe należy zastosować?

Jakich narzędzi do debugowania można użyć do rozwiązywania problemów?

Igor Stoppa
źródło
To jest pytanie referencyjne. Usunąłem kilka komentarzy, które uczyniły to mniej oczywistym. (Na pytanie pytający odpowiada).
Nick Gammon

Odpowiedzi:

10

W tym samouczku, który prowadziłem na konferencji Embedded Linux Conference, próbowano odpowiedzieć na pytania, podając linki do bardziej szczegółowego opisu poruszanych tematów i wykorzystując praktyczny przykład prowadzenia drona 4WD, w którym Arduino Mini Pro działa jako niewolnik i kontroluje 4 niezależne koła . Oryginalny dokument można znaleźć tutaj .

Uwaga: Ta odpowiedź jest obecnie w toku, ponieważ dostosowuję podświetlenia z linku.


Typowe zastosowania magistrali I2C

  • Współpraca ze stosunkowo wolnymi urządzeniami peryferyjnymi. Np .: czujniki, siłowniki mechaniczne.
  • Kontrolowanie „szybkich” urządzeń peryferyjnych, które wykorzystują inne kanały do ​​wymiany danych. Np .: kodeki.

    W komputerze system operacyjny zwykle współpracuje przez I2C z:

    • mierniki temperatury i napięcia akumulatora;
    • sterowniki prędkości wentylatora;
    • kodeki audio.

W przypadku, gdy dostępnych jest wiele kontrolerów magistrali, urządzenia peryferyjne są pogrupowane według prędkości, dzięki czemu szybkie nie są karane przez wolniejsze.


Szybkie wprowadzenie do magistrali I2C - najważniejsze cechy

  • Autobus szeregowy.
  • Tylko 2 linie: Serial CLock i Serial DAta (plus masa).
  • 4 prędkości: 100 kHz, 400 kHz, 1 MHz, 3,2 MHz.
  • Zazwyczaj 1 urządzenie nadrzędne i 1 lub więcej urządzeń podrzędnych.
  • Komunikacja jest zawsze inicjowana przez urządzenie nadrzędne.
  • Wielu masterów może współistnieć na tej samej magistrali (multi-master).
  • Otwarty odpływ: zarówno SDA, jak i SCL wymagają rezystorów podciągających.
  • „Rozciąganie zegara”
    • Master kontroluje SCL, ale niewolnik może go przytrzymać (ponieważ otwarty odpływ), jeśli musi wyregulować prędkość.
    • Kapitan musi sprawdzić ten scenariusz.
    • Niewolnik może utknąć i zablokować magistralę: potrzeba zresetowania linii z mastera do slave.
  • Zazwyczaj obsługiwane jest adresowanie 7-bitowe, ale także 10-bitowe.
  • Protokół logiczny: rzeczywiste poziomy napięcia nie są określone i zależą od poszczególnych implementacji. Np .: 1,8 V / 3,3 V / 5,0 V.

Referencyjne adresy URL:

Przykład konfiguracji magistrali

Przykład konfiguracji magistrali


Charakterystyka protokołu (uproszczony)

  • 2 typy wiadomości: odczyt i zapis
  • Bit Start / Stop - reprezentowany jako „[” i „]” w pozostałej części odpowiedzi
  • Adres: 7 lub 10 bitów
  • R / W bit: R = 1 / W = 0 Służy do rozróżnienia typu wysyłanej wiadomości.
  • Dane w autobusie: (Adres << 1 | R / W)
  • Rejestruje się jako moduły obsługi informacji w wybranym urządzeniu.

Przykład ruchu autobusowego

Przykład ruchu autobusowego Przykład cyklu zapisu magistrali Przykład cyklu odczytu magistrali Część 1 Przykład cyklu odczytu magistrali Część 2


Custom Slaves

Po co tworzyć niestandardowe urządzenia podrzędne I2C?

  • Żądany czujnik / aktuator niedostępny z interfejsem I2C.
  • Dostępnych jest mniej unikalnych adresów niż potrzebne urządzenia slave.
  • Pożądana niestandardowa funkcjonalność w slave:
    • Półautonomiczne reakcje na bodźce.
    • Filtrowanie / wstępne przetwarzanie danych wejściowych.
  • Optymalizacja mocy: niestandardowe „centrum czujników” wykonuje prace porządkowe, gdy główny procesor jest bezczynny.
  • Reakcja w czasie rzeczywistym na dane wejściowe.
  • [twoja wyobraźnia tutaj]

Jak zaprojektować niestandardowy slave I2C?

  • Zdefiniuj wymagania (patrz poprzedni slajd).
  • Wybierz mikrokontroler lub mikroprocesor.
  • Wybierz program planujący lub system operacyjny (jeśli istnieje).
  • Zdefiniuj pod-protokół komunikacji:
    • Zdefiniuj parametry i polecenia do wymiany.
    • Uporządkuj je w „rejestrach” i wybierz bezpłatny adres.

Projekt I2C Master

Kluczowe kryteria projektowe:

  • Waga / wymiary
  • Wymagana moc obliczeniowa i średnie opóźnienie.
  • Urządzenie typu PC
    • Wbudowane urządzenie, zwykle bezgłowe.
    • Preferowany język programowania: interpretowany a skompilowany.
  • Dostępność autobusów / GPIO do kierowania niewolnikami:
    • Tylko GPIO: protokół bitbang
    • I2C: aplikacja w przestrzeni użytkownika a sterownik jądra.
    • Brak dostępnych interfejsów GPIO / I2C: adapter USB na I2C.

Debugowanie: Dziel i rządź

Przejmij bezpośrednią kontrolę nad autobusem za pomocą urządzenia ad-hoc. Przykłady:

  • Bus Pirate (przydatny również w innych autobusach)
  • Adapter USB na I2C Master, również oparty na układzie FTDI FT232R.
  • Urządzenie niestandardowe (może być osobnym projektem).
  • Szpieguj magistralę za pomocą analizatora logicznego lub miernika zakresu / zaawansowanego. Przykłady:

    • sigrok / pulsview z kompatybilnym analizatorem logicznym
    • 2-kanałowy samodzielny zakres / miernik
    • Użyj specyficznego dla urządzenia podrzędnego debugera / emulatora obwodu.

      Przykład: AVR Dragon dla układów AVR (Arduino UNO, Nano, Mini, MiniPro)


BUS Pirate

Bus Pirate

  • Głównie do celów programistycznych.
  • Może zarówno wąchać autobus, jak i jeździć nim.
  • Interfejs konsoli przez port szeregowy (ttyACM), w tym makra lub programowy dostęp dla kilku języków programowania.
  • Wbudowane rezystory pullup i źródła napięcia (5 V / 3,3 V)
  • Obsługuje wiele innych protokołów.
  • Odniesienia: Wikipedia , strona główna

Adapter USB na I2C

usbtoi2c

  • Mały ślad.
  • Nadaje się do stałych instalacji.
  • Nie ma potrzeby specjalnych połączeń na hoście: można go użyć do połączenia z typowym komputerem PC.
  • Dostępny wariant, który obsługuje również SPI.
  • Brak interfejsu konsoli, tylko szeregowy protokół binarny.
  • Wymaga opakowania protokołu .
  • Odniesienie: protokół

Sigrok i pulsview

logo sigrok (komponent bakend)

sigrok

przykład impulsu (wizualizatora)

pulsview

Przykład analizatora logiki niskiej klasy

saleae

  • De facto standard dla pomiarów opartych na PC na Linuksie (ale dostępny również w innych systemach operacyjnych).
  • Obsługa szerokiej gamy analizatorów logicznych, zakresów i mierników.
  • Różne dekodery protokołów, w tym I2C.
  • Przydatne do wizualizacji sygnałów logicznych i błędów protokołu debugowania.
  • Nawet bardzo niski poziom, niedrogi sprzęt może zapewnić zupełnie nowy wymiar debugowania.
  • Odniesienia: sigrok , pulsview , obsługiwany sprzęt

Przykład: sterowanie dronem 4WD

Prototyp zbudowany przy użyciu 2 Arduino Mini Pro. Warkot


Co niewolnik robi w tym przykładzie?

Slave I2C:

  • Kontroluje wielkość momentu obrotowego przykładanego do każdego koła.
  • Kontroluje kierunek obrotów każdego koła.
  • Mierzy prędkość obrotową każdego koła za pomocą enkodera optycznego (licznik przebiegu).
  • Udostępnia powyższe parametry w I2C Master.

Rola niewolników

Schemat blokowy wysokiego poziomu urządzenia I2C Slave.


Wybór Slave: Arduino Mini Pro

MiniPro

  • Wystarczająca liczba pinów / funkcji dla każdego koła:
    • 1 wyjście PWM z niezależną konfiguracją cyklu pracy.
    • 1 GPIO do rejestracji wejścia licznika kilometrów jako IRQ.
    • 2 GPIO do wyboru:
      • Naprzód
      • Odwrócić
      • Bezczynny
      • Zamek
  • Blok I2C HW do sterowanych przerwaniami wymian i2c.
  • Dedykowane piny do programowania opartego na SPI.
  • Mały ślad.
  • Niska cena.
  • Układ płytki klonu przedstawionego na zdjęciu jest zoptymalizowany do montażu na gnieździe DIL.

ICD specyficzne dla slave'a: AVR Dragon

AVR Dragon


Wybór systemu operacyjnego: ChibiOS

ChibiOS

  • RTOS: pierwszeństwo, zadania, semafory, dynamiczny tik systemowy itp.
  • Mały ślad: link wykorzystuje tylko kod / dane.
  • Rozróżnienie między RTOS i BSP przez HAL.
  • GPLv3 do użytku niekomercyjnego.
  • Aktywnie rozwinięty, ale już dojrzały.
  • Obsługuje 8-bitowy AVR.

Jednak miał ograniczoną obsługę BSP dla AVR, brak: - przerywa sterownik dla AVR GPIO (dodano). - Obsługa I2C dla trybu podrzędnego AVR (niestandardowe). Które musiały zostać opracowane osobno jako część oprogramowania Drone SW dla AVR .


Definiowanie parametrów komunikacji

Dla każdego koła:

  • Cykl roboczy sygnału PWM użytego do jego sterowania - 1 bajt. 0xFF = maksymalny moment obrotowy / 0x00 = brak momentu obrotowego.

  • Kierunek obrotu - 1 bajt.

    • 0x00 = bezczynny
    • 0x01 = wstecz
    • 0x02 = naprzód
    • 0x03 = zablokowany
  • Średni okres między szczelinami enkodera optycznego - 2 bajty.

    • Pisanie czegokolwiek resetuje pomiar.
  • Indeks parametrów - 1 kęs:

    • 0 = cykl pracy
    • 1 = Kierunek
    • 2 = średni okres
  • Indeksy kół - 1 ostry:

    • 0 = lewy tył
    • 1 = prawy tył
    • 2 = prawy przód
    • 3 = lewy przód
    • 4 = wszystkie

Sub protokół: Definiowanie rejestrów

Format rejestru: 0xαβ - α = indeks parametru - β = indeks koła

Adres (wybrany dowolnie): 0x10

Format Bus Pirate: - [= bit początkowy -] = bit końcowy - r = bajt odczytu - czasy adresowe 2 (lewy Shift 1), dla bitu R / W


Przykład - w formacie Bus Pirate

[i2c_addr reg_addr = (parm, wheel) reg_value]

[0x20 0x20 0x02]  Left Rear Forward
[0x20 0x21 0x01]  Right Rear Backward
[0x20 0x22 0x01]  Right Front Backward
[0x20 0x23 0x02]  Left Front Forward
[0x20 0x14 0xFF]  Wheels set to max torque

Samochód obraca się zgodnie z ruchem wskazówek zegara.

Igor Stoppa
źródło