Niedeterministyczne zachowanie I2C

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.

Reply to
Adam Wysocki
Loading thread data ...

Nie widać rezystora podciągającego SCL.

Reply to
Sebastian Bialy

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

Reply to
Adam Wysocki

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 ?

Reply to
Sebastian Bialy

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

Reply to
Sebastian Bialy

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.

Reply to
Zbych

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

Reply to
Konop

Konop przemówił ludzkim głosem:

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

Reply to
Zbych

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??

Reply to
Konop

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).

Reply to
Adam Wysocki

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

Reply to
Adam Wysocki

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

Reply to
NoName

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.

Reply to
Adam Wysocki

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

Reply to
Adam Wysocki

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.

Reply to
J.F.

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

Reply to
NoName

NoName pisze:

Zapomnial bym sprawdz czy tenn EEPROM to nie jest 3.3V

Reply to
NoName

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.
Reply to
Jan Kowalski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.