Awaria I²C w UAV rzadko ogranicza się do komunikatu „sensor not found”. Ta sama magistrala może łączyć magnetometr, barometr, czujnik airspeed i peryferium payloadu. Jeden układ trzymający SDA w stanie niskim może zatrzymać wszystkie transakcje, a zbyt wolne zbocze może dawać błędy zależne od temperatury, długości wiązki i aktywności silników. Diagnostyka musi rozdzielić warstwę elektryczną, protokół, sterownik, timing zadania oraz fizyczną wiązkę.[1][2]

I²C jest dobrym interfejsem na krótkiej płytce i dla peryferiów o umiarkowanym bandwidth. Nie jest różnicową magistralą terenową. Długi przewód biegnący obok faz silnika nie staje się niezawodny tylko dlatego, że skaner czasem widzi adres.

Spis treści#

Model awarii#

Najpierw definiuje się granice:

aplikacja/estymator
    -> sterownik sensora
    -> scheduler i driver I²C MCU
    -> kontroler/peripheral I²C
    -> pad, pull-up, złącze, przewód
    -> układ peryferyjny i jego zasilanie

„Brak danych z magnetometru” może oznaczać:

  • brak zasilania układu;
  • zły adres lub bus number;
  • NACK, bo sensor jeszcze się uruchamia;
  • SDA zwarta do GND;
  • zbyt duża pojemność i błędne zbocza;
  • sterownik czyta zły rejestr/revizję;
  • dane są poprawne, lecz odrzuca je health check;
  • scheduler nie uruchamia odczytu;
  • callback przerwania nie kończy transakcji;
  • inny układ zablokował wspólny bus.

Hipotezy bada się od najniższej warstwy, na której występuje sprzeczność. Jeżeli SCL i SDA nie mają poprawnych poziomów, analiza rejestru konfiguracyjnego sensora jest przedwczesna. Jeżeli przebieg elektryczny jest poprawny i target odpowiada ACK, wtedy przechodzi się do protokołu sterownika.

Open-drain#

SDA i SCL są liniami typu open-drain/open-collector: urządzenie aktywnie ściąga linię do stanu niskiego, ale stan wysoki powstaje przez rezystor pull-up. W stanie idle obie linie powinny być wysokie.[1]

Konsekwencje diagnostyczne:

  • brak pull-up daje pływający lub bardzo wolny poziom wysoki;
  • zbyt silny pull-up zwiększa prąd podczas LOW i może przekroczyć zdolność sink;
  • kilka modułów z własnymi pull-up łączy rezystory równolegle;
  • zwarcie jednego układu do LOW blokuje wszystkich;
  • translator poziomów musi być przeznaczony do dwukierunkowego open-drain;
  • push-pull na tej samej linii może stworzyć contention.

Logiczna „1” nie jest aktywnie wysyłana. Gdy analizator pokazuje wolne narastanie, jest to odpowiedź RC całej magistrali, nie powolny GPIO mastera.

Pull-up#

Efektywna rezystancja kilku rezystorów:

[ R_{eq} = \left(\sum_i \frac{1}{R_i}\right)^{-1} ]

Dwa moduły po 4,7 kΩ dają około 2,35 kΩ. Cztery dają około 1,18 kΩ. Przy 3,3 V i stanie LOW prąd z samych pull-up wynosi w przybliżeniu (I=V/R), czyli odpowiednio 1,4 mA lub 2,8 mA, pomijając spadek na tranzystorze.

Minimalny rezystor wynika z maksymalnego dopuszczalnego prądu sink i (V_{OL,max}):

[ R{p,min} \approx \frac{V{DD}-V{OL,max}}{I{OL,max}} ]

Maksymalny wynika z pojemności i dopuszczalnego rise time. Nie wybiera się 4,7 kΩ jako magicznej wartości bez policzenia sumy pull-up na FC, splitterze i każdym sensorze.

Pomiar rezystancji wykonuje się przy wyłączonym zasilaniu i po rozładowaniu kondensatorów. Miernik może widzieć inne ścieżki przez ESD diodes; najpewniejsza jest dokumentacja i inspekcja płyt, uzupełniona pomiarem prądu/zbocza.

