PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RAMs / EEPROMs ansprechen (I2C)



Zarathustra
31.03.2007, 19:17
Erstmal einen Gruß in die Runde, ich feiere meinen ersten Eintrag hier O:)

Nachdem ich mir heute die Grundlagen fürs I²C-benutzen nähergebracht habe, suche jetzt schon eine ganze Weile nach einer Möglichkeit einen RAM, bzw. EEPROM zu beschreiben. Adressierung des Bausteins im I²C Bus ist soweit klar, genau so wie das Bytes-rüberschieben.
Wie teile ich dem Stein aber mit WOHIN die Bytes geschoben werden sollen? Wie ist der Speicher in dem Baustein gegliedert?

Soweit hab ich es verstanden:
1) WRITE I²C Verbindung zum Stein aufbauen
2) Omniöses "Word" mitteilen, bei einem 256 byte Stein (z.B. ST24C256) eventuell sogar durch 2 bytes (?!)
3) REPEATED START und ihm sagen, dass ich nun besagten Byte lesen will..

Wäre dankbar für jede Antwort,
mein Kopf raucht mittlerweile vom Suchmaschine benutzen

p_mork
01.04.2007, 09:48
Hallo Zarathustra,

es ist genau so, wie du es sagst:

Schreiben:
1) i2c_start(slave_id);
2) i2c_write(addr, wohin man schreiben will);
[2a) i2c_write(high(addr), falls im Baustein mehr als 256 Speicherstellen vorhanden sind);]
3) i2c_write(Wert, den man an die Position [addr] schreibenwill);
Die schreibaddr wird dann normaleweise automatisch um 1 erhöht, so dass man auch mehrere Bytes nacheinander schreiben kann.
4) i2c_stop();

Lesen:
1) i2c_start_wait(slave_id);
2) i2c_write(addr, von wo man lesen will);
[2a) i2c_write(high(addr), falls im Baustein mehr als 256 Speicherstellen vorhanden sind);]
3) i2c_repeated_start(slave_id+1); Bus nochmal starten, jetzt aber für Schreibzugriff, deshalb slave_id+1
4) var=i2c_readAck(); wenn man noch ein Byte lesen will bzw i2c_readNak(); , wenn man keine Bytes mehr vom slave will
5)i2c_stop();

MfG Mark

Zarathustra
01.04.2007, 11:18
Hallo p_mork,

erstmal: dank dir für die ausführliche Antwort.
Ich sehe noch ein Problem darin wie genau ich die Adressierung der Speicherstellen gestalte:
Ich habe beispielsweise einen 256k Baustein, was insgesamt 32.000 Speicherstellen machen würde. Angenommen ich will in Stelle 17.000 ein 'a' schreiben:

i2c_start(slave_id);
i2c_write(adrl);
i2c_write(adrh)
i2c_write(0x41); // ASCII code für a ist 41 in HEX
i2c_stop();

Wie sehen nun adrl und adrh aus?

p_mork
01.04.2007, 11:27
Hallo Zarathustra,

als adrl kannst Du einfach 17000 stehen lassen, der Compiler convertiert es automatisch nach char (schneidet die oberen 8 bit ab). Adrh kann man als "(int)(adr>>8)" schreiben. Der Ausdruck "x >> y" verschiebt x um y bits nach rechts.

Also:
i2c_write(adr);
i2c_write((int)(adr>>8));[/code]

sollte dann so klappen.

MfG Mark

------------------EDIT------------------------------------
Ich hab gerade bemerkt, dass der Code voller Smileys ist. Anscheinend wird " acht Klammer zu" als Smiley interpretiert, deshalb poste ich das ganze mal als Code hier rein

i2c_write(adr);
i2c_write((int)(adr>>8));