Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odczyt z DS3231 zawiesza linie SDA w stanie niskim

serkantes 17 Mar 2018 17:24 531 5
  • #1 17 Mar 2018 17:24
    serkantes
    Poziom 2  

    Podczas obsługi modułu RTC DS3231 przy odczycie I2C danych z rejestru linia SDA pozostaje w stanie niskim, co uniemożliwia dalszą komunikację. Moduł posiada rezystory podciągające 4,7k. Mikrokontroler to STM32F103C8T6 . Zakładam, że moduł działa nadal, o czym świadczy obecności fali 32khz na odpowiednim wyjściu. Ponowne uruchomienie programu (mikronoktrolera) nie pomaga, dopiero odłączenie układu DS3231 od zasilania pozwala przywrócić komunikację. Objawy nie występują za każdym razem, średnio po 2-3 odczytach.
    Jakie mogą być przyczyny? Jeżeli funkcje obsługi zapisu odczytu I2C są nieoprawne, to co należy zmienić?

    Kod odczytu i zapisu przez I2C (zaczerpnięty z githuba LonelyWolf):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Inicjalizacja peryferiów:
    Kod: c
    Zaloguj się, aby zobaczyć kod




    Objawy na analizatorze stanów logicznych:
    Odczyt z DS3231 zawiesza linie SDA w stanie niskim

    Posiadany przeze mnie moduł:
    Odczyt z DS3231 zawiesza linie SDA w stanie niskim

    0 5
  • #2 17 Mar 2018 17:44
    2675900
    Użytkownik usunął konto  
  • #3 18 Mar 2018 22:47
    serkantes
    Poziom 2  

    Pomogło dodanie małego opóźnienia przed odebraniem ostatniego bajtu. Linia SDA już nie zawiesza się w stanie niskim, ale uwidocznił się problem ze szpilkami pojawiającymi się na liniach SDA i SCLK.

    Szpilki powodują przekłamania danych. Są one niezależne od prędkości, ale pojawiają się na linii SDA w momencie przejścia linii SCLK ze stanu wysokiego na niski. Sporadycznie zdarzają się również szpilki na samym SCLK. Testowane na prędkościach 2000-400000hz. Dołożenie kondensatorów 100nF + 10uF do modułu nie pomogło. Zmniejszenie rezystancji podciągania do 2,35k również. Dodanie opóźnień po generowaniu startu też nie. Moduł był zasilany ze stabilizatora LDO, przepięcie go do tego samego zasilania co uC również nie pomogło. Moduł podłączony jest do uC 20cm przewodami zakończonymi obustronnie końcówkami typu "goldpin"

    Niestety nie mam oscyloskopu. Poniżej screeny z analizatora stanów logicznych. Ma ktoś pomysł co może być ich przyczyną?

    Odczyt z DS3231 zawiesza linie SDA w stanie niskimOdczyt z DS3231 zawiesza linie SDA w stanie niskimOdczyt z DS3231 zawiesza linie SDA w stanie niskimOdczyt z DS3231 zawiesza linie SDA w stanie niskimOdczyt z DS3231 zawiesza linie SDA w stanie niskim

    0
  • Pomocny post
    #4 18 Mar 2018 23:42
    excray
    Poziom 39  

    Kiedyś miałem podobny problem ze szpilkami. Przyczyną okazały się być fatalnej jakości przewody od analizatora.

    0
  • #5 19 Mar 2018 00:52
    ghost2000
    Poziom 18  

    excray napisał:
    Kiedyś miałem podobny problem ze szpilkami. Przyczyną okazały się być fatalnej jakości przewody od analizatora.

    Przyczyna może tez leżeć w źle zaprojektowanych ścieżkach lub kabelkach łączących uC z modułem zegara. Gdy magistralę I2C łączy sie tasiemką pomiędzy modułami warto linie danych, zegara, przedzielić linią masy, na wzór taśmy ATA 80 żył.

    Dodano po 3 [minuty]:

    serkantes napisał:
    Pomogło dodanie małego opóźnienia przed odebraniem ostatniego bajtu

    To nie rozwiązanie problemu tylko jego zamaskowanie.

    0
  • #6 19 Mar 2018 20:59
    serkantes
    Poziom 2  

    Problem leżał po stronie analizatora - zmniejszenie częstotliwości próbkowania do 2Mhz usunęło przekłamania w wyświetlaniu stanów magistrali (sprawdziłem w debugerze - dane są odczytywane prawidłowo).

    ghost2000 napisał:
    To nie rozwiązanie problemu tylko jego zamaskowanie.

    Poprzez opóźnienie daje slave'owi czas na odpowiedź. Generowanie dodatkowych taktów też byłoby maskowaniem problemu.

    0
  Szukaj w 5mln produktów