Pojemność i czas narastania#

Przewody, wejścia układów, złącza i PCB tworzą pojemność (C_b). Przybliżony czas narastania open-drain jest proporcjonalny do (R_p C_b). Specyfikacja NXP określa limity rise/fall dla trybów Standard, Fast i Fast-mode Plus.[1]

W uproszczeniu dla przejścia między progami logicznymi:

[ t_r \approx 0{,}8473 R_p C_b ]

Jeżeli do istniejącej magistrali dodaje się długi przewód, (C_b) rośnie. Obniżenie (R_p) przyspiesza zbocze, ale zwiększa prąd LOW. W pewnym punkcie potrzebna jest segmentacja, buffer/accelerator albo przejście na CAN, nie kolejny mocniejszy rezystor.

Oscyloskop powinien pokazać rise time w rzeczywistym punkcie najdalszego urządzenia. Pomiar przy MCU może wyglądać lepiej niż na końcu wiązki. Sonda oscyloskopu również dodaje pojemność; długi przewód masy wprowadza ringing i fałszywe wnioski.

PX4 wskazuje nadmierną pojemność wiązki jako typowy problem zewnętrznych I²C i zaleca krótsze przewody, podział urządzeń lub bus accelerators.[2]

Poziomy logiczne#

Nominalne 3,3 V nie oznacza, że każdy sensor ma progi zgodne z każdym FC. Sprawdza się:

  • (V{IL,max}) i (V{IH,min}) targetu/controller;
  • (V_{OL,max}) przy prądzie sink;
  • czy wejścia są 5 V tolerant;
  • zasilanie pull-up, nie tylko zasilanie sensora;
  • zachowanie podczas power-off jednej strony;
  • back-power przez diody ESD.

Moduł 5 V może mieć regulator i pull-up do 5 V, mimo że sam sensor jest 3,3 V. Podłączenie do nieodpornych padów FC grozi uszkodzeniem. Translator MOSFET działa tylko przy właściwym napięciu po obu stronach i orientacji.

Przy częściowym zasilaniu sensor może ściągać linię przez strukturę wewnętrzną. Objaw „bus wstaje po odłączeniu wtyczki” wskazuje zarówno na zwarcie, jak i na błędną sekwencję power rails.

START, STOP i repeated START#

START występuje, gdy SDA przechodzi HIGH→LOW przy SCL HIGH. STOP: SDA LOW→HIGH przy SCL HIGH. W pozostałym transferze SDA powinno być stabilne, gdy SCL jest wysokie, z wyjątkiem tych warunków.[1]

Repeated START rozpoczyna kolejną fazę bez zwolnienia bus. Wiele sensorów używa wzorca:

START + address(W) + register + REPEATED_START + address(R) + data... + STOP

Sterownik zastępujący repeated START sekwencją STOP/START może działać z jednym układem, a nie działać z innym. Analizator logiczny ujawnia różnicę.

Niepełny transfer bez STOP po błędzie może pozostawić target oczekujący kolejnych bitów. Recovery powinien przywracać linie i stan peripheral MCU, nie tylko zwracać error do aplikacji.

ACK i NACK#

Po ośmiu bitach nadajnik zwalnia SDA, a odbiornik na dziewiątym takcie ściąga ją dla ACK. NACK (SDA HIGH) może oznaczać kilka poprawnych i błędnych stanów:[1]

  • brak urządzenia pod adresem;
  • urządzenie niegotowe;
  • niezrozumiana komenda/rejestr;
  • brak miejsca na dalsze dane;
  • master kończy odczyt ostatniego bajtu;
  • zbocze/zakłócenie zostało źle zinterpretowane;
  • target zresetował się w trakcie transakcji.

„NACK count” bez informacji, czy dotyczył adresu, rejestru czy finalnego bajtu, jest mało diagnostyczny. Sterownik powinien rozróżniać address NACK i data NACK oraz nie liczyć oczekiwanego NACK mastera jako awarii.

Powtarzanie transakcji natychmiast w ciasnej pętli może zablokować CPU i zwiększyć occupancy. Retry potrzebuje limitu, backoff i error state.

Clock stretching#

Target może trzymać SCL LOW, opóźniając kolejny takt, jeśli specyfikacja/tryb to dopuszcza. Controller musi odczytać rzeczywisty stan linii, nie zakładać, że po zwolnieniu jest HIGH. Timeout chroni przed nieskończonym stretchingiem.

Problemy:

  • MCU peripheral ma ograniczony lub wadliwie obsłużony stretching;
  • translator/buffer izoluje kierunek niepoprawnie;
  • sensor rozciąga zegar dłużej przy określonym pomiarze;
  • niski SCL jest błędnie rozpoznany jako zwarcie;
  • zbyt krótki timeout daje sporadyczne błędy przy temperaturze.

Datasheet sensora określa czas konwersji i stretching/ready semantics. Lepszy driver często uruchamia pomiar, czeka asynchronicznie i odczytuje później zamiast zajmować bus.

Arbitraż#

I²C obsługuje wielu controllerów. Nadajnik, który wysyła HIGH (zwalnia SDA), ale odczytuje LOW, traci arbitraż.[1] W typowym FC jeden MCU jest controllerem, lecz dodatkowy companion lub bridge może wprowadzić drugi.

Arbitration lost nie jest tym samym co noise. Jeśli występuje w single-controller system, możliwe są:

  • drugi układ rzeczywiście inicjuje transfer;
  • peripheral MCU ma zły stan po resecie;
  • SDA została ściągnięta przez zakłócenie/target w chwili HIGH;
  • driver źle raportuje bus error jako arbitration.

Nie wyłącza się detekcji arbitrażu, by „naprawić” błąd. Sprawdza się topologię i przebieg.

Adresy#

Najczęściej używany jest adres 7-bit, do którego na magistrali dołącza się bit R/W. Dokumentacja niektórych modułów podaje „8-bit write address” (np. 0xD0) zamiast 7-bit (0x68). Wpisanie 0xD0 do API oczekującego 7-bit daje brak ACK.

W logu zawsze oznacza się format:

address_7bit = 0x68
wire_write_byte = 0xD0
wire_read_byte  = 0xD1

Piny address strap mogą być pływające lub błędnie ustawione. Pull-up/pull-down na module decyduje o adresie. Skaner po resecie pomaga, ale nie zastępuje datasheet.

Bandwidth i occupancy#

400 kbit/s nie daje 400 kB/s. Każdy bajt ma dziewiąty bit ACK, są adresy, rejestry, START/STOP i przerwy. Dodatkowo sensor może wymagać oddzielnych transakcji.

Przybliżone occupancy:

[ U = \sum_i fi \cdot t{transaction,i} ]

Jeśli IMU, barometr, magnetometr, airspeed i LED driver żądają transferów, scheduler może przekroczyć budżet. Rosną latency i jitter. PX4 podkreśla, że dodanie urządzeń zmniejsza dostępne pasmo per peryferium i może powodować niestabilność.[2]

Zapas powinien obejmować retry i najdłuższy clock stretch. Bus pracujący 90% czasu w nominale nie ma miejsca na diagnostykę ani błąd.

Typowe topologie w FC#

W flight controllerze:

  • wewnętrzne IMU zwykle używają SPI dla bandwidth i osobnych chip select;
  • zewnętrzny magnetometr/GNSS module może używać I²C;
  • barometr wewnętrzny bywa SPI/I²C;
  • airspeed i rangefinder często są zewnętrzne I²C;
  • power module może używać SMBus/I²C;
  • splitter rozdziela tylko złącza, nie logiczne segmenty.

Kilka portów opisanych „I2C” może być elektrycznie tą samą magistralą. Trzeba sprawdzić schemat FC. Odłączenie jednego złącza może usuwać tylko gałąź, ale pull-up pozostają na carrierze.

W dużym UAV PX4 preferuje UAVCAN/DroneCAN dla większych odległości i wymagań transmisji.[2] To nie marketing — sygnał różnicowy, CRC, identyfikacja węzłów i fault isolation lepiej odpowiadają wiązce terenowej.

Objaw: urządzenia nie widać#

Kolejność:

  1. napięcie na sensorze pod obciążeniem;
  2. wspólna masa i pinout złącza;
  3. idle SDA/SCL HIGH;
  4. adres 7-bit i strap;
  5. bus number/port w firmware;
  6. przebieg START i adres;
  7. ACK na dziewiątym takcie;
  8. reset/boot time sensora;
  9. zgodność WHO_AM_I/revizji;
  10. konflikt z istniejącym driverem.

Jeżeli nie ma żadnych taktów, problem jest w konfiguracji/controllerze, nie w ACK sensora. Jeżeli są takty i address NACK, sprawdza się zasilanie/adres/poziomy. Jeżeli ACK jest, ale driver mówi „not found”, problem może dotyczyć następnego odczytu WHO_AM_I.

Objaw: sporadyczne NACK#

Sporadyczność nie oznacza automatycznie EMI. Koreluje się zdarzenie z:

  • throttle/RPM;
  • temperaturą;
  • aktywnością innych urządzeń;
  • częstotliwością bus;
  • ruchem wiązki;
  • spadkiem rail;
  • konkretnym rejestrem/transakcją;
  • clock stretching.

Test A/B: krótszy przewód, niższa prędkość, jeden sensor, inne zasilanie, silniki odłączone. Jedna zmienna na iterację. Jeżeli zejście 400→100 kHz pomaga, możliwy jest rise time, timing targetu lub EMI, ale to wskazówka, nie końcowa naprawa.

NACK po długim burst może oznaczać, że driver przekracza maksymalny transfer/rejestr auto-increment. NACK adresu tuż po power-up — boot time. NACK zawsze przy włączeniu ESC — rail/EMI.

Objaw: SDA stuck low#

Target mógł zostać przerwany w środku wysyłania bajtu i czekać na kolejne zegary. NXP definiuje bus clear: controller wysyła do dziewięciu impulsów SCL, aby urządzenie mogło zwolnić SDA; jeżeli to nie pomaga, używa resetu lub cyklu zasilania.[1]

Przed recovery:

  • upewnić się, że SCL może wzrosnąć;
  • wyłączyć peripheral I²C MCU i przejąć piny jako open-drain GPIO;
  • nie generować push-pull HIGH;
  • monitorować SDA po każdym impulsie;
  • zakończyć STOP, gdy linia zostanie zwolniona;
  • zresetować peripheral/driver state;
  • ponownie zainicjalizować wszystkie urządzenia na segmencie.

Dziewięć impulsów nie leczy zwarcia do masy ani uszkodzonego układu. Ciągłe generowanie recovery w locie może zajmować CPU i maskować awarię. Po limitowanej liczbie prób segment przechodzi w failed/degraded.

Objaw: SCL stuck low#

Może oznaczać:

  • target robi clock stretching;
  • target zawiesił się i trzyma clock;
  • zwarcie przewodu;
  • uszkodzony buffer;
  • controller sam pozostawił pin LOW;
  • zbyt wolne narastanie mylone ze stanem LOW.

Specyfikacja preferuje HW reset urządzeń lub power-cycle, jeśli SCL pozostaje LOW.[1] Pulsowanie SCL nie jest możliwe, dopóki inny układ aktywnie ją trzyma.

Izoluje się gałęzie. Jeżeli po odłączeniu konkretnego sensora SCL wraca, sprawdza się jego zasilanie, reset i uszkodzenie. Jeżeli nadal LOW na pustym porcie, problem jest na FC/carrierze.

Objaw: magistrala działa tylko bez silników#

Hipotezy:

  • common-mode/ground bounce między sensorami i FC;
  • capacitive/inductive coupling z faz ESC;
  • spadek 3,3/5 V z BEC;
  • reset sensora od rail dip;
  • przewód SDA/SCL tworzy pętlę z masą;
  • błędna trasa obok przewodów mocy;
  • ESD/EMI na nieekranowanym boomie.

Test obejmuje jednoczesny zapis oscyloskopem rail, SDA i SCL z triggerem na błąd. Analizator logiczny sam może pokazać „NACK”, ale nie pokaże, że HIGH spadł z 3,3 do 1,7 V.

