Adres podrzędny I2C nie potwierdzony (czasami)

11

Próbuję komunikować się ze zdalnie podłączoną pamięcią FRAM (FM24C04 z Ramtron) za pomocą I2C. Pamięć ta jest osadzona na płytce, którą można w dowolnym momencie włożyć i wyjąć z systemu (komunikacja zostaje prawidłowo zakończona przed usunięciem pamięci).

Problem polega na tym, że po włożeniu karty zawierającej pamięć RAM czasami nie potwierdza adresu.

Pomiary sygnałów

Zmierzyłem sygnały, aby zobaczyć, co się dzieje i wydaje się, że czasy są w obu przypadkach OK (działające i niedziałające).

Prawidłowa komunikacja I2C (odczyt 3 bajtów): wprowadź opis zdjęcia tutaj

Adres I2C FRAM nie został potwierdzony (adres podrzędny został poprawnie wysłany): wprowadź opis zdjęcia tutaj

Działania już wykonane w celu rozwiązania tego problemu (bez powodzenia)

  • Opóźnienie dodane po włożeniu karty z osadzoną pamięcią FRAM w celu zapewnienia przestrzegania sekwencji zasilania.
  • Zatrzymanie generowania I2C po wykryciu niepotwierdzenia adresu slave

Konfiguracja magistrali I2C

  • Jeden master (mikrokontroler STM32F205 od ST)
  • Trzej niewolnicy (EEPROM 24AA1025 od Microchip, RTC DS1339C od Maxim IC i zdalny FRAM FM24C04 od Ramtron
  • Jeden przełącznik poziomu I2C (MAX3373E od Maxim IC) służy do komunikacji między urządzeniem głównym a FRAM
  • Częstotliwość magistrali ustawiona na 100 kHz

Zredagowany (2013-04-17)

Po pierwsze, dziękuję wszystkim za komentarze.

Ponieważ jest wiele sugestii, oto opis przeprowadzonych przeze mnie dochodzeń.

Schematy

Poniższy rysunek przedstawia uproszczony schemat magistrali I2C:

Schemat magistrali I2C

Sygnały I2C_SDA i I2C_SCL są bezpośrednio podłączone do mikrokontrolera, a sygnały FRAM_SDA i FRAM_SCL są podłączone do FRAM. Należy zauważyć, że sygnały SDA i SCL podłączone do FRAM są filtrowane przy użyciu ferrytów BLM18 z Muraty.

FRAM jest podłączony w następujący sposób:

  • NC (styk 1) -> niepodłączony
  • A1 (pin 2) -> GND
  • A2 (pin 3) -> GND
  • VSS (pin 4) -> GND
  • SDA (pin 5) -> FRAM_SDA
  • SCL (pin 6) -> FRAM_SCL
  • WP (pin 7) -> GND (nie chroniony przed zapisem)
  • VDD (pin 8) -> + 5 V.

Opis karty FRAM

Ta karta jest „podobna do ISA” i zawiera tylko FRAM.

Dochodzenia

Spowolnienie częstotliwości

Przeprowadziłem testy z częstotliwością SCL ustawioną na 50 kHz i 10 kHz. Zmierzyłem sygnał SCL za pomocą oscyloskopu, aby upewnić się, że był na oczekiwanej częstotliwości.

Te modyfikacje nie rozwiązały problemu. Sprawdziłem czasy i są one zgodne ze specyfikacjami karty danych FRAM.

Zapewnienie sekwencji mocy

@jippie.

  1. Przesuwnik poziomu I2C jest przełączany w tryb trzech stanów przed włożeniem karty, która osadza FRAM. Sygnały FRAM_SDA i FRAM_SCL są obniżane.
  2. Po włożeniu „karty FRAM” dodawane jest opóźnienie 100 ms w celu zapewnienia stabilizacji zasilania (co najmniej 11 ms wymagane przed pierwszym warunkiem uruchomienia zgodnie z arkuszem danych).
  3. Przełącznik poziomu I2C jest włączony.
  4. Opóźnienie 1 ms jest dodawane, aby upewnić się, że przełącznik poziomu I2C jest włączony i że linie są wyciągnięte (~ 4us wymagane przez arkusz danych). Sygnały FRAM_SDA i FRAM_SCL są podnoszone.
  5. Dostęp do pamięci FRAM jest możliwy.

Sygnały FRAM_SDA i FRAM_SCL zostały zmierzone po każdym kroku.

Problem nadal występuje.

Warunek Stop / Start zamiast wielokrotnego startu

@gbarry.

Próbowałem zatrzymać przed ponownym uruchomieniem podczas przesyłania bajtów. Zmierzyłem transfer bajtów za pomocą oscyloskopu: warunek STOP, a następnie warunek START jest OK.

Niestety to rozwiązanie nie rozwiązuje problemu.

Myśli

Ten problem występuje tylko po podłączeniu karty do osadzania pamięci FRAM. Uruchomiłem kilka tysięcy udanego dostępu do odczytu (adresowanie i odczytywanie urządzeń podrzędnych) po włożeniu i poprawnym zaadresowaniu „karty FRAM”.

Wydaje mi się to coraz bardziej problemem sprzętowym. Ale nie wiem, czy może to być związane z przełącznikiem poziomu I2C, czy z innymi urządzeniami slave na magistrali I2C.

Czy masz jakieś inne pomysły lub sugestie?


EDYTOWANE (18.04.2013)

Problem wydaje się rozwiązany

Wymieniłem złącze modułu FRAM i znalazłem sposób wykonywania pomiarów bezpośrednio na FRAM. Wygląda na to, że wszystko działa dobrze z tym nowym złączem.

Zrobię więcej testów, aby upewnić się, że problem pochodzi z niewłaściwego połączenia.

johsey
źródło
Czy możesz zamieścić schemat? Wypróbuj wolniejszą częstotliwość magistrali, aby zobaczyć, czy to robi różnicę.
Suirnder
Czy problem wystąpił dopiero po włożeniu, a nie w innym czasie? Jak szybko jest „zaraz po”?
Kaz
Oprócz innych eksperymentów możesz spróbować usunąć innych niewolników i sprawdzić, czy to wpływa na zachowanie.
Ben Gartner
Czy dwa piny adresowe są prawidłowo wyciągnięte nisko, czy pozostawione swobodnie?
fm_andreas
@ Suirnder zamieściłem schemat w mojej odpowiedzi.
johsey 16.04.13

Odpowiedzi:

6

Chociaż mówisz, że twoje komunikacje zostały poprawnie zakończone przed włożeniem lub usunięciem, być może warto wypróbować to rozwiązanie, ponieważ istnieje sytuacja, w której magistrala I2C może powodować problemy po zresetowaniu tylko jednego z urządzeń w magistrali.

Przed zainicjowaniem sprzętu Master I2C ustaw SDA jako wejście i sprawdź, czy SDA jest niskie.

Jeśli jest niski, ustaw wysoki pin SCL.

Następnie przełącz pin SCL na niski i wysoki, dopóki SDA nie osiągnie wysokiego poziomu (tzn. Odlicz wszystkie pozostałe bity, które urządzenia peryferyjne mogą nadal próbować wysłać). Nie może to zająć więcej niż 8 cykli zegara - jeśli tak, to jest jakiś inny problem.

Nie mogę zagwarantować, że to rozwiąże twój problem, ale rozwiązało mój!

Buzby
źródło
Nie jest złym pomysłem dodanie tego „algorytmu odzyskiwania magistrali” przed zainicjowaniem urządzenia nadrzędnego. Zaimplementuję to. Dziękuję Ci.
johsey
2

W przypadku FRAM:

  • najpierw połącz GND i Vcc;
  • następnie upewnij się, że A1, A2 i WP mają prawidłowy poziom;
  • dopiero wtedy podłącz piny danych.

Podłączanie innych pinów niż zasilacz przed włączeniem układu może powodować problemy.

jippie
źródło
2

10k wydaje się nieco duże dla twoich podciągnięć, a twoje wiodące krawędzie wyglądają powoli. Zmniejsz rezystory do około 3k i sprawdź, czy to pomoże.

Ponadto, dlaczego napięcie wyłączenia płynie z czasem?

Scott Seidman
źródło
Zmniejszyłem rezystory podciągające do 3,3k i to nie pomaga. Nie mam pojęcia o tym dryfowaniu.
johsey
Na ekranie wygląda na mały, ale wydaje mi się, że ma około 250 mV. Być może masz problem z zasilaniem po stronie 3,3 V
Scott Seidman
Masz rację, dryf wynosi około 300 mV po obu stronach przekładni poziomu I2C. Zasilacz + 3,3 V wydaje się działać dobrze (brak dryfu na wyjściu, gdy występuje dryft na sygnale SCL). Czy może to być związane ze zmianą poziomu I2C?
johsey
Wcale nie jestem pewien. Skąd pochodzi 3,3 V? Zmieniasz konwerter? W każdym razie jest to podejrzane. Czy pobierasz MINIMUM prądu wymaganego przez urządzenie zapewniające 3,3 V na arkusz danych? Jeśli nie, załaduj swój rezystor. Co się stanie, jeśli poczekasz sekundę lub dwie przed rozpoczęciem komunikacji?
Scott Seidman
3,3 V pochodzi z SMPS (LM3103MH z TI). Nie jestem ekspertem od zasilaczy, ale, jak zrozumiałem, z tym urządzeniem nie ma minimalnego wymaganego prądu, ponieważ może pracować w trybie nieciągłego przewodzenia przy niewielkim obciążeniu. Ten sam problem występuje, jeśli poczekam dwie sekundy przed rozpoczęciem komunikacji.
johsey
2

Czy jest jakaś szansa, że ​​coś jeszcze próbuje porozmawiać z tym forum? Miałem kiedyś taki problem; Mogłem uzyskać potwierdzenie w 60% przypadków, ale nie pamiętam, żeby kiedykolwiek widziałem kolizję. Podejrzewam, że i2c, który dostałem, był w jakiś sposób odizolowany od prawdziwej wewnętrznej magistrali. Mogłem go uruchamiać w sposób ciągły, a to po prostu zrzuciłoby 30% wiadomości. Problem zniknął w chwili, gdy zaczęliśmy rozmawiać bezpośrednio z urządzeniem (zasilaczem) bez pośredniczącej „płyty montażowej”.

Nie widzę sekwencji zatrzymania po błędzie NAK. Zgaduję, że masz punkt przerwania, który zatrzymuje program w tym momencie?

Wreszcie, jeśli uważasz, że jesteś jedynym w autobusie, możesz spróbować zastąpić powtarzający się start stopem / startem. Widziałem urządzenia (zwłaszcza niestandardowe układy FPGA), które nie do końca wiedziały, jak obsługiwać RS.

[W odpowiedzi na komentarz]: Wiele nie powiedziałeś o płycie FRAM, na przykład czy jest to tylko pamięć, czy cały podsystem. Ale jeśli umieścisz „zakres” bezpośrednio na przewodach urządzenia i2c, które sprawia ci kłopoty, i nadal widzisz to, co jest na zdjęciu, to wykluczę interferencję. I2C jest na tyle prosty, że jeśli zobaczysz odpowiednie sygnały na wejściu, to układ powinien grać poprawnie, chyba że ma wewnętrzny problem.

W szczególności chcesz dostać się na stronę FRAM tej dźwigni zmiany poziomu. Przerwanie sygnału jest bardziej prawdopodobne niż coś, co normalnie byłoby uważane za kolizję.

Zaznaczę, że cykl NAK jest nie do odróżnienia od układu, którego po prostu nie ma. EEPROM zrobi to, aby wskazać, że są zajęte. Sprawdziłem czas zapisu w pamięci FRAM i jest on szybszy niż pojedynczy bit danych i2c ... więc to nie jest problem.

gbarry
źródło
Na magistrali I2C jest tylko jeden master, a płyta osadzająca FRAM jest podłączona tylko do tej magistrali. Dlatego myślę, że nie ma szans, aby coś innego próbowało z tym porozmawiać. Tak, wstawiam punkt przerwania przed sekwencją zatrzymania. Spróbuję zastąpić ten powtarzany start stopem / startem, jak sugerujesz, i przetestuję go ponownie. Zgodnie z arkuszem danych FRAM powinien obsługiwać wielokrotne uruchamianie. Czy uważasz, że jeśli izoluję pamięć FRAM (na przykład na dedykowanej magistrali I2C), może to ostatecznie rozwiązać ten problem?
johsey
Płyta FRAM zawiera tylko FRAM. Jest to tablica „podobna do ISA”. Trudno jest zmierzyć sygnały bezpośrednio na stykach FRAM, ponieważ ta karta jest osadzona w plastikowym kawałku. W każdym razie postaram się znaleźć sposób na zmierzenie tych sygnałów jak najbliżej FRAM.
johsey
Dotarcie do strony FRAM U13 byłoby dużym krokiem.
gbarry
2

Ponieważ problem, gdy się odtwarza, stanowi trwałą awarię, którą można usunąć tylko poprzez usunięcie i ponowne włożenie urządzenia, jest to jedna z dwóch rzeczy: urządzenie przechodzi w zły stan, z którego odzyskuje energię dopiero po cyklu zasilania, lub słaby kontakt.

Jeśli urządzenie przechodzi w zły stan, po którym odzyskuje energię po cyklu zasilania, możesz mieć dodatkowy obwód, który umożliwia MCU wyłączenie urządzenia. Oprogramowanie układowe, po nieotrzymaniu potwierdzenia z urządzenia, może wykonać procedurę odzyskiwania, w której wyłącza układ przez pewien czas, włącza go ponownie, a następnie próbuje ponownie.

Jeśli jest to słaby kontakt, być może trzeba spojrzeć na niezawodność złącza i znaleźć coś lepszego. Jeśli użyjesz tego samego złącza, aby zrobić więcej z tych płyt, mogą wystąpić problemy w terenie. W każdym razie może istnieć ludzka procedura radzenia sobie z sytuacją. Operator współpracujący z urządzeniem musi zdawać sobie sprawę z potencjalnego problemu z włożeniem karty i że może być konieczne ponowne ustawienie go w celu prawidłowego działania.

Twoje główne urządzenie może mieć sposób na wywołanie alarmu wskazującego, że nie może rozmawiać z FRAM: diodę „kłopot” na panelu i / lub sygnał dźwiękowy lub cokolwiek innego. Lub na odwrót: włącza się pewne światło, które informuje użytkownika, że ​​pamięć FRAM została zaakceptowana i nawiązano komunikację. Jeśli FRAM znajduje się daleko od urządzenia głównego, światło może znajdować się na module FRAM: innym układzie I2C, który napędza diodę LED.

Kaz
źródło
0

Sporadyczny charakter problemu sugeruje, że może to być problem czasowy.

W datasheet wymienia dwa zestawy czasy, jeden dla „Tryb Standardowy” i jeden dla „Fast Mode”. Z pomiarów wynika, że ​​znajdujesz się na granicy czasów „Trybu standardowego”. Nie mogę powiedzieć po przejrzeniu arkusza danych, jak dokładnie układ jest wprowadzany w którykolwiek z trybów.

Nie zakładam, że twoje urządzenie jest w trybie szybkim. Czy możesz zmniejszyć taktowanie o współczynnik 2-4, upewnić się, że mieścisz się w trybie standardowym dla czasów wstrzymania warunków początkowych, okresu wysokiego zegara i okresu niskiego zegara i sprawdzić, czy problem nadal występuje?

Ben Gartner
źródło
Moje urządzenie znajduje się w „trybie standardowym” (częstotliwość SCL 100 kHz). Rzeczywiście, ta częstotliwość znajduje się na granicy tego trybu. Spróbuję go zmniejszyć dwa razy i wykonam kilka testów.
johsey
0

Czy masz 24c04a, b lub c? Jeśli jest to c04a, był to solidny projekt. Część b ma wrażliwość na rampy zasilania. Jakie oddzielenie masz na pin8 do GND? Chciałem powiedzieć coś o poziomach sygnałów, ale widzę, że używasz translatora poziomów. Możesz sprawdzić, czy nie dostałeś usterki w SCL, którą chip interpretowałby jako dodatkowy zegar.

gman
źródło
3
Czy wpisałeś to na starym telefonie z interfejsem tylko dziewięciu przycisków?
angelatlarge 18.04.13
Używany FRAM to FM24C04B . Skąd masz te informacje dotyczące wrażliwości mocy tej pamięci? Czy możesz dać mi więcej informacji? Nie ma odsprzęgania na pinie 8. Konstrukcja tego modułu została wykonana kilka lat temu i musimy pochłonąć całą produkcję. Zgodnie z pomiarami wykonanymi za pomocą oscyloskopu wydaje się, że nie ma usterki na linii SCL, gdy moduł FRAM jest podłączony i aktywowany jest przełącznik poziomu.
johsey
1
Zdaję sobie sprawę, że ta odpowiedź jest bardzo późna, ale moje informacje dotyczące czułości Vcc pochodzą z obsługi aplikacji Ramtron przed laty. Nie pamiętam dokładnych szczegółów, ale w pewnych prędkościach i temperaturach procesor zasadniczo się blokuje i nie pozwala na komunikację I2C, dopóki nie uruchomisz z „dobrą” rampą. Brak czapki odsprzęgającej w pobliżu układu nie jest dobry. Może się okazać, że użycie odsprzężenia 0,1 uF do 10 uF zmienia rampę Vcc, w której jedno działa, a drugie nie. @angelatlarge, tak przepraszam, wpisałem swoją pierwszą odpowiedź z telefonu.
gman