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

24C1024 EEPROM z Atmega 8 - problem z odczytem i zapisem I2C w AVRGCC

Bromak 15 Gru 2005 16:38 2452 6
REKLAMA
  • #1 2086135
    Bromak
    Poziom 11  
    Posty: 66
    Witam.
    Mam problem z ta pamiecia. Mecze sie juz dwa dni i nic. Podlaczylem ja na jednej magistrali z PCF8583 (RTC) i ADS1100 (ADC) do uP Atmega 8. Zegar i przetwornik chodza bez problemu. Narazie uzywam programowej obslugi I2C w AVRGCC z biblioteki RKlibAVR...
    Pin A0 pamieci mam podlaczony do masy wiec adres pamieci na magistrali to 101000px, x=1(odczyt), x=0(zapis), p to wybor strony(??).
    Zrobilem wg. pdf'a Atmela dwie procedurki testowe - do odczytu i zapisu w pamieci...

    u08 w_eeprom_dane(void) //ZAPIS
    {
    I2C_start();
    ack=I2C_write(0b10100000); //adres pamieci na magistrali P0=0!!! WRITE
    ack=I2C_write(0b00000000); //H adres
    ack=I2C_write(0b00000000); //L adres
    ack=I2C_write(13); //przykladowy bajt danych
    delayms(10);
    I2C_stop();
    return ack;

    void r_eeprom(void) //ODCZYT
    {
    I2C_start();
    ack=I2C_write(0b10100000); //adres pamieci na magistrali P0=0!!! WRITE
    ack=I2C_write(0b00000000); //H adres
    ack=I2C_write(0b00000000); //L adres
    I2C_start();
    ack=I2C_write(0b10100001); //adres pamieci na magistrali P0=0!!! READ
    zmienna=I2C_read(1); //czyta
    I2C_stop();
    }

    Kto mi powie gdzie robie blad i jak to jest z tym adresowaniem pamieci? Pamiec ta ma 512 stron po 256B kazda - jakie sa adresy kolejnych stron?
    Załączniki:
    • 24C1024 EEPROM z Atmega 8 - problem z odczytem i zapisem I2C w AVRGCC eepromRW.JPG (30.84 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2086206
    Anderian
    Poziom 18  
    Posty: 406
    Pomógł: 9
    Ocena: 3
    masz konflikt adresow
    PCF tez ma adres 1010000 taki sam jak masz dla 24c1024
  • REKLAMA
  • #3 2086491
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Anderian napisał:
    masz konflikt adresow
    PCF tez ma adres 1010000 taki sam jak masz dla 24c1024

    Niekoniecznie ;)
    Błąd jest tu ...
    
    ...
    delayms(10); // zamień ...
    I2C_stop();   // ... miejejscami te dwie funkcje
    ...
    

    ... , ponieważ sekwencja I2CSTOP jest sygnałem dla wewnętrznych "mechanizmów" pamięci , by skopiować bufor - który faktycznie jest pamięcią RAM - do EEPROM-u.Jeśli chodzie o dostęp do całych 128 kB , to "druga połowa" pamięci , dostępna jest pod kolejnym adresem - podobnie jak w pamięci 24c04.

    Piotrek
  • REKLAMA
  • #4 2086654
    Bromak
    Poziom 11  
    Posty: 66
    Dalej nic!!!
    Co do konfliktu adresow:
    1010001 to adres PCF'a A0=1
    1010000 a to EEPROM'u A0=0 i P0=0
    Wiec wedlug mnie poki co konfliktu nie ma.

    Chociaz lepiej bedzie jesli zmienie adresy na:
    1010000 PCF z A0=0
    1010010 EEPROM z A0=1 i P0=0
    1010011 EEPROM z A0=1 i P0=1

    Dziwna sprawa... poza tym nawet jak wyciagne PCF'a to i tak EEPROM nie dziala. WP w EEPROM'ie mam oczywiscie podpiety do masy!

    Pozdrawiam: -Sebastian

    ps. Moze ma ktos sprawdzone procedurki w C dla tej pamieci?
  • REKLAMA
  • #5 2091858
    Bromak
    Poziom 11  
    Posty: 66
    Dalej walcze z ta pamiecia!
    Jedyne co udalo mi sie uzyskac to dzialajaca procedura odczytu... Moze i ona od poczatku dzialala ale w ktoryms momencie zaczela mi odczytywac, ze w komorce pod adresem 1 jest wartosc 13, ktora tam w innym momencie wpisalem... Na wszystkich innych adresach mam FF. Probuje na tysiac sposobow wpisac na miejsce tej 13-stki jakas inna wartosc i nic!

    Mam zapytanie odnosnie Twr z dokumentacji - jak mam to rozumiec? Ten czas moze miec maksymalnie 10ms. (zalacznik pod spodem)
    Pozdrawiam: -Sebastian
    Załączniki:
    • 24C1024 EEPROM z Atmega 8 - problem z odczytem i zapisem I2C w AVRGCC Twr.JPG (27.61 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 2091926
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Bromak napisał:

    ...
    Mam zapytanie odnosnie Twr z dokumentacji - jak mam to rozumiec? Ten czas moze miec maksymalnie 10ms. (zalacznik pod spodem)
    Pozdrawiam: -Sebastian

    Masz to rozumieć dokładnie tak , jak jest narysowane.Z rysunku wynika jasno , że po wygenerowaniu sekwencji STOP - po operacji zapisu - na magistarli I2C MUSI panować cisza przez czas Twr.

    Piotrek
  • #7 2092091
    Bromak
    Poziom 11  
    Posty: 66
    DZIALA!!!
    Moj program a wlasciwie zapozyczona procedura z rklibavr zle generowala sygnal STOP dla i2c.

    Bylo tak:
    void I2C_stop(void)
    {
      I2C_SDA_WR();		// SDA na zapis
      I2C_SCL_H();
      delay10us();
      I2C_SDA_H();
      delay10us();
    }


    Zmienilem na tak:
    void I2C_stop(void)
    {
      I2C_SCL_L();
      I2C_SDA_L();
      I2C_SDA_WR();
      I2C_SCL_WR();	//inicjalizacja kierunków portów
      delay10us();
      I2C_SCL_H();
      delay10us();
      I2C_SDA_H();
      delay10us();  
    }


    I DZIALA!!! Dzieki wszystkim za odpowiedzi! :D
    Siedzac trzy dni prawie non stop nad tym eeprom'em zaprogramowalem moja atmeg'e prawie 200 po kazdej modyfikacji programu. Teraz przynajmniej I2C nie ma przedemna tajemnic - mam nadzieje!

    Pozdrawiam: -Sebastian

Podsumowanie tematu

✨ Problem dotyczył komunikacji I2C między mikrokontrolerem Atmega8 a pamięcią EEPROM 24C1024, współdzieloną na magistrali z układami PCF8583 (RTC) i ADS1100 (ADC). Początkowo występowały trudności z zapisem i odczytem danych z EEPROM, mimo poprawnej pracy pozostałych urządzeń na magistrali. Analiza wykazała potencjalny konflikt adresów I2C, jednak po korekcie adresów problem pozostał. Kluczową przyczyną błędów okazała się nieprawidłowa implementacja sygnału STOP w programowej obsłudze I2C z biblioteki RKlibAVR. Poprawiona procedura generowania sygnału STOP, zgodna z wymaganiami protokołu I2C i specyfikacją pamięci EEPROM, umożliwiła poprawne zapisywanie i odczytywanie danych. Dodatkowo zwrócono uwagę na konieczność zachowania czasu ciszy na magistrali (Twr) po sygnale STOP, aby pamięć mogła zakończyć wewnętrzne operacje zapisu. W efekcie, po modyfikacji funkcji I2C_stop i odpowiednim zarządzaniu czasami, komunikacja z 24C1024 działała poprawnie.
Wygenerowane przez model językowy.
REKLAMA