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

[Bascom]Kilka urządzeń I2C, jedno blokuje komunikację

manekinen 16 Sty 2010 12:34 3945 16
  • #1 7543475
    manekinen
    Poziom 29  
    Hej,

    Na jednej szynie I2C mam podpięte PCF8583, PCF8574, TDA7318. Moduł zawierający TDA zasilany jest z głównego trafa, które z kolei załączane jest poprzez ekspander 8574. TDA przy braku zasilania w jakiś sposób blokuje komunikację I2C, gdy go wypnę z szyny I2C to wszystko działa bezbłędnie. Żeby zasilić TDA najpierw muszę skorzystać z ekspandera - i błędna pętla się zamyka... Niestety nie mam analizatora stanów logicznych żeby sprawdzić co jest nie tak ale podejrzewam że chodzi o flagę ACK potwierdzenia - nie znalazłem w jaki sposób zrobić aby bascom ignorował ACK (dawał tylko takt zegara i nie sprawdzał czy slave ściągnął linię w dół w celu potwierdzenia). Próbowałem też dać większe opóźnienia przez Config I2cdelay ale bez skutku.

    Jak to obejść?

    Dodaje fragment schematu
    [Bascom]Kilka urządzeń I2C, jedno blokuje komunikację
  • #2 7543924
    Kabuto15
    Poziom 19  
    Dlaczego linie adresowe ekspandera wiszą w powietrzu?
  • Pomocny post
    #3 7544001
    BoskiDialer
    Poziom 34  
    Bardziej prawdopodobnym od ignorowania ack przez program są często występujące diody zabezpieczające na pinach układów. Może się okazać, że jeśli układ nie jest zasilany, to napięcia na przewodach sda i scl są odprowadzane do vcc odłączonego układu a więc praktycznie do masy - jako że i2c pracuje jako wire-and, na przewodach będzie panował stan niski i żaden układ nie będzie w stanie rozpoznać żadnej sekwencji i2c. Rozwiązań jest kilka: ciągłe zasilanie wszystkich układów lub użycie izolowanej szyny dla tego układu.
  • #4 7544282
    Konto nie istnieje
    Poziom 1  
  • #5 7544778
    tmf
    VIP Zasłużony dla elektroda
    Atom, zasilania sa laczone automatycznie, nie trzeba ich rysowac. Tu problemem jest brak zasilania TDA - przy braku Vcc ciagnie on prad z szyny I2C, ktora nie moze temu sprostac bo "1" jest stanem recesywnym, w efekcie siada napiecie na magistrali i cala transmisja.
    BTW, manekinen, dlaczego nie uzyles dedykowanego interfejsu TWI do obslugi I2C, tylko rzezbisz softwarowo?
  • #6 7545129
    manekinen
    Poziom 29  
    To jest FRAGMENT schematu, narysowałem jedynie SCL SDA i GND dla podglądu, w zasadzie nawet nie potrzebnie go zamieściłem. Cała reszta jest ok - i2c DZIAŁA i to perfekcyjnie jeśli TDA7318 jest już zasilony i nie mam z niczym najmniejszych problemów. Więc myślę że nie ma sensu zamieszczać wszystkich schematów :)

    BoskiDialer i tmf i właśnie chyba macie rację z tym że linie są ściągane zbyt mocno do masy... więc nie można tego w łatwy sposób obejść? Może dać silniejsze rezystory podciągające? Może linie SDA i SCL idące do TDA połączyć przez jakieś opory aby zmniejszyć na nich prąd?

    tmf nie używam sprzętowego bo na tamtych pinach mam co innego, ale co to by zmieniło?
  • #7 7545216
    BoskiDialer
    Poziom 34  
    Rezystory żeby zmniejszyć prąd - to się nie sprawdzi. Z jednej strony chciał byś dać takie rezystory, aby kiedy układ nie był zasilany, wyprowadzenia nie wpływały na stan magistrali (stan niski na wyjściach nie wpływa na stan magistrali), z drugiej strony kiedy układ jest zasilony chcesz komunikować się z tym układem (stan niski na wyjściach wpływa na stan) - prosta sprzeczność. Można próbować odcinać sygnały mosfet'em, jednak najłatwiej jest zrobić tak jak pisałem - wyprowadzenie z kolejnych 2 wyprowadzeń dodatkowego i2c.
  • Pomocny post
    #8 7545489
    tmf
    VIP Zasłużony dla elektroda
    Dokladnie jak pisze BD -skoro i tak realizujesz I2C programowo to najprosciej zrobic druga dedykowana magistrale. Zmiana rezystora nic nie da, bo to co sciaga do masy to dioda, po przekroczeniu jej napiecia przewodzenia prad tak szybko narasta, ze zaden rezystor nie pomoze. Jesli to musi byc na jednej magistrali to wsadz na linie SDA i SCL szeregowo tranzystory FET, ktorych ramkami bedziesz sterowal z mikrokontrolera - zysk taki, ze zamiast 2 linii IO na osobna szyne uzyjesz tylko 1 na sterowanie bramka, albo zero jesli bramka bedzie sterowana tak jak ten TDA.
  • #9 7545560
    manekinen
    Poziom 29  
    Hyh, gdybym miał choć jeden wolny pin z uC to bym się nie martwił i do załączania trafa (i tadka) użył tego pinu a nie ekspandera - a dałem ekspander bo zabrakło właśnie pinów :( Póki co dzięki za pomoc, spróbuje poskładać na szybko jakiś analizator stanów (widziałem ostatnio coś na tiny45 i usb) i jak by co dam jeszcze znać...

    A co z tym ACK w bascomie? Można w jakiś sposób zignorować tą flagę - czy musze pisać własną procedurkę do obsługi I2C?
  • Pomocny post
    #10 7547160
    jony15
    Poziom 24  
    A nie możesz tak zrobić, nawet na przekaźniku ze w momencie podania zasilania na tda łapie przekaźnik i dołancza i2c.
  • #11 7547295
    manekinen
    Poziom 29  
    jony15 pomysł prosty a jakże skuteczny :)

    A teraz zagadki część dalsza... posklejałem prosty analizator stanów na LPT i... już sam nie wiem co mam myśleć...

    Wysyłam te same dane do ekspandera, aby załączył przekaźnik... 1 i 2 to przebieg gdzie TDA ma zasilanie, 4 i 5 to przebieg gdzie TDA zasilania nie ma... potwierdzenie ACK od ekspandera nie wraca, więc nic dziwnego że nie reaguje - dane nie docierają. Ale czemu analizator stanów pokazał te dane, a sam ekspander ich nie zobaczył?]

    Napięcie na liniach SCL i SDA w stanie spoczynku (przy nie zasilonym TDA) to tylko 1.64V więc faktycznie mocno ściąga je w dół. W nocie ekspandera 8574 jak byk napisane że stan wysoki rozpoznaje od 0.7V do VDD+0.5V, a stan niski od -0.5V do 0.3V. Wytłumaczcie dla laika czemu nie widzi danych :)

    Po za tym wygląda na to że bascom całkowicie ignoruje ACK, bo pomimo jej braku wysyła kolejne dane jak gdyby nigdy nic.

    [Bascom]Kilka urządzeń I2C, jedno blokuje komunikację
  • Pomocny post
    #12 7547365
    maniek1818
    Poziom 22  
    Witam
    Podciągnij mocniej linie SDA i SCL, daj ciut mniejsze rezystory, ich wartość dobierz doświadczalnie.
    Pozdrawiam
  • Pomocny post
    #13 7548731
    michalko12
    Specjalista - Mikrokontrolery
    manekinen napisał:

    Napięcie na liniach SCL i SDA w stanie spoczynku (przy nie zasilonym TDA) to tylko 1.64V więc faktycznie mocno ściąga je w dół. W nocie ekspandera 8574 jak byk napisane że stan wysoki rozpoznaje od 0.7V do VDD+0.5V, a stan niski od -0.5V do 0.3V. Wytłumaczcie dla laika czemu nie widzi danych :)


    Nie 0.7V tylko 0,7Vdd czyli dla 5V zasilania będzie od 3,5V do 5,5V
    a stan niski od -0,5V do 0.3Vdd czyli do 1,5V. Dla napięcia od 1,5V do 3,5V stan
    jest nie ustalony, w zależności od sztuki i innych czynników np. temperatura próg może
    się różnić. W tabelce masz podane gwarantowane wartości.

    [Bascom]Kilka urządzeń I2C, jedno blokuje komunikację
  • #14 7549434
    manekinen
    Poziom 29  
    Ach no tak, czemu ja zawsze myślałem że to oznacza po prostu napięcie... człowiek się uczy całe życie :oops:

    Na próbę zmieniłem rezystory podciągające na 220ohm - dały prawie 3V na liniach danych. Ekspander reaguje, tyle że jest to rozwiązanie trochę chamskie bo prąd płynący przez te rezystory to aż 20mA. Więc pozostaje jedynie zastosowanie malutkiego przekaźnika który będzie dołączał szynę do TDA wraz z jego napięciem zasilania. Dzięki wszystkim za pomoc :)
  • #15 7550950
    tmf
    VIP Zasłużony dla elektroda
    20mA to hardcore, bo wg specyfikacji dla I2C prad wymuszajacy stan niski to max 3mA. Czyli znowu jestes poza specyfikacja. Zamiast przekaznika uzyj jak juz pisalem dwoch tranzystorow FET. Ich bramki podlacz do nap. zasilajacego ten TDA - w momencie kiedy nie jest on zasilany tranzystory te odetna linie SDA i SCL od niego. Podwojne tranzystory znajdziesz nawet w obudowach SO08, albo wloz dwa w SOT123 - zajmie to zdecydowanie mniej miejsca. Przejrzyj ta note, mozesz zrobic cos analogicznego:
    http://ics.nxp.com/support/documents/i2c/pdf/an97055.pdf
  • #16 7551107
    _Robak_
    Poziom 33  
    Tyle ze FET przewodzi w jedna strone a linie na SDA ida w dwie strony. No chyba ze zalozyc ze druga strone ma przewodzic dioda FETa, ale to nie wiem czy jest rozwiazanie zgodne ze sztuka ;)
  • #17 7551131
    Konto nie istnieje
    Poziom 1  
REKLAMA