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); }
Muss an dieser Header Datei auch noch was verändern? Kann ich diese header für den AT24FC256 verwenden?
Bei diesem Chip kann ich doch nur byteweise zugreifen (lesen und schreiben) oder?
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
Hallo Tom, danke für die Hilfe. Da heisst ich muss nur den speicherplatz als 2Byte ansehen.Mehr nicht?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.