OK so i have simplified the apps to just sending one message from the dev board to the fez stick. I’ve incuded the code below and its still happening.
SC20260D
public sealed class Program
{
private static void Main()
{
try
{
/// References
/// https://docs.ghielectronics.com/hardware/netmf/pdfs/scm20260d-g400d-pinoutmap.pdf
/// http://files.ghielectronics.com/downloads/Schematics/Systems/UCM%20Dev%20Board%20Rev%20E%20Schematic.pdf
///
/// SET UP
///
/// Fez Stick
/// SC20260D Module (replacing my G400D)
/// UCM Development board
///
/// CANA on Dev board, GHIElectronics.TinyCLR.Pins.SC20260.CanBus.Can2, is connected to CanBus
/// Can2 on Fez Stick is connected to CanBus
///
/// all this app is doing is sending one message but the error event is firing rapidly,
/// it seems the module is continually sending the same message over the bus.
///
/// the second app on the Fez stick is receiving the same message continually and is being overwhelmed with its read buffer maxing out
var propagationPhase1 = 13; //250 kilobaud settings
var phase2 = 2;
var baudratePrescaler = 12;
var synchronizationJumpWidth = 1;
var useMultiBitSampling = false;
var can = CanController.FromName(GHIElectronics.TinyCLR.Pins.SC20260.CanBus.Can1);
can.SetNominalBitTiming(new CanBitTiming(propagationPhase1, phase2, baudratePrescaler, synchronizationJumpWidth, useMultiBitSampling));
baudratePrescaler = 3; //Change bit timing to 1 megabaud.
//Set faster CAN speed to 1 megabaud.
can.SetDataBitTiming(new CanBitTiming(propagationPhase1, phase2, baudratePrescaler, synchronizationJumpWidth, useMultiBitSampling));
can.Filter.AddMaskFilter(Filter.IdType.Standard, 0x12, 0xFFFF);
can.MessageReceived += (sender, e) =>
{
Debug.WriteLine($"RX: {sender.MessagesToRead}, TX :{sender.MessagesToWrite}");
};
can.ErrorReceived += (sender, e) =>
{
var error = string.Empty;
switch (e.Error)
{
case CanError.Passive:
error = "Passive";
break;
case CanError.ReadBufferOverrun:
error = "ReadBufferOverrun";
break;
case CanError.BusOff:
error = "BusOff";
break;
case CanError.ReadBufferFull:
error = "ReadBufferFull";
break;
}
Debug.WriteLine($"Error: {error}, Time stamp: {e.Timestamp}");
};
can.Enable();
Random random = new Random();
var canMessage = BuildMessage(0x11, (short)random.Next(360), (short)random.Next(1024), 0);
if (can.CanWriteMessage && can.WriteMessage(canMessage))
Debug.WriteLine("CAN message sent.");
}
catch
{
}
finally
{
}
Thread.Sleep(Timeout.Infinite);
}
private static CanMessage BuildMessage(int arbitrationId, short angle, short power, byte mode)
{
var angleBytes = BitConverter.GetBytes(angle);
var powerBytes = BitConverter.GetBytes(power);
var data = new byte[] { angleBytes[0], angleBytes[1], powerBytes[0], powerBytes[1], mode };
return new CanMessage()
{
Data = data,
ArbitrationId = arbitrationId, // priority
Length = data.Length,
RemoteTransmissionRequest = false,
ExtendedId = false,
FdCan = true,
BitRateSwitch = true
};
}
}
Fez Stick
public sealed class Program
{
private static void Main()
{
try
{
var propagationPhase1 = 13; //250 kilobaud settings
var phase2 = 2;
var baudratePrescaler = 12;
var synchronizationJumpWidth = 1;
var useMultiBitSampling = false;
var can = CanController.FromName(GHIElectronics.TinyCLR.Pins.SC20100.CanBus.Can2);
can.SetNominalBitTiming(new CanBitTiming(propagationPhase1, phase2, baudratePrescaler, synchronizationJumpWidth, useMultiBitSampling));
baudratePrescaler = 3; //Change bit timing to 1 megabaud.
//Set faster CAN speed to 1 megabaud.
can.SetDataBitTiming(new CanBitTiming(propagationPhase1, phase2, baudratePrescaler, synchronizationJumpWidth, useMultiBitSampling));
can.Filter.AddMaskFilter(Filter.IdType.Standard, 0x11, 0xFFFF);
can.MessageReceived += (sender, e) =>
{
$"RX: {sender.MessagesToRead}, TX :{sender.MessagesToWrite}".DebugWriteLine();
if (can.ReadMessage(out var message))
{
byte[] angleBytes = new[] { message.Data[0], message.Data[1] };
byte[] powerBytes = new[] { message.Data[2], message.Data[3] };
var angle = BitConverter.ToInt16(angleBytes, 0);
var power = BitConverter.ToInt16(powerBytes, 0);
var mode = message.Data[4];
Debug.WriteLine($"Angle: {angle}, Power: {power}, Mode: {mode}");
}
};
can.ErrorReceived += (sender, e) =>
{
var error = string.Empty;
switch (e.Error)
{
case CanError.Passive:
error = "Passive";
break;
case CanError.ReadBufferOverrun:
error = "ReadBufferOverrun";
break;
case CanError.BusOff:
error = "BusOff";
break;
case CanError.ReadBufferFull:
error = "ReadBufferFull";
break;
}
Debug.WriteLine($"Error: {error}, Time stamp: {e.Timestamp}");
};
can.Enable();
}
catch
{
}
finally
{
}
Thread.Sleep(Timeout.Infinite);
}
}