Forum: Mikrocontroller und Digitale Elektronik 24LC08B wird nur bis zum 255 byte beschrieben


von Peter H. (the_ride)


Angehängte Dateien:

Lesenswert?

Hi!

Ich habe ein 24LC08B EEprom (1k), ich kann aber nur bis zum 255 (FF) 
Byte schreiben.

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.

Und wie bekomme ich die Device Adresse eines EEproms raus wenn die nicht 
im DB steht ?

Ich benutze die lib von Peter Fleury
und diesen Code
Danke schon mal :)
cya The_ride
Peter
1
#include "i2cmaster.h"
2
#include <avr/io.h>
3
#include <stdint.h>
4
#include <util/delay.h>
5
6
 #define Dev24C02  0xA8      // device address of EEPROM 24C02, see datasheet
7
8
9
10
 int main(void)
11
 {
12
     unsigned char ret;
13
14
     i2c_init();                         // initialize I2C library
15
16
//     for (i=0, i<255; i++;);
17
18
19
     // write 0x75 to EEPROM address 5 (Byte Write)
20
     i2c_start_wait(Dev24C02+I2C_WRITE);    
21
     i2c_write(0xFF);                        
22
     i2c_write(0x41);                        
23
     i2c_stop();                            
24
25
//   {
26
//        _delay_ms(100);
27
//     }
28
29
30
     // read previously written value back from EEPROM address 5
31
     i2c_start_wait(Dev24C02+I2C_WRITE);     
32
     i2c_write(0x05);                        
33
     i2c_rep_start(Dev24C02+I2C_READ);       
34
     ret = i2c_readNak();                    
35
     i2c_stop();
36
37
     for(;;);
38
39
 }

von Horst (Gast)


Lesenswert?

char kann 256 "Adressen" darstellen: von 0 bis 255

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Peter H. (the_ride)


Lesenswert?

Hi!
@Skriptkiddy
Danke für die ausführliche erklärung werde mich damit beschäftigen 
sollte ich noch fragen haben poste ich die hier :)

cya The_ride
Peter

von Oliver J. (skriptkiddy)


Lesenswert?

OT

Du hättest dir wenigstens die Mühe machen können, diese 2 Zeilen in 
korrekter Rechtschreibung abzuliefern.

von Peter H. (the_ride)


Angehängte Dateien:

Lesenswert?

Hi!

Danke Skript Kiddy für Deine Hilfe :)

Ich kann jetzt alle Bereiche meiner EEproms beschreiben, :)
und da ich das so gut fand, das Du mir das so ausführlich erklärt hast,
habe ich nicht wirklich auf die Rechtschreibung geachtet ;)

Eine Frage habe ich aber trotzdem noch.
Wenn ich ein Wort wie "Hallo" in mein EEProm schreiben will müßte das 
doch
auch ohne Buchstabe für Buchstabe gehen oder ?

als Anhang das fertige Testprogramm :)

cya The_ride
Peter

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
Noch kein Account? Hier anmelden.