ATmega8, C Fleury Lib EEprom (FM24C64B)

OP #7417675
Lesenswert?

Hi,

ich möchte mit einem ATmega8 in C programmiert mit Felury Lib ein FM24C64B lesen und beschreiben, andere Geräte funktionieren am I2C Bus. Nur das lesen des F-Rams geling tmir noch nicht.

Der Code sieht so aus:

#define Dev24C02 0xA2

uint8_t read_fm24c64(uint8_t address) //Random Read { uint8_t ret; // read previously written value back from EEPROM address 5 i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); i2c_write(address);
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode ret = i2c_readNak(); // read one byte from EEPROM i2c_stop(); return (ret); }

Aber das Programm bleibt beim ausführen hängen. Ich hab noch nicht geschaut bei welcher Operation genau. Ist aber auch erstmal ja egal, habe ich gerade irgendwo einen Denkfehler? Ich hab mir jetzt schon ein paar mal das Datasheet angeschaut und denke genau so müsste es klappen die ersten 255 Byte lesen zu können?

Wo ist mein Fehler?

#7417722
Lesenswert?

Johannes M. schrieb:

Wo ist mein Fehler?

Du hast nicht dokumentiert wie du deinen Baustein beschaltet hast. Adressen können nicht stimmen ....

Ferner haben "Anfänger" die Gewohnheit Abblock-Kondensatoren zu "vergessen". Braucht's ja alles nicht - nur unnötiger Ballast und kosten viel Geld. EEPROMs und solche FRAMs sind sehr empfindlich auf zu schwache Versorgungspannungen. Ja, ohne Abblock-Kondensatoren sind Versorgungspannungen aus der Sicht solcher Bausteine "schwach".

#7417750
Lesenswert?

Johannes M. schrieb:

paar mal das Datasheet angeschaut

Wer da auch noch hin schauen möchte, kann z.B. diesen Link benutzen, einfacher geht's fast nicht:

https://pdf1.alldatasheet.com/datasheet-pdf/view/51904/FAIRCHILD/FM24C64.html

Johannes M. schrieb:

mit Felury Lib ein FM24C64B lesen und beschreiben

Es sollte zumindest eine solche Variante der Fleury-Lib voraus gesetzt sein, die das favorisierte IC auch ansteuern kann laut Beschreibung.

Link?

mfg

#7418515
Lesenswert?

Matthias S. schrieb:

Du hast aber im Datenblatt schon gelesen, das Devices mit Extended I²C und Devices ohne Extended I²C nicht am gleichen Bus spielen?

Das ist Quatsch. Es dürfen nur nicht 2 Slaves die gleiche I2C-Adresse haben, d.h. die Adreßpins A2..0 müssen unterschiedlich gesetzt sein. Das sollte aber klar sein.

Für die FRAM kann man die gleiche Lib wie für EEPROM verwenden. Das Schreiben geht nur schneller, da die Wartezeit entfällt.

#7418521
Lesenswert?

Peter D. schrieb:

Matthias S. schrieb:

Du hast aber im Datenblatt schon gelesen, das Devices mit Extended I²C und Devices ohne Extended I²C nicht am gleichen Bus spielen?

Das ist Quatsch. Es dürfen nur nicht 2 Slaves die gleiche I2C-Adresse haben, d.h. die Adreßpins A2..0 müssen unterschiedlich gesetzt sein. Das sollte aber klar sein.

Sowohl die Fleury-Lib als auch der ATMega haben mit extended I²C ungefähr soviel am Hut wie eine Dampfmaschine mit Raketentreibstoff. Die Einschränkung kommt vom EEProm, spielt aber hier keine Rolle.

Oliver

#7418559
Lesenswert?

Arduino F. schrieb:

Johannes M. schrieb:

FM24C64B

Und dann: Johannes M. schrieb:

i2c_start_wait(Dev24C02+I2C_WRITE);

Ich verstehe die Bedeutung, aber es passt logisch nicht in meinen "DingsBums"

Da hast du recht. Im Gegensatz zum 24C02 muss man hier 2 Byte für die Leseadresse angeben. In seinem Code muss also

1
i2c_write(0x00);

zweimal nacheinander kommen. Hier ein Beispiel für ein 24C32, das in dem Punkt vergleichbar ist und auch so mit der Fleury-Lib bei mir im Einsatz ist:

1
 uint8_t read_byte_EE(uint16_t mem_addr)
2
  {
3
    uint8_t data;
4
    uint8_t low_addr  = (uint8_t) (mem_addr & 0x00FF);    // MemAddr in Low und Highbyte trennen
5
    uint8_t high_addr = (uint8_t) ((mem_addr & 0xFF00) >> 8);
6

7
    i2c_start(DEVADDR_24C32+I2C_WRITE); 
8
    i2c_write(high_addr);
9
    i2c_write(low_addr);
10
    i2c_rep_start(DEVADDR_24C32+I2C_READ);
11
    data = i2c_readNak();
12
    i2c_stop();
13
    
14
    return data;
15
  }

Geht natürlich auch nur, wenn geklärt ist, ob die Deviceadresse 0xA2 auch am IC so beschaltet ist. Für 0xA2 muss der Pin 1 (A0) auf HIGH sein.

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