logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zawieszanie programu przez I2C

TomXV 28 Wrz 2011 20:53 1875 5
REKLAMA
  • #1 9973537
    TomXV
    Poziom 12  
    Witam,
    Gdy nastąpi jakiś błąd transmisji przez I2C program się zawiesza, gdzie może być błąd?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9973636
    august24
    Poziom 12  
    najprawdopodobniej problem pojawia się przy pętlach while. po prostu żądany stan nigdy nie występuje i dlatego program kręci się w tej pętli w nieskończoność. proponowałbym zrobić transmisję po i2c na przerwaniach. sam to przerabiałem więc wiem ile z tym babraniny ale opłaca się. przynajmniej masz zawsze pewność że program nie zwiśnie..

    połowicznym rozwiązaniem może być zastosowanie watchdoga resetowanego w pętli głównej programu. wtedy przynajmniej gdy zawiesi Ci się program to nastąpi reset ;)
  • REKLAMA
  • #3 9973727
    MirekCz
    Poziom 35  
    Błędu nie ma w kodzie, ale jest w logice programu.

    Jak wystąpi problem z komunikacją I2C to sterownik I2C nie zwróci pożądanego stanu (np. device nie odpowie ACK). W tym momencie nigdy nie wyjdziesz z pętli while, bo nigdy nie ma ACK i kółko się zamyka.

    Musisz to zrobić na przerwaniach. W zasadzie masz 2 możliwości:

    a)brzydkie - Ustawić przerwanie jako jakiś krótki timer np. 1ms i jak w tym czasie nie otrzymasz poprawnej odpowiedzi to mimo wszystko wychodzisz z pętli while/całej funkcji I2C z jakimś błędem

    b) Poprawne - zrobienie całej obsługi I2C na przerwaniach + jakaś obsługa błędów jak komunikacja I2C się nie powiedzie.
  • REKLAMA
  • #4 9974042
    dondu
    Moderator na urlopie...
    A ja zapytam o schemat, bo skoro masz problemy z błędami transmisji to tutaj może leżeć przyczyna którą trzeba znaleźć, by nie musieć robić obsługi na przerwaniach, gdyż to nie jest tak proste zadanie, jak już zaimplementowane rozwiązanie, które masz.

    Choć oczywiście przerwania rulez!
  • REKLAMA
  • #5 9974059
    TomXV
    Poziom 12  
    Ach, tak nie pomyślałem o tych pętlach, dziękuje bardzo za pomoc.
    Czy coś takiego wystarczy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozatym w dokumentacji nie doczytałem się po jakim czasie slave powinien wysłać ACK, więc czy liczenie do 100 wystarczy?
    Jeżeli wystąpi błąd z połączeniem z urządzeniem czy powinienem wysłać na I2C sygnał STOP?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 9974178
    tmf
    VIP Zasłużony dla elektroda
    Tak to zupełnie bez sensu - odczytanie 100 razy rejestru potrwa chwilę. TWI (I2C) jest synchronizowana SCK, więc moment pojawienia się ACK jest ściśle określony przez mastera, może być ew. przedłużony przez slave, lecz masz pewność, że pojawi się do zbocza narastającego SCK. Ty nie powinieneś się skupiać tylko na jednej fladze TWINT tylko zainteresować się całym rejestrem stanu, bo na jego zmiany trzeba adekwatnie reagować. Np. nieprawidłowo nadano bit startu to go nadajesz ponownie, nie odebrano ACK to całą transakcję trzeba powtórzyć itd.
REKLAMA