Forum: Mikrocontroller und Digitale Elektronik ATmega8, C Fleury Lib EEprom (FM24C64B)


von Johannes M. (jojo20)


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?

von C-hater (c-hater)


Lesenswert?

Johannes M. schrieb:

> Aber das Programm bleibt beim ausführen hängen. Ich hab noch nicht
> geschaut bei welcher Operation genau.

Dann mach' genau das erstmal. Eigentlich eine echte Frechheit, sowas zu 
posten, bevor die eigenen Möglichkeiten ausgeschöpft sind.

von Johannes M. (jojo20)


Lesenswert?

Junge junge, nur sozial inkompentene Personen hier, die sich wichtig 
tun.

Es ist doch völlig egal wo das Programm hängt, ich will doch nur 
grundsätzlich wissen ob die Schritte die richtigen sind.

#Troll-hater

von Oliver S. (oliverso)


Lesenswert?

Hier am Handy ist der Code ein unleserlicher Buchstabenbrei.

Da gibt's keine Hilfe.

Oliver

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Johannes M. schrieb:
> #define Dev24C02  0xA2

Und der IC ist auch so beschaltet? Default ist 0xA0.

von Wastl (hartundweichware)


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".

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ich habe früh aufgehört zu lesen, als ich dieses gesehen habe:

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"

von Christian S. (roehrenvorheizer)


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

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Johannes M. schrieb:
> andere Geräte funktionieren am I2C Bus.
> Nur das lesen des F-Rams geling tmir noch nicht.

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

von M. K. (sylaina)


Lesenswert?

Johannes M. schrieb:
> Ich hab noch nicht
> geschaut bei welcher Operation genau.

Na dann mach das doch mal ;)

Johannes M. schrieb:
> Ist aber auch erstmal ja egal

Wahrscheinlich nicht

Johannes M. schrieb:
> habe ich gerade irgendwo einen Denkfehler?

Ja, du schließt eine Fehlerquelle aus ohne sie vorher überprüft zu 
haben. ;)

von Peter D. (peda)


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.

von Oliver S. (oliverso)


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

von Klaus H. (hildek)


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.

: Bearbeitet durch User
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.