Forum: Mikrocontroller und Digitale Elektronik AVR; i2c Problem, avrlib von peter fleury


von Andreas W. (Gast)


Lesenswert?

Hi

ich habe leider nicht so viel Erfahrung mit i2c, möchte aber lernen. Ich 
benutze eine ATMega 128. ich habe da ein altes EEPROM dran welches noch 
keine unterschiedliche Adressierung unterstützt (vielleicht liegt es 
auch nicht am alter sondern nur am typ, ist ja egal).
1
     unsigned char ret;
2
3
     i2c_init();                             // initialize I2C library
4
5
     // read previously written value back from EEPROM address 5 
6
     i2c_start_wait(ADRESSE+I2C_WRITE);     // set device address and write mode
7
8
     i2c_write(0x05);                        // write address = 5
9
     i2c_rep_start(ADRESSE+I2C_READ);       // set device address and read mode
10
11
     ret = i2c_readNak();                    // read one byte from EEPROM
12
     i2c_stop();

Ich habe jetzt Adresse mit 0xAF definiert, bei anderen Adressen bleibt 
die routine hängen.
ich benutze twimaster.c und i2cmaster.h aus der lib von peter fleury. An 
SDA und SCL habe ich 4,7 kOhm Widerstände dran.

Das problem ist ich bekomme immer ein 0xB0 in die variable ret. egal was 
ich auslese.

hat einer eine idee an was es leigen könnte? wenn informationen fehlen 
nicht böse sein oder zynisch einfach schreiben was fehlt bitte.

von Jörg X. (Gast)


Lesenswert?

Du hast den Typ des EEPROM nicht angegeben, aber du hast hoffentlich die 
'baud'rate des I2C richtig gesetzt (steht nicht in dem code)
1
    unsigned char ret;
2
    // initialize I2C library
3
    i2c_init();
4
5
    // read previously written value back from EEPROM address 5 
6
    i2c_start_wait(ADRESSE+I2C_WRITE);     
7
    
8
    /* Hier musst du dem EEPROM _wahrscheinlich_
9
       eine Speicheradresse schicken, damit das weiß wohin mit den bytes.
10
       schau aber lieber nach, in welcher reihenfolge */
11
    unsigned int eineadresse 0;
12
    i2c_write((unsigned char)(eineadresse>>8));
13
    i2c_write((unsigned char)eineadresse);
14
15
    // daten:
16
    i2c_write(0x05); 
17
18
    i2c_start_wait(ADRESSE+I2C_WRITE);     
19
    
20
    /* Nochmal die interne adresse schicken, die meisten EEproms 
21
      erhöhen von allein den adresszähler */
22
    i2c_write((unsigned char)(eineadresse>>8));
23
    i2c_write((unsigned char)eineadresse);
24
25
    i2c_rep_start(ADRESSE+I2C_READ);
26
27
    // set device address and read mode
28
29
     ret = i2c_readNak();                    // read one byte from EEPROM
30
     i2c_stop();

rtfm! Jörg

von Andreas W. (Gast)


Lesenswert?

stimmt hab vergessen zu schreiben was das für ein eeprom ist. es ist 
eines mit 128 byte.
ein byte adresse müsste also reichen. oder muss ich trotzdem beide 
senden? das problem ist ich habe nicht so viele informationen über den 
eeprom. der steckt in einen vergossenden gehäuse.

von Frank J. (frajo)


Lesenswert?

Weißt Du genau, daß es ein I2C Baustein ist? Die Bezeichnung für 128 
Byte ist dann 24C01. Es gibt auch Microwire. Die beginnen mit 93C.. und 
gehen nicht mit I2C.

von Andreas W. (Gast)


Lesenswert?

ok, hab den fehler gefunden.

ich habe den EEPROM mit der adresse 0xA7 angesprochen, und er hat mir 
die adresse einfach um 1 erhöht und zurückgeschickt.

Etweder hab ich es noch irgendein geheimniss beim i2c noch nicht 
gekannt, oder das ist ein eigenartiger effekt bei diesen exemplar eines 
EEPROMs.

von Jörg X. (Gast)


Lesenswert?

> ich habe den EEPROM mit der adresse 0xA7 angesprochen, und er hat mir die
> adresse einfach um 1 erhöht und zurückgeschickt.

was bedeutet das? was hast du wie angesprochen, was hat womit wann 
geantwortet?

?? Jörg
ps.: in den Datasheets gibt meistens hübsche ( -leider keine bunten- ) 
Bildchen, wie Chips über Busse angsprochen werden wollen ;-)

von Ulrich P. (uprinz)


Lesenswert?

Ich sehe das Problem nicht. Das eeprom erhöht mit jedem Zugriff seinen 
Adresszeiger. Also Adresse auf 0x05 gesetzt und was geschrieben. Damit 
steht der Adresspointer dann auf Ox06. Wenn man jetzt das vorher 
geschriebene lesen möchte, muss man erst wieder die Adresse neu setzen. 
Das ist normal und bei jedem EEPROM gleich.

Gruss, Ulrich

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.