MCP2221 ansprechen

#4722266
Lesenswert?

Ich habe gelesen, das der MCP2221 von Windows als comX und unter Linux 
als /dev/ttyxxx erkannt wird.

Wie spreche ich den Baustein von einem PC-Programm an ?
Für den URx/UTx könnte ich mit vorstellen, das die wie eine normale 
Serielle Schnittstelle ist-
Wie aber habe ich Zugriff auf den I²C-Teil ?
Wie sieht es mit den 4 GPx-Ports aus ?

Ich würde den Baustein gerne für Linux und Win nutzen.
#4723025
Lesenswert?

Die Treiber konnte ich gemäss der Anleitung bei "MCP2221 Linux Kernel 
I2C Bus Driver" kompilieren und installieren.
1
make modules
2
make install
3
./driver_load.sh

liefen ohne Fehler durch.

So wie es scheint, hat es auf meiner NVidia auch einen I²C-Bus.
1
# i2cdetect -l
2
i2c-0  i2c         NVIDIA i2c adapter 0 at 1:00.0    I2C adapter
3
i2c-1  i2c         NVIDIA i2c adapter 1 at 1:00.0    I2C adapter
4
i2c-2  i2c         NVIDIA i2c adapter 6 at 1:00.0    I2C adapter
Der IC kann natürlich noch nicht erscheinen, da ich den erst kaufen und 
verlöten muss. ;)

Ich habe mir noch "MCP2221 Java Native Interface (v1.0)" angeguckt, aber 
hier scheint es nur Beispiele für Windows zu haben, das dort lauter DLLs 
vorhanden sind.

Gibt es auch ein minimal Beispiel für C/C++ mit Linux ?
#4723065
Lesenswert?

Mathias B. schrieb:
> gibt es auch ein minimal Beispiel für C/C++ mit Linux ?

Prinzipiell sollte so was wie ein HID Terminal ausreichen um alles mal 
zu testen. Die Befehlsstruktur steht ja im Datasheet vom MCP2221.
zB. 3.1.5 I2C™ WRITE DATA
Das hackt man dann da rein und schaut einfach mal was raus kommt (Oszi?)
So ein Terminal findest du z.B. hier -> 
http://www.hs-ulm.de/nocache/wir/Personal/PersonalSaSchr/vschilli/QtProjekte/
Das "sollte" auch unter Linux laufen...
#4723165
Lesenswert?

Mathias B. schrieb:
> Die Treiber konnte ich gemäss der Anleitung bei "MCP2221 Linux Kernel
> I2C Bus Driver" kompilieren und installieren.
>
>
1
make modules
2
> make install
3
> ./driver_load.sh
>
> liefen ohne Fehler durch.

Gut.

> Gibt es auch ein minimal Beispiel für C/C++ mit Linux ?

Speziell für den MCP2221 nicht. Mit dem Treiber, den Du kompiliert hast, 
ist es ein Standard Linux I2C Device, das wie jedes andere I2C Device 
unter Linux angesteuert wird. Kennst Du eines, kennst Du alle.

Damit Du nicht dumm sterben musst:
http://elinux.org/Interfacing_with_I2C_Devices
https://www.kernel.org/doc/Documentation/i2c/dev-interface

fchk
#4723178
Lesenswert?

Frank K. schrieb:
> Mit dem Treiber, den Du kompiliert hast,
> ist es ein Standard Linux I2C Device, das wie jedes andere I2C Device
> unter Linux angesteuert wird.
Cool, hab ich ja noch gar nie von gehört ;-)

Mathias B. schrieb:
> Ich würde den Baustein gerne für Linux und Win nutzen.
Geht vermutlich völlig ohne spezielle Treiber und dlls mit hidapi (win 
UND linux)
#4723234
Lesenswert?

>Damit Du nicht dumm sterben musst:
>http://elinux.org/Interfacing_with_I2C_Devices
>https://www.kernel.org/doc/Documentation/i2c/dev-interface

Das sieht ja recht einfach aus, Device öffnen, anschliessend schreiben 
und lesen, etwa so wie es bei dem COM-Ports der Fall ist.

