I2C Handling mit C

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Liebe Gemeinde-Mitglieder und alle die es werden wollen,

    ich war vor Kurzem noch fast am Verzweifeln, nur weil ich ein popeliges I2C-EEPROM beschreiben und auslesen wollte.

    Ich habe mich daher dazu entschlossen, mal eine einfache API zu stricken, die den Zugriff auf EEPROMs vereinfacht.
    Das Teil ist im Moment sozusagen noch in der pre-alpha Phase, funktioniert aber mit einem 24LC16 einwandfrei, soweit ich das bis jetzt beurteilen kann.

    Nach Fertigstellung der Doku und weiteren, ausgiebigeren Tests werde ich alles in github einpflegen. Die Adresse des Repository gebe ich dann hier bekannt.
    Als Anhang findet ihr hier den aktuellen Stand als gzippten tarball.
    Falls sich jemand berufen fühlt ein bisschen damit herum zu spielen so kann er das gerne tun.
    Und wenn jemand noch Ideen dazu hat oder Fehler findet -> einfach hier rein damit.
    Außerdem dachte ich mir, dass dieser Thread evtl. als eine Art Plattform für einen Erfahrungsaustausch dienen könnte.

    So, genug gelabert ....

    Ach, was ich vergaß:


    Code
    cc -o eetest eetest.c i2c_core.c i2ceecore.c i2ceeprom.c 24lc16.c -lrt


    viele Grüße aus dem sonnigen Süden,
    -ds-

  • Ich meine, das ließe sich schöner machen, wenn die Ansteuerung des EEPROMs über I2C als Kernel-Modul implementiert wäre. Die Anwendung könnte dann über open()/close()/read()/write()/lseek() auf das EEPROM zugreifen.

    Ich hatte selbst vor kurzem so ein Kernel-Modul zum Zugriff auf ein EEPROM geschrieben:

    EEPROM-Gerätetreiber für µClinux

    Die Ansteuerung ist da zwar einfacher, weil das EEPROM nicht über I2C angebunden ist. Wenn aber bereits ein I2C-Treiber vorhanden ist, dann könnte der EEPROM-Treiber den bestimmt irgendwie verwenden.


  • ...
    Ich meine, das ließe sich schöner machen, wenn die Ansteuerung des EEPROMs über I2C als Kernel-Modul implementiert wäre. Die Anwendung könnte dann über open()/close()/read()/write()/lseek() auf das EEPROM zugreifen.
    ...

    Hi auch,
    naja ... so ähnlich war das auch gedacht und so ist das Ganze auch schon aufgebaut.
    Nach aussen sichtbar sind lediglich:


    Und ich nutze auch den I2C-Bus über die passenden Funktionen.
    So ist das im Moment einfacher für mich, weil es seitens I2C noch ein paar kleine (aber bekannte) Ungereimtheiten gibt.

    Möglicherweise mache ich mal ein LKM draus ... aber ich denke so ist das auch schon ganz hilfreich.

    Danke aber für Deinen Hinweis :) ...

    -ds-


  • Ich weiß ja nicht woran's beim Zugriff auf I2C über "linux/i2c-dev.h" hakt. Es mag naiv sein, aber vielleicht löst sich das Problem ja in Luft auf, wenn der EEPROM-Treiber als Kernel-Modul geschrieben ist.

    Bei SPI gibt es auch so einen Treiber zum Zugriff aus dem User-Mode. Als ich die Anbindung der SD-Karte über SPI gemacht habe, habe ich den aber nicht hergenommen. Das wäre auch viel mehr Arbeit gewesen, weil bereits Treiber zur Ansteuerung von MMC/SD-Karten über SPI und ein SPI-Treiber für den SPI-Controller in meinem Mikrocontroller vorhanden war.

    Hier hat übrigens schon jemand anderes mit 24LC16 über I2C gerungen. Laut Kommentar im Quelltext lassen sich damit aber nur die ersten 256 Bytes des EEPROMs ansprechen. Dafür ist es als Kernel-Modul implementiert.

  • Danke für die Info,

    wenn Du Zeit und Lust hast kannst Du gerne Dein KnowHow einbringen.
    Ich hatte bis vor einigen Tagen noch keinen Plan zum I2C-Bus - bis mich dieses EEPROM geärgert hat ;) ...

    Wie sich das weiterentwickelt wird sich zeigen, aber ich kann sicherlich ein wenig bei Deinen Links spicken.

    Macht jedenfalls irgendwie Spaß und SPI kommt auch noch dran ;> ...

    bye,
    -ds-

    PS: Bitte nicht so viel Text auf einmal zitieren, sonst schimpft Schorsch wieder ;) ... und nicht ganz zu unrecht


  • Ich hatte bis vor einigen Tagen noch keinen Plan zum I2C-Bus - bis mich dieses EEPROM geärgert hat

    Macht jedenfalls irgendwie Spaß und SPI kommt auch noch dran ;> ...


    1. EEPROMs über I2C ansteuern ist gar nicht so einfach. Ein Kollege von mir hat sich kürzlich auch damit rumgeärgert.

    2. Und was willst Du mit SPI ansteuern?

    (Habe mir gerade die kostenlose Lite Edition der CodeSourcery Toolchain für Linux-PC runtergeladen (arm-none-linux-gnueabi) und installiert. Ein einfaches Hello-World-Programm ließ sich ohne irgendwelche Probleme auf dem Linux-PC übersetzen und auf dem RPi starten. Auch ein pthreads-Programm hat funktioniert. Bin am Überlegen, ob ich mir mal selbst einen Kernel für den RPi übersetze. Das könnte man zwar auch mit dem gcc auf dem RPi machen. Nur dauert das halt ewig ...

    Die CodeSourcery-Toolchain gibt es übrigens auch für Windows.)


  • 1. EEPROMs über I2C ansteuern ist gar nicht so einfach. Ein Kollege von mir hat sich kürzlich auch damit rumgeärgert.

    2. Und was willst Du mit SPI ansteuern?

    (Habe mir gerade die kostenlose Lite Edition der CodeSourcery Toolchain für Linux-PC runtergeladen (arm-none-linux-gnueabi) und installiert. Ein einfaches Hello-World-Programm ließ sich ohne irgendwelche Probleme auf dem Linux-PC übersetzen und auf dem RPi starten. Auch ein pthreads-Programm hat funktioniert. Bin am Überlegen, ob ich mir mal selbst einen Kernel für den RPi übersetze. Das könnte man zwar auch mit dem gcc auf dem RPi machen. Nur dauert das halt ewig ...

    Die CodeSourcery-Toolchain gibt es übrigens auch für Windows.)

    Ach, die EEPROM-Geschichte funktioniert schon. Lad' Dir halt vom Eingangspost (erstes ) den tarball runter und nimm ihn Deinem Kollegen mit. Im i2c_core.c sind die SMBUS und I2C Aufrufe drin.

    Was ich mit SPI mache weiß ich derzeit noch nicht ... so weit habe ich noch nicht vorgedacht. Aber evtl. mal mit einem AVR uC reden ... das könnte interessant sein. Könnte man dann irgendwie kombinieren - AVR mit seinen AD/DA Wandlern, PWM, ... usw. und Pi mit seinem Linux-Betriebssystem. Ist ne echt geniale Konstruktion.

    Den ersten Kernel für den Pi habe ich nach dieser Anleitung übersetzt. Mittlerweile habe ich mir ein script dazu gebastelt, bin aber mit den Sourcen nicht mehr auf dem aktuellsten stand.
    Lass es sein, das auf dem Pi zu machen ... das dauert Stunden, während ein durchschnittlicher Laptop dazu nur ca. 15 Minuten braucht.
    Diese CodeSourcery Geschichte hättest Du dir schenken können ... unter Linux geht das mit gnueabi (steht auch auf der eLinux-Seite).

    Viele Grüße aus der Tropennacht in Rosenheim,
    -ds-


  • Was ich mit SPI mache weiß ich derzeit noch nicht ... so weit habe ich noch nicht vorgedacht. Aber evtl. mal mit einem AVR uC reden ... das könnte interessant sein. Könnte man dann irgendwie kombinieren - AVR mit seinen AD/DA Wandlern, PWM, ... usw. und Pi mit seinem Linux-Betriebssystem. Ist ne echt geniale Konstruktion.
    Viele Grüße aus der Tropennacht in Rosenheim,
    -ds-

    daran hatte ich auch schon gedacht, der NETIO ist zu lahm für WEB aber genial für onewire, AD Wandlung, Ports, DA habe ich noch nicht gefunden :D aber sonst.....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • daran hatte ich auch schon gedacht, der NETIO ist zu lahm für WEB aber genial für onewire, AD Wandlung, Ports, DA habe ich noch nicht gefunden :D aber sonst.....

    Hi jar ...
    ich meinte jetzt nicht unbedingt NETIO ... kann sein, dass da ein AVR-uC drin läuft.
    Kommt halt drauf an, welcher ... die gibts in allen möglichen und unmöglichen Varianten.
    Ich habe hier noch einige rumfliegen ... incl. STK500 Board, was mir allerdings nur bedingt was bringt, weil ich dafür zwei V24 Schnittstellen brauche. Na gut, eine könnte ich evtl. sparen, wenn ich den uC über SPI programmiere.
    Du müsstest halt mal nachsehen, welcher uC genau im NETIO verbaut ist und dann mal bei atmel vorbeischauen und das Datenblatt runterladen.

    cu,
    -ds-


  • ??? ich habe den m32 auf den NETIO durch einen m1284p ersetzt und von m8 bis m168 und m32 - m1284 sowie tiny 85 noch keinen AVR in den Fingern gehabt der DA mitbrachte, aber alle kenne ich natürlich nicht ;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • ??? ich habe den m32 auf den NETIO durch einen m1284p ersetzt und von m8 bis m168 und m32 - m1284 sowie tiny 85 noch keinen AVR in den Fingern gehabt der DA mitbrachte, aber alle kenne ich natürlich nicht ;)

    Der hier zum Beispiel ...

    cu,
    -ds-

  • sagt doch alle hatte ich noch nicht, fast nur die ATmega und einige Tinys dort kein DA....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Moin beinander,

    nachdem ich mich jetzt eine Weile mit anderer Hardware beschäftigt habe, ist mir wieder mal ein, wie ich finde, geniales Teil, untergekommen. Es ist ein Barometer-Modul für den Arduino, das sowohl Luftdruck als auch Temperatur misst und zusätzlich als Höhenmesser verwendet werden kann.
    Es wird über I2C angesprochen und da bei Adafruit für den Arduino bereits einiges an Sourcen exisitiert, wird sich die Tüftelei diesmal wohl in Grenzen halten ;) ...

    Ich bin mal gespannt - näheres dann später unter GPIO & Elektrotechnik.

    Ich wünsche allen noch einen schönen Sommertag,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!