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

RATUJCIE!!! Mam problem z komunikacją z pamięcią eeprom IIC

arthhur 10 Maj 2005 20:39 1817 13
REKLAMA
  • #1 1480408
    arthhur
    Poziom 12  
    Posty: 58
    Ocena: 2
    Od dłuższego czasu podejmuję (bez powodzenia) próby komunikacji z pamięcią eeprom IIC 24c64. Dostaję ack, wszystko na pozór wydaje się być OK, ale gdy chcę odczytać to, co zapisałem, odczytuję tylko FF. Czy jest coś, o czym powinienem wiedzieć? A może ma ktoś jakiś sprawny program w assemblerze do komunikacji z eeprom-em? Czekam na Waszą pomoc. Pozdrawiam.
  • REKLAMA
  • #2 1480442
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Na jaki procek?
  • #3 1480563
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    A bit R/W ustawiany prawidłowo ? Czas zapisu zawartości uwzględniony ? Nota katalogowa przeczytana ? ;)
  • REKLAMA
  • #4 1480636
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    arthhur napisał:
    Dostaję ack, wszystko na pozór wydaje się być OK,

    Które ACK ?? Podaj co wysyłasz do pamięci, adresy, dane.
  • #6 1481653
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    Przed odczytem musisz sprawdzać, czy pamięć nie jest zajęta (zapisem) robisz to?
  • REKLAMA
  • #7 1482119
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Powinienes wiedziec o czasach. Zapis komorki do panieci to 10ms, zas odczyt nastepuje szybciej. Przy odczycie dostajesz same FF bo nic nie zapisales.
  • REKLAMA
  • #8 1482134
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Sprawdź pamięć w zewnętrznym programatorze, spradź czy działa i spróbuj wpisać jakieś wartości pod znany adres a potem je odczytać.
  • #9 1484029
    arthhur
    Poziom 12  
    Posty: 58
    Ocena: 2
    Wysyłam do pamięci wszystko, co trzeba. adres, subadres, adres komórki, do której zapisuję.... Uwzględniam też czasy. Czekam dużo dłużej, niż jest to wymagane. Noty katalogowe bardzo uważnie po kilka ray przeglądałem. Chyba najlepszym sposobem ratunku byłoby udostępnienie jakiegoś prostego programu w assemblerze. Dziękuję za zainteresowanie.
  • #10 1484086
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    arthhur napisał:

    ..//. Chyba najlepszym sposobem ratunku byłoby udostępnienie jakiegoś prostego programu w assemblerze. Dziękuję za zainteresowanie.

    To może pokaż swój :?:

    Piotrek
  • #11 1484856
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    Zostaje jeszcze analiza z oscyloskopem.
    Aha, po włączeniu zasilania obie linie SDA i SCL powinny być w stanie wysokim (nikt ich nie używa, więc działa podciągnięcie).
    Zdarzyłe mi się już układy, które po włączeniu miały SDA w stanie niskim.
    Trzeba wtedy pomachać SCL i wysłać STOP. Tak trzeba robić aż układ "się odwiesi".
  • Pomocny post
    #12 1485095
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Nie pamietam z kad sciagnalem kod zrodlowy po przerobieniu dla swoich potrzeb program 100% dziala.

    ;**********************************************************
    ; I2C zapis i odczyt do EPROM 24C02
    ;
    ;**********************************************************
    $NOMOD51
    $INCLUDE(REG517.INC)
    SDA EQU P4.7 ;LINIA DANYCh
    SCL EQU P4.6 ;LINIA ZEGAROWA
    ;************************************************************
    LJMP START
    ORG 2000H

    START:
    MOV R0,#53 ;00110101B 53D 35H DANA DO R0
    ACALL WRITE
    ACALL DEALY3 ;OPOZNIENIE DUUGIE POTRZEBNE ABY ZROBIC COS JESZCZE
    MOV R0,#0AAH ;10101010B 252D AAH NISZCZY R0
    ACALL READ
    MOV P5,R0 ;powinno znowu byc 00110101B
    AJMP $


    READ: ;PROGRAM ODCZYTUJACY ZAWARTOSC PAMIECI
    ;O ADRESIE 174 I ADRESIE KOMORKI = 4
    ACALL I2C_START ;ROZPOCZECIE TRANSMISJI
    MOV A,#174 ;ADRES UKLADU SLAVE (PATRZ APLIKACJA DANEGO UKLADU)
    ACALL I2C_WRITE ;WYSLIJ ADRES NA MAGISTRALE
    MOV A,#4 ;4ka TO ADRES KOMORKI Z JAKIEJ NASTAPI ODCZYT
    ACALL I2C_WRITE ;... WYSLIJ INFORMACJE NA MAGISTRALE
    ACALL I2C_START ;PONOWNE ROZPOCZECIE TRANSMISJI
    MOV A,#175 ;ADRES PAMIECI DO ODCZYTU
    ACALL I2C_WRITE ;TU WIADOMO O CO CHODZI...
    SETB C ;BEZ NACK
    ACALL I2C_READ ;WEZWIJ PODPROGRAM ODCZYTUJACY DANE Z MAGISTRALI I
    MOV R0,A ;PRZEPISZ JE DO ZMEINNEJ XXX
    ACALL I2C_STOP ;TO TYLE- ZAKONCZ TRANSMISJE...

    ;**********************************************
    WRITE: ;TUTAJ MAMY ZAPIS DO OW KOMURKI
    ACALL I2C_START ;TRANSMISJA ROZPOCZETA
    MOV A,#0AEH ;ADRES SLAVE AEH
    ACALL I2C_WRITE ;WYSLIJ INFORMACJE NA MAGISTRALE
    MOV A,#4 ;ADRES KOMORKI PAMIECI DO ZAPISU
    ACALL I2C_WRITE
    MOV A,R0 ;POBIERZ DANE DO ZAPISU W EEPROMIE
    ACALL I2C_WRITE ; I WYSLIJ JA NA MAGISTRALE
    ACALL I2C_STOP

    ;*********************************************************
    I2C_READ: ;ZAPISUJE DO ACC WARTOSC Z ODEBRANA Z I2C.
    ;Z CY WYSYLANA JEST WIADOMOSC O ACK I NACK
    CLR SCL ;TAK PROFILAKTYCZNIE...
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV R4,#8 ;BO ODBIERZEMY OSIEM BITOW
    I2R:
    RLC A ;PRZESUN FLAGE
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;IMPULS SCL I ZDJECIE BITU Z I2C TUZ PRZED OPADNIECIEM
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV C, SDA ;
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;
    DJNZ R4, I2R ;JESLI ODEBRANO 8 BITOW, TO WYSLIJ ACK
    RLC A ;PRZEWIN FLAGE NA SWOJE MIEJSCE
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV SDA,C ;WYSTAW FLAGE NA LINIE SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;\
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;/
    RET
    ;****************************************************************************
    I2C_WRITE: ;ZAPISUJE NA I2C ZAWARTOSC ACC. ODDAJE ACK W CY
    CLR SCL ;SKASUJ SCL- BO NASTAPI WYSTAWIENIE BITU NA SDA
    MOV R4,#8 ;BO OSIEM BITOW DO WYSLANIA
    ACALL I2C_TAKT ;OPOZNIENIE
    I2W: RLC A ;"WYSTAWIENIE" KOLEJNEGO BITU
    MOV SDA,C ;USTAW LINIE SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;\
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;/
    ACALL I2C_TAKT ;OPOZNIENIE
    DJNZ R4,I2W ;JESLI WYSLANO 8 BITOW, TO ODBIERZ ACK
    SETB SDA ;PO ZAKANCZENIU TANSMISJI USTAW 1 NA SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;WYSTAWIENIE IMPULSU ACK
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV C,SDA ;PRZEPISANIE IMPULSU ACK DO CY->
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;CY=0 TO SLAVE ODPOWIEDZIAŁ
    ACALL I2C_TAKT ;OPOZNIENIE
    RET ;CY=1 TO SLAVE NIE ODPOWIEDZIAŁ
    ;***********************************************************************
    I2C_START:
    SETB SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;PRZY USTAWIONYM SCL WYZRUJ LINIE SDA->
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SDA ;UWAGA! PROGRAM NIE KASUJE BITU SCL
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL
    RET
    ;************************************************************************
    I2C_STOP:
    CLR SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;PRZY USTAWIONYM SCL USTAW LINIE SDA->
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    RET
    ;*************************************************************************
    I2C_TAKT: ;ZWLOKA CZASOWA POMIEDZY KOLENYMI CYKLAMI ODCZYTU BITU
    NOP ; DLUGOSCI JEGO CYKLU ZEGAROWEGO
    NOP ;(WIECEJ INFORMACJI W PDFie UKLADU)
    NOP
    NOP
    NOP
    NOP
    RET
    ;**************************************************************************
    DEALY3: ;OPOZNIENIE DUUGIE POTRZEBNE DO UTRWALENIA
    MOV R4,#046D ;DANTCH W EPROM NIN 10us DLA PEWNOSCI WIECEJ
    DEAL3:
    MOV R3,#0FFh
    DJNZ R3,$
    DJNZ R4,DEAL3
    RET
    END

    Dodano po 3 [minuty]:

    Zastosowany kwarc to 18,432 procek 80c517A
  • #13 1487434
    arthhur
    Poziom 12  
    Posty: 58
    Ocena: 2
    Ja używam procka AT89C4051, w związku z czym linię scl muszę taktować ,,ręcznie”. A to jest mój program:



    .device AT89C4051, Polski

    .cseg 0000h

    RS: .equ p3.3
    RW: .equ p3.2
    e: .equ p3.7
    scl: .equ p3.1
    sda: .equ p3.4




    clr rs ;
    clr rw ;
    clr e ;
    mov p1,#00111000b ;inicjalizacja wyświetlacza
    lcall imp ;
    mov p1,#00001100b ;
    lcall imp ;
    setb rs ;
    clr 0 ;



    main:
    mov a, #10100000b
    lcall zapis
    mov a,#0 ;pierwszy bit adresowy
    lcall zapis
    mov a, #0 ;drugi bit adresowy
    lcall zapis
    mov a,#42h ;
    lcall zapis ;
    mov a,#43h ;
    lcall zapis ;;
    mov a,#44h ;
    lcall zapis ;
    mov a,#45h ;
    lcall zapis ;
    mov a,#46h ;
    lcall zapis ; ,,zapisywane dane"
    mov a,#47h ;
    lcall zapis ;
    mov a,#48h ;
    lcall zapis ;
    mov a,#49h ;
    lcall zapis ;
    mov p1,#41h ;
    lcall imp
    lcall stop
    czekaj:
    djnz 70, czekaj
    djnz 71,czekaj
    clr 0
    mov a, #10100000b
    lcall zapis
    mov a,#0
    lcall zapis
    mov a, #0
    lcall zapis
    clr 0
    mov a, #10100001b
    lcall zapis
    mov 48, #16 ;ilość odczytanych komórek
    chciałbym:
    lcall odczyt
    mov p1,acc ;(p1 to port komunikacji z wyświetlaczem)
    lcall imp
    djnz 48, chciałbym
    mov p1,#41h
    lcall imp
    lcall stop
    sjmp $

    zapis:

    jb 0, pomiń_start
    setb 0
    clr sda
    lcall wait
    clr scl
    pomiń_start:
    mov 50,#8
    clr scl
    again:
    rlc a
    mov sda,c
    lcall sccl
    djnz 50, again
    setb sda
    lcall wait
    setb scl
    lcall wait
    jb sda, error
    ret
    error:
    mov p1,#45h ;wyświetlany znak, gdyby nie było ack
    lcall imp
    ret


    stop:
    clr scl
    lcall wait
    clr sda
    lcall wait
    setb scl
    lcall wait
    setb sda
    ret


    odczyt:
    setb sda
    mov 50,#9
    cykl:
    rlc a
    lcall sscl
    mov c, sda
    djnz 50, cykl
    clr sda
    lcall sscl
    ret








    sscl:
    clr scl
    lcall wait
    setb scl
    lcall wait
    ret



    sccl:
    setb scl
    lcall wait
    clr scl
    lcall wait
    ret



    wait:
    nop
    nop
    nop
    nop
    nop
    ret



    imp:
    setb e
    djnz 70, imp
    djnz 71, imp ;impuls e na wyświetlacz
    clr e
    ret


    Jest to najnowsza wersja (niedziałająca). Jeszcze nie testowałem programu przesłanego przez uczestnika forum. zrobię to jutro, po czym obiecuję zdać relacje :) Dziękuję za pomoc :)
  • #14 1489609
    arthhur
    Poziom 12  
    Posty: 58
    Ocena: 2
    DZIALA!!! Wielkie dzieki. No to chyba sprawe mozna uznac za zamkinieta. Az sam w to nie wierze. Jeszcze raz dzieki!!!!! : )

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczył komunikacji z pamięcią EEPROM I2C 24C64, gdzie pomimo uzyskania potwierdzenia ACK, odczyt zwracał jedynie wartość FF. Dyskusja wskazała na konieczność prawidłowego ustawienia bitu R/W, uwzględnienia czasów zapisu (około 10 ms na zapis komórki) oraz sprawdzenia, czy pamięć nie jest zajęta przed odczytem. Zalecano również weryfikację działania pamięci za pomocą zewnętrznego programatora oraz analizę sygnałów na liniach SDA i SCL oscyloskopem, zwracając uwagę na stan linii po włączeniu zasilania i ewentualne "odwieszanie" układu przez generowanie sygnału STOP. Autor używał mikrokontrolera AT89C4051, gdzie linia SCL była taktowana programowo. Ostatecznie problem rozwiązano dzięki udostępnionemu przykładowemu kodowi w asemblerze, który umożliwił poprawną komunikację i zapis/odczyt danych z pamięci EEPROM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA