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
}