Przewody SDA z masą i SCL z masą mogą być skręcone zgodnie z zaleceniami systemu, ograniczając pętlę; nie skręca się wyłącznie SDA z SCL bez odniesienia masy. PX4 wskazuje jakość/krótkość wiązki i właściwe pull-up jako podstawę.[2]

Objaw: błąd po hot-plug#

I²C nie gwarantuje bezpiecznego hot-plug każdego modułu. Styki łączą się w różnej kolejności, kondensator modułu obciąża rail, linie mogą zostać ściągnięte przed masą, a target startuje w połowie transakcji.

Jeżeli hot-plug jest wymagany, stosuje się dedykowany buffer/hot-swap z precharge, izolacją i sygnałem READY. TCA4307 jest przykładem bufora z izolacją segmentów i funkcją recovery stuck bus.[3]

W normalnym UAV bez wymagania hot-plug procedura brzmi: wyłączyć zasilanie przed podłączeniem. Oprogramowanie nie powinno obiecywać obsługi stanu, którego hardware nie kwalifikował.

Objaw: konflikt adresów#

Dwa targety o tym samym adresie mogą równocześnie ACK i nadawać różne dane. Ponieważ open-drain realizuje wired-AND, wynik może wyglądać jak legalny bajt, ale nie pochodzić z żadnego urządzenia. Skaner pokaże jeden adres, nie konflikt.

Rozwiązania:

  • strap adresu jednego sensora;
  • osobne magistrale;
  • I²C multiplexer/switch;
  • address translator;
  • włączanie zasilania/resetów sekwencyjnie i zmiana adresu, jeśli wspierana;
  • wybór wersji modułu z innym adresem.

PX4 wskazuje translator jako opcję, gdy urządzenia nie pozwalają zmienić adresu.[2] Translator dodaje element i konfigurację, które należy testować po resecie.

Narzędzia#

Minimalny zestaw:

  • schemat/pinout oraz datasheet targetu;
  • multimetr;
  • oscyloskop co najmniej 2–4 kanały z sondami ×10;
  • analizator logiczny z dekoderem I²C;
  • kontrolowane zasilanie z limitem prądu;
  • breakout/fixture umożliwiający dostęp do SDA/SCL/rail;
  • firmware z licznikami błędów i testem drivera;
  • zapasowy sensor/krótki przewód do A/B.

„Sonda wciśnięta w JST” łatwo robi zwarcie. Fixture powinien mieć punkty testowe i ground spring. Dla testu wibracyjnego przewody pomiarowe muszą być odciążone.

Multimetr#

Przy wyłączonym zasilaniu:

  • ciągłość SDA/SCL/GND;
  • zwarcie do GND/VDD;
  • przybliżona rezystancja pull-up;
  • poprawność pinów.

Przy włączonym:

  • rail na FC i przy sensorze;
  • idle SDA/SCL;
  • spadek masy/rail pod obciążeniem.

Multimetr uśrednia szybkie transakcje. Odczyt 2,1 V na aktywnej linii może być poprawną średnią lub błędem — oscyloskop rozstrzyga. Multimetr służy do statycznej warstwy, nie dekodowania.

Oscyloskop#

Mierzy się:

  • (V{HIGH}), (V{LOW});
  • rise/fall time;
  • overshoot/undershoot;
  • ringing;
  • częstotliwość SCL;
  • długość stretching;
  • rail równocześnie z błędem;
  • zależność od RPM/temperatury.

Trigger można ustawić na runt pulse, długi LOW albo spadek rail. Segmented memory zbiera rzadkie zdarzenia. Dekoder oscyloskopu pomaga, ale najpierw ocenia się analogowy kształt.

Sonda ×1 ma większą pojemność i może „naprawić” lub pogorszyć bus. Używa się ×10/active probe, krótkiej masy i dokumentuje obciążenie pomiarowe.

Analizator logiczny#

Pokazuje adresy, R/W, ACK/NACK, dane, repeated START i timing między transakcjami. Próg wejściowy analizatora musi odpowiadać napięciu bus. Tani analizator 5 V może błędnie interpretować 1,8/3,3 V.

Korzystne dekodowanie:

