Forum: Mikrocontroller und Digitale Elektronik Hilfe zu I2C-Bus


von Steffen (Gast)


Lesenswert?

Hi ich möchte einen AT24FC256 mit einem ATMEGA8535 ansteuern.
Ich habe in anderen Beiträgen hier mitbekommen, dass wenn man einen
größeren AT24FC... verwendet das, das Adressbyte um eins erhöht werden
muss. Was bedeutet die für diese beiden Funktionen?
Kann ich dann aus dem unsigned char bausteinadresse ein unsigned int
bausteinadresse machen? Wie lautet für den AT24FC256 die
Bausteinadresse?

void ee24c02_write (unsigned char  bausteinadresse,speicherplatz,wert)
{
    unsigned char header;
  i2c_bus_start();

  header=(bausteinadresse<<1);
  header=(header&0x0E);  //0000$111$0b
  header=(header|0xA0);   //1010$000$0B
                //Bausteincode nach I2C für EEPROM (1010)
                          //Adresse von 24C02 auf bausteinadresse
eingestellt und
                              //24C02 zum schreiben (0) auffordern

  i2c_byte_write(header);
    i2c_ack_slave();       //Baustein(SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen

//jetzt wird der Wert für den Speicherplatz für das nachfolgende
Datenbyte gesendet

    i2c_byte_write(speicherplatz);
  i2c_ack_slave();       //Baustein(SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen

//jetzt wird das Datenbyte geschrieben

    i2c_byte_write(wert);
  i2c_ack_slave();       //Baustein(SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen
     i2c_bus_stop();
}

//---------------------------------------------------------------------- 
-----------
unsigned char ee24c02_read(unsigned char
bausteinadresse,speicherplatz)
{
  unsigned char header,wert;


  i2c_bus_start();
  header=(bausteinadresse<<1);
  header=(header&0x0E);  //0000$111$0b
  header=(header|0xA0);   //1010$000$0B
              //Bausteincode nach I2C für EEPROM (1010)
                        //Adresse von 24C02 auf bausteinadresse
eingestellt und
                            //24C02 zum schreiben (0) auffordern

  i2c_byte_write(header);
    i2c_ack_slave();       //Baustein(SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen

//jetzt wird die Speicher-Adresse geschrieben aus der dann gelesen
wird

  i2c_byte_write(speicherplatz);

  i2c_ack_slave();       //Baustein (SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen
    i2c_bus_start();        //nach dem Protokoll für Random Adress
Read

//zuerst wird wieder der Bausteincode,Adresse und R/W geschrieben

  i2c_bus_start();
  header=(bausteinadresse<<1);
  header=(header&0x0E);  //0000$111$0b
  header=(header|0xA1);   //1010$000$1B
              //Bausteincode nach I2C für EEPROM (1010)
                        //Adresse von 24C02 auf bausteinadresse
eingestellt und
                            //24C02 zum lesen (1) auffordern


  i2c_byte_write(header);

  i2c_ack_slave();       //Baustein (SLAVE) muss im ACK-Slot die
              //SDA-Leitung  herunterziehen

  wert=i2c_byte_read();  //jetzt wird der Speicherwert gelesen

  i2c_nack_master();      //Baustein muss im ACK-Slot die
              //SDA-Leitung  hochhalten
     i2c_bus_stop();

  return(wert);

}

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Muss an dieser Header Datei auch noch was verändern?
Kann ich diese header für den AT24FC256 verwenden?

von Steffen (Gast)


Lesenswert?

Kann mir hier jemand dabei unterstützen?

Vielen Dank!

von Steffen (Gast)


Lesenswert?

Bei diesem Chip kann ich doch nur byteweise zugreifen (lesen und
schreiben) oder?

von Tom (Gast)


Lesenswert?

Hallo
Ich hab mir deinen Code nicht ganz durchgesehen, aber wenn du ein
größeres EEPROM verwendest musst du statt 1 Byte zur Adressierung des
Speicherplatzes dann 2 Bytes senden. (1 Byte = 0-255, also max. 256
Werte).
Wo bei also steht: i2c_byte_write(speicherplatz);
musst du dann 2 Bytes schreiben:
i2c_byte_write(speicherplatz_high_byte);
i2c_ack_slave();
i2c_byte_write(speicherplatz_low_byte);
i2c_ack_slave();

Die Adressierung des Bausteins und Lesen/Schreiben bleibt gleich und
geht immer nur Byteweise.

Tom

von Steffen (Gast)


Lesenswert?

Hallo Tom,

danke für die Hilfe. Da heisst ich muss nur den speicherplatz als
2Byte ansehen.Mehr nicht?

von Tom (Gast)


Lesenswert?

Ja, die Adresse wird dann 2 Byte lang sein um mehr als 256 Bytes
adressieren zu können. Da die EEproms immer byteweise arbeiten musst du
die Adresse zerlegen und als 2 einzelne Bytes an den Baustein senden.
Sollte so wie oben angedeutet gehen...

Tom

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.