Wie ich bereits erwähnte (siehe: MCP4725 I2C FEZ Hydra) soll das FEZ Hydra Board ja Probleme mit dem I2C haben. Was ich nun auch bestätigen muss. Das Hydra Board funktioniert zwar mit dem MCP4725 über I2C problemlos, doch mit der SigmaDSP gibt es über I2C erhebliche Probleme (zur Erinnerung: SigmaDSP und Panda II).

Wie kann man nun aber dennoch mit der SigmaDSP über I2C Kommunizieren? Dazu gibt es zwei Lösungen: zum einen, ein Update der Hydra auf NETMF 4.2 oder die Verwendung eines I2C per Software.

Das NETMF 4.2 Update kann ich derzeit noch nicht empfehlen, da es noch im Beta-Stadium ist. Der I2C Fehler wurde zwar behoben jedoch gibt es wiederrum eine Vielzahl von anderen Problemen, bei meinen Tests lief z.B. der Touch Screen nicht.

Da klingt doch die Verwendung eines Software I2C-Buses ganz vernünftig. In der Geschwindigkeit wird dies sicher nicht das schnellste aber für Steuerung eines EQ’s oder für die Lautstärke wird dies schon ausreichen.

Um den Software I2C zu verwenden wird ein Socket benötigt, welche keinen I2C Support hat z.B. Socket 7. Zu finden ist der Software I2C unter: „Gadgeteer.Interface.SoftwareI2C“.

Unter „public partial class Program“ habe ich ihn wie folgt deklariert:

public static Gadgeteer.Interfaces.SoftwareI2C softI2c;

Unter „void ProgramStarted()“ wird dann der Socket und der softI2C definiert. Für den softI2C muss noch der SDA und SCL definiert werden, ich habe Socket.Pin.Eight und Socket.Pin.Nine verwendet(wie der normale I2C).

GT.Socket socket = GT.Socket.GetSocket(7, true, null, null);  // Software I2C - need a NONE I2c Socket !
softI2c = new GT.Interfaces.SoftwareI2C(socket, GT.Socket.Pin.Eight, GT.Socket.Pin.Nine, null);

Ab jetzt geht alles wie beim Panda II und der SigmaDSP.
Über einen Button werden die Bytes erstellt und versendet:

Microsoft.SPOT.Hardware.I2CDevice.I2CTransaction[] xActions = new Microsoft.SPOT.Hardware.I2CDevice.I2CTransaction[1];

byte reg1 = 0x00;
byte reg1lo = 0x08; // Base: 0x0008
byte reg2 = 0x00;
byte reg2lo = 0x09; // Base: 0x0009
byte reg3 = 0x00;
byte reg3lo = 0x0A; // Base: 0x000A

// OFF
byte[] TONE1_OFF_0 = new byte[4] { 0x00, 0x00, 0x00, 0xFF };
byte[] TONE1_OFF_1 = new byte[4] { 0x00, 0x03, 0x33, 0x33 };
byte[] TONE1_OFF_2 = new byte[4] { 0x00, 0x00, 0x00, 0x00 };

// OFF
byte[] sendOFF_1 = new byte[6];
byte[] sendOFF_2 = new byte[6];
byte[] sendOFF_3 = new byte[6];

//1
sendOFF_1[0] = reg1;
sendOFF_1[1] = reg1lo;
sendOFF_1[2] = TONE1_OFF_0[0];
sendOFF_1[3] = TONE1_OFF_0[1];
sendOFF_1[4] = TONE1_OFF_0[2];
sendOFF_1[5] = TONE1_OFF_0[3];

xActions[0] = Microsoft.SPOT.Hardware.I2CDevice.CreateWriteTransaction(sendOFF_1);
softI2c.Write(0x38, sendOFF_1, GT.Interfaces.SoftwareI2C.LengthErrorBehavior.ThrowException);

//2
sendOFF_2[0] = reg2;
sendOFF_2[1] = reg2lo;
sendOFF_2[2] = TONE1_OFF_1[0];
sendOFF_2[3] = TONE1_OFF_1[1];
sendOFF_2[4] = TONE1_OFF_1[2];
sendOFF_2[5] = TONE1_OFF_1[3];

xActions[0] = Microsoft.SPOT.Hardware.I2CDevice.CreateWriteTransaction(sendOFF_2);
softI2c.Write(0x38, sendOFF_2, GT.Interfaces.SoftwareI2C.LengthErrorBehavior.ThrowException);

//3
sendOFF_3[0] = reg3;
sendOFF_3[1] = reg3lo;
sendOFF_3[2] = TONE1_OFF_2[0];
sendOFF_3[3] = TONE1_OFF_2[1];
sendOFF_3[4] = TONE1_OFF_2[2];
sendOFF_3[5] = TONE1_OFF_2[3];

xActions[0] = Microsoft.SPOT.Hardware.I2CDevice.CreateWriteTransaction(sendOFF_3);
softI2c.Write(0x38, sendOFF_3, GT.Interfaces.SoftwareI2C.LengthErrorBehavior.ThrowException);

Damit läst sich nun auch der Sound der DSP mit der Hydra abstellen.

Solange es nur um die einfache Steuerung geht kann ich den Software I2c nur empfehlen.