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
- Open-drain
- Pull-up
- Pojemność i czas narastania
- Poziomy logiczne
- START, STOP i repeated START
- ACK i NACK
- Clock stretching
- Arbitraż
- Adresy
- Bandwidth i occupancy
- Typowe topologie w FC
- Objaw: urządzenia nie widać
- Objaw: sporadyczne NACK
- Objaw: SDA stuck low
- Objaw: SCL stuck low
- Objaw: magistrala działa tylko bez silników
- Objaw: błąd po hot-plug
- Objaw: konflikt adresów
- Narzędzia
- Multimetr
- Oscyloskop
- Analizator logiczny
- Skaner adresów
- Bus clear i recovery
- Reset i power-cycle peryferium
- Firmware odporne na awarie
- Segmentacja i fault containment
- I2C czy SPI lub CAN
- Procedura diagnostyczna
- Testy środowiskowe
- Logowanie
- Przykładowe przebiegi
- Typowe błędy
- Powiązane tematy
- Przypisy
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ść:
- napięcie na sensorze pod obciążeniem;
- wspólna masa i pinout złącza;
- idle SDA/SCL HIGH;
- adres 7-bit i strap;
- bus number/port w firmware;
- przebieg START i adres;
- ACK na dziewiątym takcie;
- reset/boot time sensora;
- zgodność WHO_AM_I/revizji;
- 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#
- Zmiana losowo pull-up bez pomiaru. Można przekroczyć sink current.
- Skaner jako jedyny test. ACK nie gwarantuje poprawnych danych.
- Mylenie adresu 7-bit i 8-bit. Najczęstszy błąd integracji.
- Analizator logiczny bez oscyloskopu. Ukrywa marginalne poziomy.
- Długi przewód I²C obok faz silnika. Interfejs nie jest do tego przeznaczony.
- Pasywny splitter nazwany izolacją. Pojemność i stuck LOW są wspólne.
- Retry bez limitu. Błąd sensora blokuje scheduler.
- Reset całego FC zamiast gałęzi. Niepotrzebnie traci wszystkie funkcje.
- Bus clear push-pull HIGH. Ryzyko contention i uszkodzenia.
- Ignorowanie expected NACK ostatniego bajtu. Fałszywe alarmy.
- Przyspieszenie do 400 kHz bez pomiaru rise time. Skraca margines.
- Hot-plug bez sprzętowego wsparcia. Losowa kolejność styków resetuje bus.
- Krytyczny sensor z eksperymentalnym payloadem na jednym busie. Brak fault containment.
- Brak counters w logu. Nie da się odróżnić EMI, timeout i NACK.
Powiązane tematy#
- I²C w UAV
- SPI w UAV
- Sterownik IMU od zera
- IMU w dronie
- Barometr w UAV
- Magnetometr w UAV
- EMC/EMI flight controllera
- Diagnostyka logów i wibracji
Przypisy#
- NXP, UM10204 Rev. 7, „I²C-bus specification and user manual” — warstwa elektryczna, transfer, ACK/NACK, clock stretching, arbitraż i bus clear.
- PX4, „I²C Bus Peripherals” — zastosowania w UAV, okablowanie,
i2cdetect, konflikty adresów, bandwidth i pojemność; sprawdzono 16 sierpnia 2026 r. - Texas Instruments, TCA4307 — przykład hot-swap buffera z izolacją i automatycznym stuck-bus recovery; parametry stosować według aktualnego datasheet.
- Bosch Sensortec, BMI088 — przykład wymagań interfejsu sensora inercyjnego.
- Bosch Sensortec, BMP390 — przykład interfejsu i czasów sensora ciśnienia.
- STMicroelectronics, STM32F7 reference materials — kontroler I²C MCU, GPIO open-drain, timeouty i integracja sterownika.
Źródła z centralnego rejestru
- NXP UM10204 Rev. 7: I²C-bus specification and user manual [specyfikacja pierwotna magistrali]
- PX4 Guide: I²C Bus Peripherals [dokumentacja projektu open source]
- Texas Instruments: TCA4307 Hot-Swappable I²C Bus Buffer with Stuck Bus Recovery [datasheet i materiały aplikacyjne producenta]
- Bosch Sensortec: BMI088 [datasheet]
- Bosch Sensortec: BMP390 datasheet [datasheet]
- STMicroelectronics: STM32F7 series [producent]