t=12.345678 START
ADDR 0x68 W ACK
DATA 0x75 ACK
RESTART
ADDR 0x68 R ACK
DATA 0xD1 NACK
STOP

To odpowiada odczytowi WHO_AM_I. Jeżeli wartość różni się od datasheet, sprawdza się rewizję, adres rejestru, bank i to, czy ostatni NACK jest oczekiwanym zakończeniem odczytu.

Analizator cyfrowy może pokazać czyste ramki mimo analogowych marginesów bliskich limitu. Łączy się go z oscyloskopem.

Skaner adresów#

PX4 udostępnia i2cdetect -b <bus> do listowania urządzeń na określonym busie.[2] Skaner potwierdza ACK adresu, ale nie:

  • poprawność danych;
  • brak konfliktu dwóch targetów;
  • właściwy timing przy docelowym obciążeniu;
  • drożność sensora fizycznego;
  • stabilność w locie.

Niektóre urządzenia reagują źle na skan wszystkich adresów/rejestrów. Skaner powinien używać bezpiecznej metody i być uruchamiany świadomie, szczególnie na SMBus/power devices.

Bus clear i recovery#

Recovery jest maszyną stanów:

ERROR/TIMEOUT
 -> disable peripheral
 -> sample SDA/SCL
 -> if SDA low and SCL high: up to 9 SCL pulses
 -> generate STOP if possible
 -> reset peripheral I2C
 -> reinitialize target drivers
 -> verify WHO_AM_I/data
 -> HEALTHY or FAILED

Wielokrotne próby muszą być limitowane. Każdy recovery jest logowany z powodem, liniami początkowymi, liczbą pulsów i wynikiem. Jeśli zdarzenia rosną, maintenance flag blokuje lot.

Podczas ręcznego bit-bang piny pozostają open-drain. Ustawienie GPIO push-pull HIGH, gdy target trzyma LOW, może uszkodzić układ. Sekwencja musi być testowana na fixture z wymuszonym stuck target.

Reset i power-cycle peryferium#

Najlepszy fault containment daje osobny reset lub load switch dla zewnętrznego sensora. MCU może:

  • odłączyć segment;
  • przywrócić wspólny bus;
  • power-cycle tylko wadliwe peryferium;
  • ponownie sprawdzić ID i konfigurację.

Wspólny rail dla wszystkich sensorów oznacza, że power-cycle airspeed resetuje także compass i rangefinder. Estymator musi wiedzieć o utracie wielu źródeł. Sekwencja nie może zostawić linii zasilanych przy wyłączonym VDD targetu — back-power.

Reset programowy przez rejestr nie działa, gdy bus jest zablokowany. HW reset/power switch jest niezależną ścieżką.

Firmware odporne na awarie#

Driver nie powinien blokować głównej pętli do nieskończoności. Wymagania:

  • timeout każdej transakcji;
  • asynchroniczny state machine lub bounded wait;
  • limit retry i exponential/fixed backoff;
  • rozróżnienie błędów address/data/bus/arbitration/timeout;
  • health based on recent success, nie jeden odczyt;
  • timestamp danych;
  • reinit po recovery;
  • counters dostępne w logu/GCS;
  • watchdog niezależny od bus drivera.

Przykładowa logika:

if (i2c_read_reg(dev, REG_STATUS, &value, timeout_us) != I2C_OK) {
    dev->consecutive_errors++;
    schedule_retry(dev, bounded_backoff(dev->consecutive_errors));
    if (dev->consecutive_errors >= RECOVERY_THRESHOLD) {
        request_bus_recovery(dev->bus);
    }
    return;
}
dev->consecutive_errors = 0;
publish_sample(value, sample_timestamp);

To pseudokod, nie gotowy driver. request_bus_recovery musi koordynować wszystkie urządzenia na busie, aby żaden task nie rozpoczął transferu podczas pulsowania.

Segmentacja i fault containment#

Krytyczne sensory nie powinny dzielić jednego zewnętrznego segmentu z eksperymentalnym payloadem. Strategie:

  • osobne kontrolery I²C MCU;
  • switch/multiplexer z izolacją kanałów;
  • buffer z stuck-bus isolation;
  • load switch per gałąź;
  • ważne sensory na SPI;
  • odległe sensory na DroneCAN;
  • redundantne sensory na różnych bus/power domains.

Splitter pasywny nie izoluje. Wszystkie gałęzie nadal widzą stuck LOW i sumują pojemność/pull-up.

TCA4307 pokazuje klasę elementów wykrywających stuck bus i generujących recovery clock po izolowanej stronie.[3] Użycie konkretnego bufora wymaga zgodności napięć, pojemności, timeoutów i testu power sequence.

I2C czy SPI lub CAN#

Kryterium I²C SPI DroneCAN
przewody sygnałowe 2 wspólne clock + dane + CS per device para różnicowa
addressing w protokole chip select node/message ID
fault jednego device może blokować bus zwykle ograniczony CS/MISO izolacja węzła zależna od transceivera
odległość krótka bardzo krótka PCB wiązka pojazdu
bandwidth niski/średni wysoki średni, arbitrażowany
CRC nie w bazowym I²C zależy od protokołu w ramce CAN
hot-plug nie domyślnie nie zależy od projektu

IMU o wysokim rate zwykle lepiej umieścić na SPI. Zewnętrzny compass blisko FC może być I²C. Airspeed na skrzydle dużego UAV — często CAN. Wybór rozwiązuje klasę problemu wcześniej niż późniejszy debug.

Procedura diagnostyczna#

1. Odtworzenie#

Zapisz firmware, konfigurację, temperaturę, zasilanie, liczbę urządzeń, długość wiązki i trigger. Nie zaczynaj od przypadkowej wymiany części.

2. Inspekcja#

Pinout, masa, przetarcia, złącza, pull-up modules, ślady wilgoci, pęknięcia lutów.

3. Statyczne poziomy#

Rail, idle SDA/SCL, rezystancja do VDD/GND przy power-off.

4. Prosta topologia#

FC + jeden sensor + krótki przewód. Jeśli działa, dodawaj elementy pojedynczo.

5. Analogowy przebieg#

Rise/fall, HIGH/LOW, rail, ringing przy docelowej częstotliwości.

6. Protokół#

Adres 7-bit, ACK, rejestr, repeated START, bytes i timeouty.

7. Obciążenie#

Włącz wszystkie sensory, logowanie, payload i docelowe rates. Zmierz occupancy.

8. Środowisko#

Silniki, temperatura, wibracje, ruch wiązki, RF.

9. Recovery#

Wymuś stuck SDA/SCL na fixture i sprawdź bounded recovery/failsafe.

10. Regression#

Test automatyczny z liczbą cykli, zerowym nieoczekiwanym NACK i trendem marginesów.

Testy środowiskowe#

Wibracje#

Monitoruje się nie tylko utratę ACK, ale liczbę edge errors, resetów i zmian rail. Luźny JST może przerywać zasilanie na mikrosekundy wystarczające do resetu sensora.

Temperatura#

Pull-up i progi zmieniają się, oscylator targetu oraz boot time także. Test cold start, hot soak i gradient — sensor na zewnątrz, FC wewnątrz.

EMI#

Praca napędów przez zakres throttle, aktywność nadajnika, obciążenie serw. Trigger na NACK/rail dip. Nie przeprowadza się nielegalnego promieniowania; stosuje się stanowisko i dopuszczone warunki EMC.

Wilgoć#

Kondensacja obniża rezystancję, a zanieczyszczenia tworzą leakage. Conformal coating zmienia pojemność i utrudnia serwis, więc po aplikacji ponawia się pomiary.

Logowanie#

Minimum per bus:

  • transaction count;
  • bytes i occupancy;
  • address NACK;
  • data NACK;
  • timeout;
  • bus error;
  • arbitration lost;
  • recovery attempts/success;
  • max transaction latency;
  • current bus speed;
  • lista urządzeń healthy;
  • reset reason per sensor, jeśli dostępny.

Event powinien zawierać bus, address, operation/register i timestamp. Nie loguje się każdego poprawnego bajtu w locie, bo zmienia timing; pełny trace jest trybem diagnostycznym.