Wie kann man aber die Parameter des I²C ändern, zB. der Takt von 100KB 
auf 400KB, oder die Adressen der einzelnen Geräte ?

Kann man auf diese Methode auch auf einem Rasberry auf den I²C zugreifen 
?

Was mir aber immer noch ein Rätsel ist, was sind das für Devicen auf der 
NVidia-Karte ?
#4723313
Lesenswert?

Mathias B. schrieb:
> Was mir aber immer noch ein Rätsel ist, was sind das für Devicen auf der
> NVidia-Karte ?

Des Rätsels Lösung: jeder Videoport (VGA/DVI/HDMI/DisplayPort/...) 
enthält eine I2C-Schnittstelle; darüber liest der PC ein EEPROM im 
Monitor aus welches die unterstützten Auflösungen usw. beschreibt 
(EDID-Standard).

Netterweise stellen (fast?) alle Grafiktreiber unter Linux dieses 
I2C-Interface auch als /dev/i2c-* zur Verfügung. So kann man freie 
Videoports auch als I2C-Master nutzen falls man gerade keinen MCP2221 
zur Hand hat ;-)
#4723638
Lesenswert?

Mathias B. schrieb:

> Das sieht ja recht einfach aus, Device öffnen, anschliessend schreiben
> und lesen, etwa so wie es bei dem COM-Ports der Fall ist.

Ja. Fast alles ist Datei in Unix.

> Wie kann man aber die Parameter des I²C ändern, zB. der Takt von 100KB
> auf 400KB
Dafür gibts keinen allgemeingültigen Weg. Ist meist fest im jeweiligen 
Bustreiber eincodiert.

> , oder die Adressen der einzelnen Geräte ?

Die sind meistens fix (Adress-Pins auf high oder low gelegt) und nicht 
per Software änderbar.

> Kann man auf diese Methode auch auf einem Rasberry auf den I²C zugreifen
> ?

Ich hatte noch keinen vor mir, aber ja, das sollte auf jedem Linux so 
funktionieren, egal welche Hardware. Ich habe hier kleine 1GHz 
MIPS-Prozessoren, und da funktioniert das genau so.

fchk
Gast #4772503
Lesenswert?

Ich betreibe unterdessen den MCP2221.

Nur scheint mir, mit diesem ist die I²C-Übertragung über 10x langsamer, 
als über den VGA-Port.
Wen es am Bus-Takt liegen würde, könnte der Speed nur max 4x abweichen, 
da dort die Werte 100-400KHz zugelassen sind.

Kann man evtl. etwas über IOCtl einstellen ?
Mit Google habe ich bis jetzt nichts schlaues finden können.

Ich verwende Linux Mint.
#4772662
Lesenswert?

Mathias schrieb:
> Ich betreibe unterdessen den MCP2221.
>
> Nur scheint mir, mit diesem ist die I²C-Übertragung über 10x langsamer,
> als über den VGA-Port.
> Wen es am Bus-Takt liegen würde, könnte der Speed nur max 4x abweichen,
> da dort die Werte 100-400KHz zugelassen sind.

Das liegt an dem USB dazwischen. Jede Busaktion wird in einem USB-Paket 
verschickt, und in dem USB-Zeitscheibenmodell kommt jedes Full-Speed 
Device nur alle 10 ms dran.

Das kannst Du nur ändern, indem Du das USB-Device intelligenter machst, 
damit es pro USB-Befehl mehr macht. Dein MCP2221 ist ein 
vorprogrammierter PIC16F1455. Für den musst Du dann also eigene Software 
schreiben, die möglichst wenig USB-Transaktionen benötigt.
Gast #4773471
Lesenswert?

>Das liegt an dem USB dazwischen. Jede Busaktion wird in einem USB-Paket
>verschickt, und in dem USB-Zeitscheibenmodell kommt jedes Full-Speed
>Device nur alle 10 ms dran.

Aber wieso habe ich das Problem nicht, wen ich eine Arduino als Ersatz 
für den MCP2221 nehme ?
Der Arduino hängt am gleichen USB-Port, wie den MCP2221.

Ich hätte eher gedacht, das es mit dem Arduino langsamer, das dies 
Overhead mit dem Wandeln von I²C auf COMx hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren