- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: RAMs / EEPROMs ansprechen (I2C)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.03.2007
    Ort
    Dortmund
    Alter
    38
    Beiträge
    31

    RAMs / EEPROMs ansprechen (I2C)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Erstmal einen Gruß in die Runde, ich feiere meinen ersten Eintrag hier

    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.03.2007
    Ort
    Dortmund
    Alter
    38
    Beiträge
    31
    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?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    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>>" schreiben. Der Ausdruck "x >> y" verschiebt x um y bits nach rechts.

    Also:
    i2c_write(adr);
    i2c_write((int)(adr>>);[/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
    Code:
    i2c_write(adr);
    i2c_write((int)(adr>>8));

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress