mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe zu I2C-Bus


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: Steffen (Gast)
Datum:
Angehängte Dateien:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir hier jemand dabei unterstützen?

Vielen Dank!

Autor: Steffen (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tom,

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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.