Niedeterministyczne zachowanie I2C

Oct 24, 2008 26 Replies

Cześć,



Co może być powodem, że magistrala i2c zachowuje się niedeterministycznie? Pamięć 24C08 czasami po zaadresowaniu jej (start i wysłanie adresu) odpowiada ack a czasami nie. Mój układ:



formatting link
Obsługuję magistralę w taki sposób:



Start:



SCL = 1 SDA = 1 SCL = 1 SDA = 0



Stop:



SCL = 0 SDA = 0 SCL = 1 SDA = 1



Zapis:



SCL = 0 SDA = dana SCL = 1



Odczyt:



SCL = 0 SDA = 1 dana = SDA SCL = 1



Po każdej zmianie na magistrali jest opóźnienie, ale nie zauważyłem żeby miało jakikolwiek wpływ (nawet ustawiając na pół sekundy).



Pozdrawiam.


Nie widać rezystora podciągającego SCL.

Nie ma potrzeby, port LPT jest push-pull, więc ciągnie magistralę do góry, a nie obsługuję clock stretching.

Jesli tak jest to nie jest dobrze. A chyba tak nie jest, choć nie wykluczam, że w jakimś dziwnym trybie EPC+Whatever faktycznie działa jako push-pull.

Powinna się sama ciągnąć własnie przez ten rezystor. Jeśteś pewny że wyjście z portu LPT zachowuje się jak otwarty kolektor z rezystorem do plusa ? Bo jeśli nie to raczej szanse na działanie tego I2C są znikome.

Swoją drogą po co tam jest ta dioda ?

Aaa czekaj, to taki rodzaj OpenCollector dla ubogich chyba :)

Sebastian Bialy przemówił ludzkim głosem:

A niby czemu ma nie działać? Przy jednym masterze zegar może być sterowany z wyjścia push-pull, bez rezystora podciągającego.

A czy Slave nie ma prawa przyciągnąć SCL do masy, jeśli nie nadąża z transmisją czy coś?? :>...

Konop przemówił ludzkim głosem:

Nie spotkałem się z czymś takim w przypadku pamięci eeprom.

Adam Wysocki pisze:

A układ zasilasz z LPT czy z zewnątrz?? Ile prądu bierze?? Szukałeś jakiś "szpilek" na zasilaniu?? Masz jakiś kondensator po stronie pamięci??

Dlaczego?

W normalnym trybie :) Mierzyłem napięcie, po wystawieniu tam jedynki pojawia się 5V.

Inaczej nie byłoby tam 5V :)

Tak jak już napisałeś - OC dla ubogich :D Generalnie SCL jest dla mnie linią jednokierunkową (przyciąganie przez slave'a ignoruję - mam za duże opóźnienia żeby to mogło wystąpić), a przez diodę wymuszam stan niski na SDA, nie wymuszając wysokiego (wymusza się przez rezystor).

Ma, ale u mnie to leci za wolno, żeby to zrobił :)

A zapytam z ciekawosci dlaczego nie wykorzystasz linii I2C z Peceta ?

Z LPT.

Tyle ile 24C08 - max 3mA (podczas zapisu), przy odczycie 1mA.

Spróbuję jak będę w domu (jutro) dorzucić jakiegoś 100nF, dzięki :)

A, pytanie - jest możliwe że za wolna transmisja powoduje tego typu błędy? Po zmianie stanu każdego z pinów czekam (testowo) pół sekundy.

Ten kod ma być przenośny, jak ruszy na PC, to przerzucę do mikrokontrolera.

Czy po zmianie bitu zegara odczekujesz troche przed odczytem danych ? Uklady I2C sa dosc wolne i pecet potrafi przekroczyc ich predkosc.

Jesli nie w tym problem .. podlaczylbym normalny zasilacz 5V, zamiast tej diody wsadzil tranzystor i zrobil prawdziwe OC.

A jesli i to zawiedzie .. odpalic komputer pod dosem.

J.

ja mam SDA i SCL w kontrolerze podciagniete do H i dziala.

NoName pisze:

Zapomnial bym sprawdz czy tenn EEPROM to nie jest 3.3V

U¿ytkownik "Adam Wysocki" snipped-for-privacy@nospam.invalid napisa³ w wiadomo¶ci news: snipped-for-privacy@news.chmurka.net...

Spróbuj zamontowaæ niewielkie pojemno¶ci na liniach SCL i SDA (zw³aszcza tej pierwszej). Na porcie LPT czasami zdarzaj± siê "szpilki" przy zmianie stanu które pamiêæ mo¿e zinterpretowaæ jako kolejny cykl.

Witaj Podej¶cie jest bardzo dziwne, albo co¶ ¼le rozumiem. Pod³±czasz I2C do LPT, co¶ nie dzia³a, a jak zadzia³a chcesz przerzuciæ do uC. I2C i obs³uga pamiêci to nie jest nic dziwnego i egzotycznego, wiêc nie trzeba kombinowaæ. Wiele procków ma do tego dedykowane peryferia, które zmniejszaj± mo¿liwo¶æ problemów. Wykorzystaj to i we¼ siê za to co jest istot± problemu. S± te¿ przecie¿ gotowe procedury do tego.

snipped-for-privacy@nospam.invalid (Adam Wysocki) napisał(a):

Port LPT powinien dawać 0-5V na wyjściach. Jeśli pamięć jest na 3.3V możesz ją w skrajnym przypadku upalić.

Wg. dokumentacji np. Microchip dla podobnych pamięci maksymalny dopuszczalny stan niski to 0.3VCC. Czyli przy zasilaniu 5V daje to 1.5V. Dioda daje ok.

0.7V. Na twoim miejscu nie specjalnie wierzyłbym w to, gdyż z mojego doświadczenia wynika, iż sporo problemów w I2C (a zwłaszcza podobnych do opisanych przez ciebie) bierze się z tego że nadajnik nie ściąga linii SDA/ SCL niemal idealnie do zera. Z moich układach na 3.3V okazywało się nie raz, że przekrocznenie 0.3V w stanie niskim wystarczyło by pożegnać się z pewną transmisją po I2C. Dlatego sugeruje nie kombinować tylko zrobić sobie interface na brameczkach TTL lub CMOS które bez problemu dociągną obie linie do zera.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required