I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Odpovědět
AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Příspěvek od AstroMiK » 24 lis 2018, 19:43

Skoro celý den řeším následující problém:

Potřebuji do externí I2C EEPROM (24AA256) uložit nějaké údaje.
Podle kat. listu má ta paměť kapacitu 32768 osmibitových buněk.
http://ww1.microchip.com/downloads/en/d ... 21203m.pdf


Zápis i čtení funguje bez problémů - ale pouze do adresy 28671. Při pokusu o čtení nějaké vyšší adresy dostávám hodnotu 255.
Nevím, jestli je problém už při ukládání, nebo až při čtení.

Docela zajímavé je právě to číslo, od kterého už čtení nefunguje (28672).
Když se převede do binární soustavy vypadá takto: 0b0111000000000000


Program ořezaný na nezbytné minimum a jeho výpis do sériového terminálu na přechodu kolem adresy 28671 přikládám níže.
V čem by mohl být problém?

Zapojení:
SDA, SCL -> A4 , A5 (s Pull_Up odpory 10k)
Vcc -> +5V
Vss -> GND
WP -> GND
A0, A1, A2 -> +5V

Kód: Vybrat vše


#include <Wire.h>

#define I2C_ADDR_EEPROM     0b01010111         // I2C adresa EEPROM (vsechny 3 adresovaci piny v HIGH)

void setup(void) 
  {
    Serial.begin(9600); 
    Wire.begin();

    delay(10000);                             // chvilku pauza pred zacatkem zapisu

    for (unsigned int adresa = 28000; adresa < 29000; adresa++)
      {
        byte data = adresa % 14;              // zapisovat se budou postupne hodnoty 0 az 13
        EEPROM_write_byte(adresa , data );

        Serial.print (adresa);
        Serial.print (" - ");
        Serial.print (data);
        Serial.print (" - ");
        Serial.println (EEPROM_read_byte(adresa));
      
      } 
        
    Serial.println("KONEC");
  
  }


//  hlavni smycka nic nedela
void loop(void)
  {
  }





//----------  P O D P R O G R A M Y  -----------

//---------------------
// zapis do EEPROM
void EEPROM_write_byte(unsigned int adresa, byte data)
  {
    Wire.beginTransmission(I2C_ADDR_EEPROM);    // I2C adresa pri vsech adresovacich pinech v HIGH
    Wire.write(adresa >> 8);                    // horni cast adresy bunky
    Wire.write(adresa % 256);                   // dolni cast adresy bunky
    Wire.write(data);                           // hodnota 'data' se ulozi do bunky
    Wire.endTransmission();                     // konec komunikace    
    delay(10);
  }




//---------------------
// cteni z EEPROM
byte EEPROM_read_byte(unsigned int adresa)
  {
    Wire.beginTransmission(I2C_ADDR_EEPROM);    // I2C adresa pri vsech adresovacich pinech v HIGH
    Wire.write(adresa >> 8);                    // horni cast adresy bunky
    Wire.write(adresa % 256);                   // dolni cast adresy bunky
    Wire.endTransmission();
    delay(50);
    Wire.requestFrom(I2C_ADDR_EEPROM, 1);       // cist se bude 1 bunka

    return Wire.read();                         // precteni obsahu pametove bunky
  }
  
serkom.gif
serkom.gif (11.13 KiB) Zobrazeno 4334 x

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Příspěvek od pavel1tu » 24 lis 2018, 20:07

A nemusí se ta paměť adresovat jakoby po "stránkách" .... já už to jednou řešil, ale dávno, zdroják nemám, jen jsem si hrál

Doplněno ...
něco jsem našel ....
https://playground.arduino.cc/code/I2CEEPROM
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Příspěvek od AstroMiK » 24 lis 2018, 20:47

Díky...

Existují 2 způsoby práce s tou EEPROM:
1) Operace s jednotlivými bajty.
2) Sekvenční čtení a zápis několika po sobě jdoucích bajtů zároveň (v některých případech je to o něco rychlejší).

Já potřebuju ten první způsob. Zapisovat a číst jednotlivé bajty z různých adres.
Vyzkoušel jsem i ty sekvenční operace, ale pořád z vyšších adres dostávám 255.


Ale asi už jsem přišel na to, kde je problém.

Vyměnil jsem teď paměť za větší (24LC512). Ta má dvojnásobnou kapacitu (64k x 8bitů) a tam už program pracuje bez problémů v celém rozsahu adres.

Takže to nakonec asi bude vadná paměť.
Až budu objednávat nějaké součástky, tak vyzkuším ještě jiný kus "24AA256" na tom původním programu.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Příspěvek od Axamith » 26 lis 2018, 07:29

Nemám zkušenosti s ext. EEPROM, ale narazil jsem na problém se zápisem/čtením dlouhých čísel při použití klasické knihovny EEPROM.h
Dost jsem se s tím natrápil, zápisy a čtení stejných čísel probíhaly jaksi nepravidelně, jednou zapsala bez potíží, jindy vracela nesmysly.
Našel jsem knihovnu, která se chová bez potíží, zkus ji.
https://playground.arduino.cc/Code/EEPROMex
http://thijs.elenbaas.net/2012/07/exten ... or-arduino

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: I2C EEPROM: Při čtení z vyšších adres vrací číslo 255

Příspěvek od AstroMiK » 29 lis 2018, 21:56

Tak už je to jasný.

Chyba byla v tom, že jsem nebral na vědomí označení "UID" na té paměti.
Verze paměti s označením "24AA256UID" obsahuje na rozdíl od obyčejné paměti "24AA256" nepřepisovatelný blok buněk, ve kterém je uložené unikátní výrobní číslo paměti.
Tenhle blok začíná na adrese 28672 (0x7000) nevyužitými buňkami, které při čtení vrací hodnotu 0xFF.

Obrázek ze správného katalogového listu zde:
24aa256uid.gif

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host