AVR; i2c Problem, avrlib von peter fleury

Gast #587553
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.
Gast #587658
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
Gast #587721
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.
Gast #587836
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.
Gast #588162
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 ;-)
(Firma: DC3AX) #588250
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren