IOW28 und Portbaustein MCP23017
Moderator: Guido Körber
IOW28 und Portbaustein MCP23017
Hallo zusammen,
ich bekomme es nicht hin die IOs des MCP23017 über IIC in C# zu lesen oder zuschreiben. Ich habe mich an den Beispielen des IOW24 gehalten. Hat jemand eine Beispiel-Code für das IOW28-Dongle? Oder kann jemand helfen?
Grüße
ich bekomme es nicht hin die IOs des MCP23017 über IIC in C# zu lesen oder zuschreiben. Ich habe mich an den Beispielen des IOW24 gehalten. Hat jemand eine Beispiel-Code für das IOW28-Dongle? Oder kann jemand helfen?
Grüße
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW28 und Portbaustein MCP23017
Wie sieht denn der Code aus, ohne den kann man schlecht helfen.
Re: IOW28 und Portbaustein MCP23017
Anbei der zur Zeit existierende Code zum Lese. Ich danke wenn das funktionert geht schreiben analog dazu, oder?
private void ConnectIOWarrior()
{
iowHandle = IOWarrior.Functions.IowKitOpenDevice();
if (iowHandle != IntPtr.Zero)
{
int IOCount = (int)IOWarrior.Functions.IowKitGetNumDevs();
for (int c = 0; c <= IOCount; c++)
{
iowHandle = IOWarrior.Functions.IowKitGetDeviceHandle((uint)c);
pID = IOWarrior.Functions.IowKitGetProductId(iowHandle);
if (pID == IOWarrior.Defines.IOWKIT_PRODUCT_ID_IOW28) IOW28.iow28Handle = iowHandle;
}
if (IOW28.iow28Handle == IntPtr.Zero)
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}
else
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}
private void EnableIIC()
{
uint ret = 0;
//Init I2C Mode
IOW28.report[0] = 0x01; // I2C Mode
IOW28.report[1] = 0x01; // Enable
IOW28.report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
IOW28.report[3] = 0x00; // Timeout (not yet implemented)
ret = IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
}
private void ReadOverIIC_Click(object sender, EventArgs e)
{
ConnectIOWarrior();
EnableIIC();
IOW28.report[0] = 0x03; // Read mode
IOW28.report[1] = 0x02; // Count bytes to read
IOW28.report[2] = 0x00;
IOW28.report[3] = 0x00;
if (IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
if (IOWarrior.Functions.IowKitRead(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
label1.Text = IOW28.report[3].ToString();
}
else
{
MessageBox.Show("ERROR on IowKitRead(). CANCEL");
}
}
else
{
MessageBox.Show("ERROR on IowKitWrite(). CANCEL");
}
}
Danke für die angebotene Hilfe.
private void ConnectIOWarrior()
{
iowHandle = IOWarrior.Functions.IowKitOpenDevice();
if (iowHandle != IntPtr.Zero)
{
int IOCount = (int)IOWarrior.Functions.IowKitGetNumDevs();
for (int c = 0; c <= IOCount; c++)
{
iowHandle = IOWarrior.Functions.IowKitGetDeviceHandle((uint)c);
pID = IOWarrior.Functions.IowKitGetProductId(iowHandle);
if (pID == IOWarrior.Defines.IOWKIT_PRODUCT_ID_IOW28) IOW28.iow28Handle = iowHandle;
}
if (IOW28.iow28Handle == IntPtr.Zero)
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}
else
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}
private void EnableIIC()
{
uint ret = 0;
//Init I2C Mode
IOW28.report[0] = 0x01; // I2C Mode
IOW28.report[1] = 0x01; // Enable
IOW28.report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
IOW28.report[3] = 0x00; // Timeout (not yet implemented)
ret = IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
}
private void ReadOverIIC_Click(object sender, EventArgs e)
{
ConnectIOWarrior();
EnableIIC();
IOW28.report[0] = 0x03; // Read mode
IOW28.report[1] = 0x02; // Count bytes to read
IOW28.report[2] = 0x00;
IOW28.report[3] = 0x00;
if (IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
if (IOWarrior.Functions.IowKitRead(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
label1.Text = IOW28.report[3].ToString();
}
else
{
MessageBox.Show("ERROR on IowKitRead(). CANCEL");
}
}
else
{
MessageBox.Show("ERROR on IowKitWrite(). CANCEL");
}
}
Danke für die angebotene Hilfe.
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW28 und Portbaustein MCP23017
Na es fehlt die I2C Adresse, von der er lesen soll.
Also das Byte IOW28.report[2] = 0x00; , hier muss die Adresse rein. Sonst weiß er ja nicht wer gemeint ist.
Bitte dran denken, dass die IO-Warrior eine 8-Bit I2C Adresse benötigen.
Ansonsten sieht der Code soweit OK aus
Also das Byte IOW28.report[2] = 0x00; , hier muss die Adresse rein. Sonst weiß er ja nicht wer gemeint ist.
Bitte dran denken, dass die IO-Warrior eine 8-Bit I2C Adresse benötigen.
Ansonsten sieht der Code soweit OK aus
Re: IOW28 und Portbaustein MCP23017
Habe jetzt bei IOW28.report[2] die Adresse 0x40 eingetrage, die wurde mit EasyI2C ermittelt. Das Ergebnis ist immer 0, egal was am GPA oder GPB am MCP23017 anliegt.
Re: IOW28 und Portbaustein MCP23017
Als erstes muss ein Schreibzugriff mit der Adresse 0x40 erfolgen um dem MCP23017 mitzuteilen auf welches Register zugegriffen werden soll. Danach erfolgt der Lesezugriff mit der Adresse 0x41. Näheres siehe Datenblatt Punkt 1.3.2.2, Figure 1-1 und Punkt1.4
Re: IOW28 und Portbaustein MCP23017
Datenblatt vom IOW28 oder MCP23017? Wenn MCP23017, dann von welchen Hersteller. Im meinem Datenblatt habe nichts gefunden.
Wie müsste der Code dann aussehen?
Wie müsste der Code dann aussehen?
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW28 und Portbaustein MCP23017
Na es muss doch ein Datenblatt vorliegen, wenn man mit dem Baustein arbeitet, und da sollten dann auch die I2C-Register hinterlegt sein, die der Slave hat.
Wie Fr_a_nk schon geschrieben hat sollte man vor dem Lesen einen Schreibbefehl auf das I2C-Register absetzten, von dem man lesen möchte. Onst liest man unter Umständen ein anderes Register, wenn der Registerpointer im Chip automatisch hochzählt.
Wie Fr_a_nk schon geschrieben hat sollte man vor dem Lesen einen Schreibbefehl auf das I2C-Register absetzten, von dem man lesen möchte. Onst liest man unter Umständen ein anderes Register, wenn der Registerpointer im Chip automatisch hochzählt.
Re: IOW28 und Portbaustein MCP23017
Passendes Datenblatt gefunden. Werde mein Glück mal damit versuchen.
Re: IOW28 und Portbaustein MCP23017
So das lesen funktioniert jetzt super. Danke für die Tips!
Aber beim Schreiben habe ich noch so meine Probleme.
Ich möchte an Port A vom MCP23017 Daten schreiben der Code hierzu sieht z.Zt. wie folgt aus:
//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
// Daten am Port A schrieben
report[0] = 0x02; // Schriebenmodus
report[1] = 0xC2; // Start+Stop und 2 Byte
report[2] = 0x40; // Slave-Adresse
report[3] = 0x12; // Register, auf das zugegriffen werden soll
report[4] = 0x80; // Daten die geschrieben werden sollen
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
IOWarrior.Functions.IowKitRead(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
Leider wir das Bit am Port aber nicht in 1 geschaltet. Wo liegt hier da Problem?
Aber beim Schreiben habe ich noch so meine Probleme.
Ich möchte an Port A vom MCP23017 Daten schreiben der Code hierzu sieht z.Zt. wie folgt aus:
//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
// Daten am Port A schrieben
report[0] = 0x02; // Schriebenmodus
report[1] = 0xC2; // Start+Stop und 2 Byte
report[2] = 0x40; // Slave-Adresse
report[3] = 0x12; // Register, auf das zugegriffen werden soll
report[4] = 0x80; // Daten die geschrieben werden sollen
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
IOWarrior.Functions.IowKitRead(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
Leider wir das Bit am Port aber nicht in 1 geschaltet. Wo liegt hier da Problem?
-
- Site Admin
- Posts: 2857
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: IOW28 und Portbaustein MCP23017
Na wenn angegeben wird, dass zwei Bytes zu übertragen sind, dann werden auch zwei Bytes übertragen und nicht drei.
Re: IOW28 und Portbaustein MCP23017
Super, funktioniert. Danke!
Da habe ich wohl den Wald vor lauter Bäumen nicht gesehen :-)
Da habe ich wohl den Wald vor lauter Bäumen nicht gesehen :-)
Re: IOW28 und Portbaustein MCP23017
Eine Frage und ein Problem habe ich dann doch noch. Muss man vor jedem Schreib-/Lesezuriff den Modus für IIC initialisieren?
//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
Nach einer Laufzeit von ca. 13 Minuten 53 Sekunden und 8330 Messungen erhalte ich folgende Fehlermeldung:
Assistent für verwaltetes Debuggen "FatalExecutionEngineError"
Nachricht = Assistent für verwaltetes Debuggen "FatalExecutionEngineError" : "Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0x737c92b1" in Thread "0x276c". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können."
//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
Nach einer Laufzeit von ca. 13 Minuten 53 Sekunden und 8330 Messungen erhalte ich folgende Fehlermeldung:
Assistent für verwaltetes Debuggen "FatalExecutionEngineError"
Nachricht = Assistent für verwaltetes Debuggen "FatalExecutionEngineError" : "Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0x737c92b1" in Thread "0x276c". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können."
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW28 und Portbaustein MCP23017
Nein, das Einschalten eines Specialmodes muss nur einmal erfolgen. Der bleibt so lange aktiv, bis man ihn entwerder abschaltet oder dem IO-Warrior den Strom abschaltet.
Re: IOW28 und Portbaustein MCP23017
Gibt es einen Unterschied zwischen IOW28-DG und IOW28-DIL in Bezug auf das Verhalten der Specialmode Initalisierung. Auch wenn Sie schreiben das die Initialisierung nur einmalig erfolgen brauch, muss ich diese vor jedem Schreib-/Lesenzugriff machen. Ansonsten passiert am MCP23017 nichts.
Ferner habe immer noch das Probelm des Absturzes mit dem Fehlercode 0xc0000005.
Ferner habe immer noch das Probelm des Absturzes mit dem Fehlercode 0xc0000005.