Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

I2C - Odporność na zakłócenia

kamill_94 11 Lip 2017 11:35 993 15
  • #1 11 Lip 2017 11:35
    kamill_94
    Poziom 4  

    Witam.
    Mam pytanie dotyczące I2C, jego odporności na zakłócenia, odłączanie i podłączanie urządzeń i2c w trakcie pracy, oraz tego, jak radzić sobie z obsługą I2C w takich warunkach.
    Mam układ który używa I2C do komunikacji z wyświetlaczem HD44780 oraz z czujnikiem temperatury. Układ działa całkiem poprawnie, ale chciałbym, aby był odporny na sytuacje kiedy jedno z urządzeń na szynie I2C zostanie odłączone (czujnik temperatury planuję zastosować na odłączanym przewodzie) i za każdym razem w takiej sytuacji wykryć błąd transmisji. W obecnej sytuacji, gdy odłączę linie sda i scl od czujnika temperatury, to w większości sytuacji wykrywam błąd transmisji, ale co któryś raz pada całkiem transmisja na i2c, przestaje działać wyświetlacz i mikrokontroler się zawiesza. To samo dzieje się, gdy zostawię linie sda i scl podłączone do czujnika, a odłączę jego zasilanie. Wtedy za każdym razem uniemożliwiona jest transmisja po i2c. Czy da się jakoś zapobiegać tego typu sytuacjom? Czy prościej będzie poprostu zadbać o to, aby przypadkowe odpięcie czujnika temperatury było niemożliwe? ;)

    Dodam, że do obsługi I2C używam biblioteki Peter Feury's dostępnej pod linkiem:
    Biblioteka I2C

  • Pomocny post
    #2 11 Lip 2017 12:33
    michalko12
    Specjalista - Mikrokontrolery

    Może zdarzyć się stan zawieszenie I2C, gdy jedno z urządzeń slave jest w stanie wysyłania danych i czeka na kolejny cykl na SCL od masrtera trzymając linię SDA w stanie niskim. Jeśli master w tym momencie chce wygenerować sygnał START, to ze względu na arbitraż jest to nie możliwe i kontroler I2C zwraca odpowiedni status. Wtedy w przypadku AVR trzeba softwarowo podawać zegar na linię SCL do momentu pojawienia się stanu wysokiego na SDA, a następnie wygenerować sygnał STOP. Po takiej sekwencji magistrala jest znowu zdatna do obsługi przez hardwarowe I2C.

    Tak na szybko sprawdziłem i nie jestem tego do końca pewien... Jeśli jest na I2C jeden master i kontroler I2C zwróci status = 0x38 to wtedy trzeba softwarowo zresetować magistralę I2C.

  • #3 11 Lip 2017 12:46
    trol.six
    Poziom 30  

    kamill_94 napisał:
    To samo dzieje się, gdy zostawię linie sda i scl podłączone do czujnika, a odłączę jego zasilanie.

    Jak zewrzesz linie to żadna transmisja nie będzie działać i tutaj raczej nic nie zrobisz ;) Co najwyżej możesz dać każde urządzenie na własnych kabelkach lub bufor. Stosować wtyczki które najpierw dają zasilanie. Włączanie urządzeń w trakcie działań to też skoki prądowe na zasilaniach, więc może dojść filtracja zasilania. Problem dość złożony.

    W sytuacji ogólnej, musisz wykrywać wszystkie błędy, w razie błędów wznawiać transmisje za jakiś czas. Generalnie ten interfejs nie jest przystosowany do podłączeń w trakcie, więc należałoby przemyśleć wszystkie okoliczności błędów i je obsłużyć.

  • #4 11 Lip 2017 14:21
    kamill_94
    Poziom 4  

    To odłączenie zasilania od czujnika powoduje zwarcie tych linii? :)
    Wiem, że ten interfejs nie jest przystosowany do podłączania w trakcie pracy, ale rozważam możliwość przypadkowego odłączenia/uszkodzenia połączenia. Wtedy chciałbym dostać informację na wyświetlaczu o błędzie, a nie zawieszenie urządzenia ;)

  • #5 11 Lip 2017 14:44
    trol.six
    Poziom 30  

    kamill_94 napisał:
    To odłączenie zasilania od czujnika powoduje zwarcie tych linii? :)

    Ten interfejs ma standardowo wyjścia z otwartym kolektorem. W teorii nic wielkiego nie powinno się dziać. :) A jak czujnik będzie jakiś dziwny albo uszkodzony? ;) no, może przesadzam z tą zapobiegliwością.

  • #6 11 Lip 2017 17:54
    Marek_Skalski
    Poziom 33  

    Zrobiłem kilka urządzeń obsługujących hot-plug na i2c i wszystkie zostały przetestowane dość dobrze nie wykazując uciążliwości ani uszkodzeń.
    0. Rezystory podciągające muszą być tylko po stronie mastera. Dla magistrali 3,3V używałem rezystorów 1,0k-2,2k.
    1. Urządzenia końcowe mają wstawione szeregowe rezystory o wartościach rzędu 47R-100R. Te rezystory są bezpośrednio przy gniazdach.
    2. Układy były zasilane z 5V i posiadały wewnętrzne stabilizatory na 3,3V. I2C pracowała z poziomami 3,3V.
    3. Prędkość transmisji może wymagać obniżenia, ale to zależy od odległości i jakości przewodów. Ja używałem kabli USB ze złączami USB. Stąd też pośrednio "kompatybilność" napięciowa.
    4. Obsługa I2C jest w oparciu o kolejki i automat z kontrolą czasu. Jeżeli transmisja się zawiesza na skutek odłączenia urządzenia, to magistrala jest resetowana, zadanie dostaje status TIMEOUT i host przechodzi do obsługi kolejnego urządzenia.
    5. Reset magistrali to tylko reset sprzętowego interfejsu. Jeżeli SDA jest w stanie niskim, to wysyłam ręcznie 9 impulsów zegara, aby odblokować slave'a, który utknął na wysyłaniu danych.
    6. Urządzenia obecne odpytywane są częściej, np. co 50ms-200ms, a urządzenia które wystawiły NACK są odpytywane co 1000ms-2000ms. Mając 2 mastery i max. 8 urządzeń na każdym masterze, z których każde może przesłać maksymalnie 32 bajty, wszystko działało płynnie z prędkością 50kHz na przewodach długości 1m.

  • #7 13 Lip 2017 10:47
    kamill_94
    Poziom 4  

    Dziękuję za odpowiedzi.
    Mogę wiedzieć w jaki sposób generujecie ręcznie 9 taktów zegara? Wprost poprzez operację na porcie?

  • #8 13 Lip 2017 11:00
    tmf
    Moderator Mikrokontrolery Projektowanie

    kamill_94 napisał:
    Dziękuję za odpowiedzi.
    Mogę wiedzieć w jaki sposób generujecie ręcznie 9 taktów zegara? Wprost poprzez operację na porcie?


    Tak, tylko wymaga to wcześniejszego wyłączenia interfejsu (jeśłi przejął kontrolę nad pinem) lub zmiany konfiguracji multipleksera pinu w niektórych prockach.

  • #9 11 Sie 2017 17:38
    kamill_94
    Poziom 4  

    Dopiero teraz powracam do tego tematu.
    W standardowej obsłudze I2C (z datasheet atmegi) jest taka linijka:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    która czeka na zakończenie transmisji.
    Co w przypadku gdy program utknie w tej nieskończonej pętli? Jak można to rozwiązać inaczej?

  • Pomocny post
    #10 11 Sie 2017 18:39
    Piotr Piechota
    Poziom 21  

    w pętli while dodać warunek od zmiennej liczącej czas zmniejszanej w przerwaniu timera

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #11 11 Sie 2017 20:48
    kamill_94
    Poziom 4  

    Nie potrafię znaleźć co blokuje moją pętlę główną.
    Wszystkie "while", w każdym pliku obsługuję timeoutem tak jak poradził kolega powyżej.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zmienna timeout odejmowana jest co sekundę przez timer.
    Jednak pętla główna zawiesza się podczas odlaczania/podlaczania czujnika do i2c.
    Funkcja "i2c_reset" wogóle się nie wykonuje, wiem to stąd, że napisałem sobie w niej operację na porcie która ma wystawić stan wysoki na port, co się nie dzieje.
    Timer działa na pewno, ponieważ wykonuje operacje na portach.



    EDIT:

    Zrobiłem tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz działa to dobrze, jednak chciałbym mieć kontrolę nad czasem timeout za pomocą timera. Dekrementacja zmiennej "timeoutt" w przerwaniu timera z jakiegoś powodu nie powoduje wyjścia z pętli while. Gdy dekrementowana jest wewnątrz tej pętli, tak jak w kodzie powyżej, wszystko działa dobrze.

    EDIT2:
    Zrobione. Należało zmienną "timeoutt" zadeklarować jako volatile.

  • #12 19 Sie 2017 15:46
    kamill_94
    Poziom 4  

    Witam ponownie.
    Obsługa I2C w sposób taki jak doradziliście działa bardzo dobrze. Mam jednak jeszcze jeden problem z czujnikiem.
    Potrafię już wykryć, gdy odłączone są przewody SDA lub SCL, ponieważ interfejs I2C generuje odpowiednie statusy. Problem jest jednak, gdy odłączony zostanie przewód GND. Wtedy transmisja przechodzi bez błędu, ale odczytana z czujnika temperatura wynosi ciągle 1,8 stopnia.
    Jest jakaś opcja, aby sprawdzić poprawność odebranych danych? Wtedy byłbym już całkowicie zadowolony z obsługi tego modułu :)
    Dodam, że moduł, który obsługuję to MCP9808.

  • #13 20 Sie 2017 14:26
    R-MIK
    Poziom 37  

    kamill_94 napisał:
    Problem jest jednak, gdy odłączony zostanie przewód GND

    Podciągnij, przy czujniku, IIC do zasilania rezystorami rzędu 100k. Może pomoże?
    Jak nie, to jeśli nie używasz rejestru alarmu, wpisz tam wartość np AA i odczytaj ją. Pewnie przy braku GDN będziesz odczytywał coś innego niż AA. Może to bardziej skompilować, zapisać AA odczytać jeśli ok zapisać 55 odczytać. Jeszcze bezpiecznje do jednego rejestru zapisujesz 55 do innego AA. Sekwancję 55 AA to chyba każdy zna i nie muszę tłumaczyć dlaczego ta jest wskazana, choć można taż )F, F0.

  • #14 29 Wrz 2017 11:09
    kamill_94
    Poziom 4  

    Z poprzednimi problemami sobie w miarę dobrze poradziłem. Jednak mam jeszcze jedno pytanie/problem. Do przesyłania danych w tym projekcie używam modułu GSM. Do modułu mam podłączoną antenkę tego typu.
    I2C - Odporność na zakłócenia

    Jeśli ta antena znajdzie się w okolicach mikrokontrolera albo linii I2C, to zakłócenia powodują przerwanie transmisji, lub całkowite zawieszenie uC. Czy to normalny objaw i nie mam się czym martwić?
    Gdy antena znajduje się obok całego układu, problem nie występuje.

  • #15 29 Wrz 2017 11:49
    R-MIK
    Poziom 37  

    kamill_94 napisał:
    Jeśli ta antena znajdzie się w okolicach mikrokontrolera albo linii I2C, to zakłócenia powodują przerwanie transmisji, lub całkowite zawieszenie uC. Czy to normalny objaw i nie mam się czym martwić?
    Gdy antena znajduje się obok całego układu, problem nie występuje.

    Dziwisz się, ze tak się dzieje? Wiesz ile mocy chwilowo potrafi wpompować GSM w antenę?

    Jak chcesz sie przed tym uchronić, to:
    - ekranowanie
    - WDG (dziwię się, że go nie używasz)

  • #16 29 Wrz 2017 11:55
    kamill_94
    Poziom 4  

    Nie dziwię. Chciałem poprostu wiedzieć, czy jest się czym martwić.
    A WDG oczywiście będzie zastosowany ;)

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME