Ähm? sie enthalten die Speicheradresse ab der die nachfolgenden Bytes gelesen oder gespeichert werden sollen. Sogesehen müssen sie den Wert der Addresse annehmen die DU lesen oder schreiben willst.
Wichtig ist nur das du das Pageboundary beachtest. Das ist meisten 32 Bytes, d.h. schreibst du zb. ab Addresse 2 so kannst du nur 30 Bytes in einem Rutsch lesen oder schreiben, da nach diesen 30 Bytes der interne Addresszähler von 31 wieder auf 0 geht. Würdest du ab Address 2 zb. 32 Bytes schreiben dann würden die Bytes 30 und 31 eben an Addresse 0 und 1 gespeichert, wegen dem Überlauf des Pageboundary.
Du solltest auch mal angeben welchen 24c64 du genau hast, den Hersteller und Link zum Datenblatt. Desweiteren ob du den Rest des I2C Protokolls richtig umgesetzt hast, bzw. ob der Rest auch schon getestet funktioniert.
Es könnte nämlich sein das du die falsche Slaveaddresse sendest und deshalb der EEPROM nicht reagiert. Leider geht dies aus deinem Posting nicht hervor.
Sollen mehrere solcher EERPOMs kaskadiert wie ein einziger großer EEPROM angesprochen werden so nimmt man zb. eine 16Bit Addressangabe. Im I2C Protokoll extrahiert man nun 3 Bits -> Bits 13 bis 15 und benutzt diese als A0-A2 in der Slaveaddresse. Natürlich müssen die EERPOMs auch ihre Pins A0-A2 entsprechend verbunden haben. In der verbleibenden 16Bit Addresse werden nun Bits 13-15 gelöscht und im weiteren Protokollverlauf gesendet.
Nochmal genauer: Dein 24c64 hat 8Kb = 8192 Bytes = 0x2000 Bytes. Die Addresse kann von 0x0000 bis 0x1FFF gehen und benötigt somit maximal eine 13 Bit Addresse. Du kannst im Addressfeld des I2C Protokolls nun jede beliebige Speicheraddresse zum lesen oder schreiben angeben, und must also den EEPROM nicht Blockweise auslesen um an 1 Byte ranzukommen. Du must nur darauf achten das durch das 32 Bytes Pageboundary du maximal 32 Bytes in einem Rutsch lesen oder schreiben kannst, und das dann auch nur ab einer Addresse die durch 32 ohne Rest teilbar ist -> Address & 0x1F == 0. Willst du also mehr als 32 Bytes lesen oder schreiben oder willst du über diese Grenzen hinweg lesen oder schreiben so muss deine I2C Routine dies explizit berücksichtigen und die Speicherzugriffe zerstückeln.
Du könntest natürlich auch vor jedem einzelnen Byte ein Device-Select durchführen und zu diesem Byte die benötigte Addresse senden. Aber dies wäre ziemlich ineffizient. Deshalb haben die EEPROMs internen einen 32 Bytes große Buffer und einen eigenen Addresszähler der von 0 bis 31 gehen kann. Man muß also im besten Falle für 32 Bytes am Stück nur einmal einen Deviceselect durchführen. Dieser Modus steht unter dem Stichwort "Page Write" und "Page Read" in den Datenblättern.
Gruß Hagen
Lesezeichen