Hilfe zu I2C-Bus

Gast #222687
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);

}
Gast #222691
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
Gast #222693
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren