Peter Hartmann schrieb:
> Ich kann ja auch anstatt FF 255 schreiben, schreibe ich jetzt 256
> compiliert er zwar ohne Fehler, habe aber trotzdem ein Rotes Kreuz vor
> der Zeile.
Der I2C-Bus ist byteorientiert. Daher macht es keinen Sinn den Wert 256
herauszuschreiben. Um das komplette EEPROM lesen und auch schreiben zu
können, sollte man zunächst das Datenblatt zu Rate ziehen. Darin steht,
dass das 24C08 in 4 256 Byte große Blöcke eingeteilt ist. Diese kann man
über die I2C Adresse erreichen. Der Aufbau der 7-Bit Adresse ist wie
folgt:
1 | A6 | A5 | A4 | A3 | A2 | A1 | A0
|
2 | ----+------+------+------+------+------+-----
|
3 | 1 | 0 | 1 | 0 | x | B1 | B0
|
4 |
|
5 |
|
6 | Block | Bytes | B1 | B0
|
7 | -------+-------------+------+------
|
8 | 0 | 0 - 255 | 0 | 0
|
9 | 1 | 256 - 511 | 0 | 1
|
10 | 2 | 512 - 767 | 1 | 0
|
11 | 3 | 786 - 1023 | 1 | 1
|
Die I2C-Basisadresse des EEPROMS ist also:
1 | #define EEPROM_BASE_ADDR 0x50
|
Für einen Zugriff auf die Blöcke 0-3 muss man lediglich die Blocknummer
auf die Basisadresse addieren.
1 | #define eeprom_block_address(block) (EEPROM_BASE_ADDR+block)
|
Für die Fleury-Lib muss man noch die Blockadresse um eins nach links
schiften. Für den Block1, also die Bytes 256-511, sieht der Zugriff
folgendermaßen aus:
1 | i2c_rep_start((eeprom_block_address(1)<<1)+I2C_READ);
|
2 | ...
|
3 |
|
4 | i2c_rep_start((24c08_block_address(1)<<1)+I2C_WRITE);
|
5 | ...
|
Gruß Skriptkiddy