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!