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
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
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
- 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
- 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)
przykład impulsu (wizualizatora)
Przykład analizatora logiki niskiej klasy
- 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.
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.
Schemat blokowy wysokiego poziomu urządzenia I2C Slave.
- 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
Wybór systemu operacyjnego: 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.