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

Dlaczego 24c16 na I2C odpowiada na wiele adresów?

Anderian 14 Gru 2005 21:40 2333 8
REKLAMA
  • #1 2083925
    Anderian
    Poziom 18  
    Posty: 406
    Pomógł: 9
    Ocena: 3
    napisalem programik do szukania urzadzen na magistrali I2C
    
    $regfile = "M16def.dat"
    $crystal = 16000000
    $baud = 19200
    
    $lib "i2c.lib"
    
    Config Scl = Portc.0
    Config Sda = Portc.1
    
    I2cinit
    
    Twbr = 12
    Twsr = 0
    
    Dim A As Byte
    
    Print "TWI master"
    
    For A = 2 To 254 Step 2
    I2cstart
    I2cwbyte A
    
    I2cstop
    
       If Err = 0 Then
          Print "adres " ; A ; "!"
       End If
    Waitms 20
    Next A
    
    Print "koniec"
    Wait 2
    


    w ukladzie jest tylko pamiec 24c16 (wszystkie nogi adresowe podpiete do masy) a w odpowiedzi dostaje:
    
    TWI master
    adres 160!
    adres 162!
    adres 164!
    adres 166!
    adres 168!
    adres 170!
    adres 172!
    adres 174!
    


    a co to moze chodzic ??
  • REKLAMA
  • #2 2083956
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    z tego co mi wiadomo to bascom nie kasuje raz ustawionej flagii err.
    trzeba to zrobić za kazdym razem przed rozpoczeciem transmisji.
    spróbuj tak
    
    For A = 2 To 254 Step 2 
    err=0
    I2cstart 
    I2cwbyte A 
    I2cstop 
    
       If Err = 0 Then 
          Print "adres " ; A ; "!" 
       End If 
    Waitms 20 
    Next A


    ADD:
    kiedyś napisałem coś takiego i pamiętam że działało.

    
    Sub Find()
    Local Adr_szukany As Byte
    Local Ilosc As Byte
    Ilosc = 0
    232_cls
    Print " SZUKANIE >>>"
    For Adr_szukany = 0 To 255
    I2cstart
    I2cwbyte Adr_szukany
    If Err = 0 Then
    Incr Ilosc
    Print " Znaleziono: "; Adr_szukany
    End If
    I2cwbyte 0
    I2cstop
    Err = 0
    Waitms 1
    Next Adr_szukany
    If Ilosc = 0 Then
    Print " Nie znaleziono"
    Else
    Print " Znaleziono "; Ilosc; " urządzeń."
    End If
    Err = 0
    End Sub
  • REKLAMA
  • #3 2084013
    Anderian
    Poziom 18  
    Posty: 406
    Pomógł: 9
    Ocena: 3
    problem lezy chyba gdzies indziej

    adresowanie 24wc16 odbywa sie na zasadzie:
    1 0 1 0 a10 a9 a8 R/W

    gdzie a10 a9 a8 to adresy tablicy pamieci

    wiec dobrze jest

    ale teraz pytanie praktyczne czym sie roznia 24C od 24WC ??

    Dodano po 6 [minuty]:

    jeszcze jeden problem sie pojawil :(
    jak pogodzic ta pamiec z PCF8583 ktora ma adres:
    1 0 1 0 0 0 0 A0 R/W ??

    jak nie ustawie A0 to i tak bedzie gryzla sie z 24WC16 :/
  • REKLAMA
  • #4 2084036
    Konto nie istnieje
    Konto nie istnieje  
  • #5 2084056
    Anderian
    Poziom 18  
    Posty: 406
    Pomógł: 9
    Ocena: 3
    to jak rozwiazac problem PCF'a i 24c16 na tym samym adresie ??
    mozna wylaczyc jakos to dziwne adresowanie zeby byl widziany tylko jako 1 adres ??

    poszperalem w necie i okazuje sie ze nie da sie
    jedynie 24c08 albo 24c32 lub wyzsza :/
  • REKLAMA
  • #6 2085000
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    a co myslicie o tym aby za pomoca tranzystorka odłanczać od zasilania 24c; wtedy mozna sie dogadywać z pcf-em. wady: o jeden pin mniej i dodatkowy tranzystor. pozdrawiam
  • #7 2085092
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    z tym że należy odłaczaś zasilanie od obu układów.(raz jeden raz drógi.) do tego czeba czekać zą układy zaczna działać itp
    jeśli nieda się nic zrobić z adresami to ja bym dał 4066 i przełączał magistrale i2c raz na 24c a raz na pcf.

    add:
    przypomniałm mi się ze niektóre pcf'y były robione w seri "a" i miały inne adresy.
  • #8 2085101
    Dareek
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Zamiast PCF8583 zastosuj DS1307 lub podobne. Wyprowadzenia chyba te same,a adresy nie będą się gryźć.
  • #9 2085155
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 571
    wykortzystujesz całą pojemność pamięci 24c16 ? to sporo może warto zmienic podejscie do tematu lub szyne danych sda przepinac pomiędzy pcf a eepromy poza tym jak pamiętam to pcf ma wyscie int które daje sygnał co 1s które można wykorzystać jako sygnał zegarowy , poza tym np at8535 daje szanse wykorzystanie jednego z liczników z kwarcem zewnętrznym co po podpieciu rezonatorka 32768 daje zegar programowy w basku przy pomocy kilku poleceń i oczywiście kawałka pamięci

Podsumowanie tematu

✨ Problem dotyczy pamięci EEPROM 24C16 podłączonej do magistrali I2C, która odpowiada na wiele adresów. Wynika to z jej specyficznego sposobu adresowania: 24C16 jest podzielona na 8 stron pamięci, z których każda ma osobny adres I2C (1 0 1 0 a10 a9 a8 R/W), gdzie a10, a9, a8 to bity adresu strony. Takie rozwiązanie zapewnia kompatybilność wsteczną z mniejszymi pamięciami AT24C02/04/08. W efekcie jedno fizyczne urządzenie jest widziane jako 8 różnych adresów na magistrali. Problem kolizji adresów pojawia się przy współistnieniu 24C16 z układem PCF8583, który ma adres pokrywający się z jednym z adresów 24C16. Rozwiązania obejmują: resetowanie flagi błędu (Err) w programie przed każdą transmisją, stosowanie wyłączania zasilania układów za pomocą tranzystora, przełączanie magistrali I2C za pomocą multipleksera analogowego (np. 4066), lub zastąpienie PCF8583 innym układem RTC o innym adresie, np. DS1307. Nie ma możliwości zmiany sposobu adresowania 24C16, natomiast większe pamięci (24C32 i wyższe) mają inny mechanizm adresowania, co może rozwiązać problem konfliktu adresów.
Wygenerowane przez model językowy.
REKLAMA