W logu lotu koreluje się błędy z IMU clipping, rail voltage, throttle, temperature i estimator health. „Compass unhealthy” bez countera I²C nie rozstrzyga, czy problem był magnetyczny czy komunikacyjny.

Przykładowe przebiegi#

Poprawny odczyt rejestru#

SCL: _|‾|_|‾|_ ...
SDA: START  0x76 W ACK  REG ACK  RESTART  0x76 R ACK  DATA NACK STOP

Ostatni NACK od mastera kończy jednobajtowy odczyt i jest poprawny.

Address NACK#

START 0x76 W NACK STOP

Sprawdź adres, zasilanie, boot time, progi i połączenie.

SDA stuck#

SDA: ______________________
SCL: ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾

Jeżeli SCL HIGH, możliwy bus clear. Jeśli SDA nie zwalnia po dziewięciu taktach, reset/power isolation.

Slow rise#

SCL: _/''''\_/''''\_

Zaokrąglone narastanie przekracza próg późno, skracając effective HIGH. Mierz (t_r), pojemność/topologię i pull-up.

Rail reset#

VDD: 3.3V -> 2.1V -> 3.3V
I2C: ACK... NACK... device reappears after boot

To awaria zasilania widoczna jako błąd I²C, nie problem adresu.

Typowe błędy#

  1. Zmiana losowo pull-up bez pomiaru. Można przekroczyć sink current.
  2. Skaner jako jedyny test. ACK nie gwarantuje poprawnych danych.
  3. Mylenie adresu 7-bit i 8-bit. Najczęstszy błąd integracji.
  4. Analizator logiczny bez oscyloskopu. Ukrywa marginalne poziomy.
  5. Długi przewód I²C obok faz silnika. Interfejs nie jest do tego przeznaczony.
  6. Pasywny splitter nazwany izolacją. Pojemność i stuck LOW są wspólne.
  7. Retry bez limitu. Błąd sensora blokuje scheduler.
  8. Reset całego FC zamiast gałęzi. Niepotrzebnie traci wszystkie funkcje.
  9. Bus clear push-pull HIGH. Ryzyko contention i uszkodzenia.
  10. Ignorowanie expected NACK ostatniego bajtu. Fałszywe alarmy.
  11. Przyspieszenie do 400 kHz bez pomiaru rise time. Skraca margines.
  12. Hot-plug bez sprzętowego wsparcia. Losowa kolejność styków resetuje bus.
  13. Krytyczny sensor z eksperymentalnym payloadem na jednym busie. Brak fault containment.
  14. Brak counters w logu. Nie da się odróżnić EMI, timeout i NACK.

Powiązane tematy#

Przypisy#

  1. NXP, UM10204 Rev. 7, „I²C-bus specification and user manual” — warstwa elektryczna, transfer, ACK/NACK, clock stretching, arbitraż i bus clear.
  2. PX4, „I²C Bus Peripherals” — zastosowania w UAV, okablowanie, i2cdetect, konflikty adresów, bandwidth i pojemność; sprawdzono 16 sierpnia 2026 r.
  3. Texas Instruments, TCA4307 — przykład hot-swap buffera z izolacją i automatycznym stuck-bus recovery; parametry stosować według aktualnego datasheet.
  4. Bosch Sensortec, BMI088 — przykład wymagań interfejsu sensora inercyjnego.
  5. Bosch Sensortec, BMP390 — przykład interfejsu i czasów sensora ciśnienia.
  6. STMicroelectronics, STM32F7 reference materials — kontroler I²C MCU, GPIO open-drain, timeouty i integracja sterownika.

Źródła z centralnego rejestru

  1. NXP UM10204 Rev. 7: I²C-bus specification and user manual [specyfikacja pierwotna magistrali]
  2. PX4 Guide: I²C Bus Peripherals [dokumentacja projektu open source]
  3. Texas Instruments: TCA4307 Hot-Swappable I²C Bus Buffer with Stuck Bus Recovery [datasheet i materiały aplikacyjne producenta]
  4. Bosch Sensortec: BMI088 [datasheet]
  5. Bosch Sensortec: BMP390 datasheet [datasheet]
  6. STMicroelectronics: STM32F7 series [producent]