After sorting out Serial Peripheral Interface(SPI) connectivity the next step porting the techfooninja nRF24L01P library to GHI Electronics TinyCLR was rewriting the initialisation code. Overall changes were minimal as the TinyCLR V2 SPI library has similar methods to the Windows 10 IoT Core ones.

I need to refactor the initialise method so that failure exceptions are not caught and add the interrupt trigger edge so I can remove test from the handler.
public void Initialize(string spiPortName, byte chipEnablePin, byte chipSelectPin, byte 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.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;
}
// Module reset time
Thread.Sleep(100);
IsInitialized = true;
// Set reasonable default values
Address = Encoding.UTF8.GetBytes("NRF1");
DataRate = DataRate.DR2Mbps;
IsDynamicPayload = true;
IsAutoAcknowledge = true;
FlushReceiveBuffer();
FlushTransferBuffer();
ClearIrqMasks();
SetRetries(5, 60);
// Setup, CRC enabled, Power Up, PRX
SetReceiveMode();
}
The Initialise method gained parameters for the SPI port name and SPI clock frequency.
static void Main()
{
RF24 Radio = new RF24();
try
{
Radio.OnDataReceived += Radio_OnDataReceived;
Radio.OnTransmitFailed += Radio_OnTransmitFailed;
Radio.OnTransmitSuccess += Radio_OnTransmitSuccess;
// SC20100.GpioPin.PD3
Radio.Initialize(SC20100.SpiBus.Spi3, SC20100.GpioPin.PD4, SC20100.GpioPin.PD3, SC20100.GpioPin.PC5);
Radio.Address = Encoding.UTF8.GetBytes(DeviceAddress);
Radio.Channel = 15;
//Radio.PowerLevel = PowerLevel.Max;
//Radio.PowerLevel = PowerLevel.High;
//Radio.PowerLevel = PowerLevel.Low;
//Radio.PowerLevel = PowerLevel.Minimum
Radio.DataRate = DataRate.DR250Kbps;
//Radio.DataRate = DataRate.DR1Mbps;
Radio.IsEnabled = true;
Radio.IsAutoAcknowledge = true;
Radio.IsDyanmicAcknowledge = false;
Radio.IsDynamicPayload = true;
Debug.WriteLine($"Address: {Encoding.UTF8.GetString(Radio.Address)}");
Debug.WriteLine($"PowerLevel: {Radio.PowerLevel}");
Debug.WriteLine($"IsAutoAcknowledge: {Radio.IsAutoAcknowledge}");
Debug.WriteLine($"Channel: {Radio.Channel}");
Debug.WriteLine($"DataRate: {Radio.DataRate}");
Debug.WriteLine($"IsDynamicAcknowledge: {Radio.IsDyanmicAcknowledge}");
Debug.WriteLine($"IsDynamicPayload: {Radio.IsDynamicPayload}");
Debug.WriteLine($"IsEnabled: {Radio.IsEnabled}");
Debug.WriteLine($"Frequency: {Radio.Frequency}");
Debug.WriteLine($"IsInitialized: {Radio.IsInitialized}");
Debug.WriteLine($"IsPowered: {Radio.IsPowered}");
while (true)
{
string payload = "hello " + DateTime.Now.Second;
Debug.WriteLine($"{DateTime.UtcNow:HH:mm:ss}-TX {payload.Length} byte message {payload}");
Radio.SendTo(Encoding.UTF8.GetBytes(BaseStationAddress), Encoding.UTF8.GetBytes(payload));
Thread.Sleep(30000);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
return;
}
}
I can send and receive messages but the PowerLevel doesn’t look right so I need to apply fix from the Meadow version.
The thread '<No Name>' (0x2) has exited with code 0 (0x0).
Address: Dev01
PowerLevel: 15
IsAutoAcknowledge: True
Channel: 15
DataRate: 2
IsDynamicAcknowledge: False
IsDynamicPayload: True
IsEnabled: False
Frequency: 2415
IsInitialized: True
IsPowered: True
00:00:01-TX 7 byte message hello 1
Data Sent!
00:00:01-TX Succeeded!
00:00:31-TX 8 byte message hello 31
Data Sent!
00:00:31-TX Succeeded!