After sorting out Serial Peripheral Interface(SPI) connectivity the next step porting my GHI Electronics TinyCLR V2 library to the nanoFramework was rewriting the initialisation code. Overall changes were minimal as the nanoFramework similar methods to the TinyCLR V2 ones.
The Tiny CLR SPI and interrupt port configuration (note the slightly different interrupt port configuration)
if (gpio == null)
{
Debug.WriteLine("GPIO Initialization failed.");
}
else
{
_cePin = gpio.OpenPin(chipEnablePin);
_cePin.SetDriveMode(GpioPinDriveMode.Output);
_cePin.Write(GpioPinValue.Low);
_irqPin = gpio.OpenPin((byte)interruptPin);
_irqPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
_irqPin.Write(GpioPinValue.High);
_irqPin.ValueChanged += _irqPin_ValueChanged;
}
try
{
var settings = new SpiConnectionSettings()
{
ChipSelectType = SpiChipSelectType.Gpio,
ChipSelectLine = gpio.OpenPin(chipSelectPin),
Mode = SpiMode.Mode0,
ClockFrequency = clockFrequency,
ChipSelectActiveState = false,
};
SpiController controller = SpiController.FromName(spiPortName);
_spiPort = controller.GetDevice(settings);
}
catch (Exception ex)
{
Debug.WriteLine("SPI Initialization failed. Exception: " + ex.Message);
return;
}
The nanoFramework SPI and interrupt port configuration (note the slightly different SPI port configuration)
public void Initialize(string spiPortName, int chipEnablePin, int chipSelectPin, int interruptPin, int clockFrequency = 2000000)
{
var gpio = GpioController.GetDefault();
if (gpio == null)
{
Debug.WriteLine("GPIO Initialization failed.");
}
else
{
_cePin = gpio.OpenPin(chipEnablePin);
_cePin.SetDriveMode(GpioPinDriveMode.Output);
_cePin.Write(GpioPinValue.Low);
_irqPin = gpio.OpenPin((byte)interruptPin);
_irqPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
_irqPin.ValueChanged += irqPin_ValueChanged;
}
try
{
var settings = new SpiConnectionSettings(chipSelectPin)
{
ClockFrequency = clockFrequency,
Mode = SpiMode.Mode0,
SharingMode = SpiSharingMode.Shared,
};
_spiPort = SpiDevice.FromId(spiPortName, settings);
}
catch (Exception ex)
{
Debug.WriteLine("SPI Initialization failed. Exception: " + ex.Message);
return;
}
The error handling of the initialise method is broken. If the some of the GPIO or SPI port configuration fails a message is displayed in the Debug output but the caller is not notified.
I’m using a Netduino 3 Wifi as the SPI port configuration means I can use a standard Arduino shield to connect up the NRF24L01 wireless module without any jumpers
I have applied the PowerLevel fix from the TinyCLR and Meadow libraries but worry that there maybe other issues.
The thread '<No Name>' (0x2) has exited with code 0 (0x0).
Address: Dev01
PowerLevel: 2
IsAutoAcknowledge: True
Channel: 15
DataRate: 2
IsDynamicAcknowledge: False
IsDynamicPayload: True
IsEnabled: False
Frequency: 2415
IsInitialized: True
IsPowered: True
00:00:15-TX 9 byte message hello 255
Data Sent!
00:00:15-TX Succeeded!
Based on my experiences porting the library to three similar platforms and debugging it on two others I’m considering writing my own compile-time platform portable library.