Krumeltee

-> Elektronik, Mikrocontroller und Retro-Computing <-

I2C an jedem PC mit SDRAM DIMMs

Posted by krumeltee - 5. Dezember 2010

Für meinen „Multimedia-TV-Computer“ habe ich einen Celeron 1,1Ghz ausgewählt. Da ich auch ein wenig Elektronik dran anschliessen will, brauche ich natürlich auch I/O Ports.

In frage kommen:

  • LPT-Port -> Da kommt ein Display dran
  • Serielle Ports -> einer von zweien belegt mit einem einfachen LIRC-Receiver, der zweite Konsole
  • I2C hat jeder PC welche SDRAM als Arbeitsspeicher verwendet…

… und da wären wir. Jedes SDRAM-Module hat ein SPD-EEPROM welches Informationen zum Speicher enthält. Es ist vom Typ 24C02 bei den meisten Speichermodulen, was aber irrelevant ist, da jedes SPD-EEPROM auf SDRAM ein 24xx ist und jedes 24xx ist ein I2C EEPROM. Hier mal ein Bild wie ich die Signale SDA, SCL und VCC sowie GND „abgegriffen“ habe. Die Spannung, die anliegt ist 3,3V und ich hole ca. 50mA da raus mit meinen LEDs, wieviel da drin ist, weiss ich leider nicht, daher würde ich die Betriebsspannung für Elektronik an diesem I2C Bus doch lieber von Netzteil direkt holen.

i2c vom SDRAM Modul klauen

i2c vom SDRAM Modul klauen

Ich habe dann einen 8 Bit Port Expander vom Typ PCF8574A angeschlossen und eine LED Bar mit 4 LEDs angeschlossen.

Ich habe alle Adresspins des PCF8574 auf 1 gelegt und bekomme somit die Adresse 0x3f. Wen es interessiert wie die Adressvergabe genau aussieht, der sei hierdrauf http://www.mikrocontroller.net/articles/Port-Expander_PCF8574 verwiesen. Wer nur einen PCF8574 verwenden will, braucht sich das nicht antun.

Hier noch der Schaltplan für meine kleine Elektronik:

pcf8574a circuit

pcf8574a circuit

Damit die nächsten Schritte funktionieren muss I2C im Kernel aktiviert sein, bei den Standardkerneln der grossen Distributionen ist das normalerweise immer der Fall. Man kann davon ausgehen, wenn „lm-sensors“ funktioniert, dann funktioniert auch der I2C Bus.

Nun installiert man im Linux das Paket „i2c-tools“ und schaut sich erstmal die Ausgabe von i2cdetect an. Zuerst muss man herausfinden, an welchem I2C Adapter der Chip hängt:

i2cdetect -l

i2cdetect -l

Ich habe von meiner Geforce2 her 3 I2C-Adapter und mein Chipsatz ist von VIA. Also ist mein gesuchter I2C Adapter der vierte („3“), der SMBus Via Pro Adapter.

Nun lassen wir die I2C Devices auf dem Adapter suchen:

i2cdetect -y 3

i2cdetect -y 3

Juhuu, 0x3f wurde gefunden🙂

Nun können wir einfach mal sämtliche Bitkombinationen von 0 bis 255 ausgeben lassen, dann flackern die LEDs wild umher:

i2cdump -y 3 0x3f b

i2cdump -y 3 0x3f b

Wenn das nun schön geblinkt hat funktioniert der Portexpander am I2C Bus.

Nun ergeben sich folgende möglichkeiten:

z.B. einzelne Pins setzen mit i2cset -y 3 0x3f 0x00 DATEN

DATEN ist ein Hexwert von 0x00 bis 0xff. Drandenken, da die LEDs gegen 0 geschalten werden, muss der Wert invertiert werden, heisst bei 0xFF sind alle LEDs aus, bei 0x00 sind alle LEDs an.

Hier noch ein Foto von meinem Aufbau und ein kleines Video…

SDRAMIO

SDRAMIO

Und hier das Script, welches mit i2cset die LEDs so blinken lässt:

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

 
%d Bloggern gefällt das: