The Basics
A week ago a selection of Single Board Computers(SBC) arrived from GHI Electronics. Previously I had been working with a SC20100 Dev board which has mikroBUS Click sockets which limited my peripheral options. There were several different device form factors in the package so I started with a Fezduino and Dragino LoRa shield for Arduino.

Need to be careful not to push the Dragino shield in too far as a couple of the pins (one is not connected and the other is IOREF) will contact the Micro SD card slot. (I have put a strip of Duct tape on the top of the Micro SD card socket)

The first step was to get basic connectivity sorted. I opened the RFM9XLoRa-TinyCLR repository and modified the Serial Peripheral Interface(SPI) and chip select(CS) settings of the ShieldSPI project, then updated the NuGet packages (public feed rather than my local preview files).

I have left the TinyCLR V1 configuration in for backward compatibility
#if TINYCLR_V1_FEZDUINO ChipSelectLine = FEZ.GpioPin.D10, #endif #if TINYCLR_V2_SC20100DEV ChipSelectLine = GHIElectronics.TinyCLR.Devices.Gpio.GpioController.GetDefault().OpenPin(SC20100.GpioPin.PA13), #endif #if TINYCLR_V2_FEZDUINO ChipSelectLine = GHIElectronics.TinyCLR.Devices.Gpio.GpioController.GetDefault().OpenPin(GHIElectronics.TinyCLR.Pins.SC20100.GpioPin.PB1), #endif
When I ran the application in Visual Studio I could reliably read the RegVersion register.
The thread '<No Name>' (0x2) has exited with code 0 (0x0). Value = 0x00-12 Value = 0x00-12 Value = 0x00-12 Value = 0x00-12 Value = 0x00-12 Value = 0x00-12 The program '[5] TinyCLR application: Managed' has exited with code 0 (0x0).
The next step was to modify the RegisterScan project to check I could read all the SX127X configuration registers.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1); #endif while (true) { for (byte registerIndex = 0; registerIndex <= 0x42; registerIndex++) { byte registerValue = rfm9XDevice.RegisterReadByte(registerIndex); Debug.WriteLine($"Register 0x{registerIndex:x2} - Value 0X{registerValue:x2}"); } Debug.WriteLine(""); Thread.Sleep(10000); } } }
When I ran the application in Visual Studio I could reliably read the registers 0x00 through 0x42.
The thread '<No Name>' (0x2) has exited with code 0 (0x0). Register 0x00 - Value 0X00 Register 0x01 - Value 0X09 Register 0x02 - Value 0X1a Register 0x03 - Value 0X0b Register 0x04 - Value 0X00 Register 0x05 - Value 0X52 Register 0x06 - Value 0X6c Register 0x07 - Value 0X80 Register 0x08 - Value 0X00 Register 0x09 - Value 0X4f Register 0x0a - Value 0X09 Register 0x0b - Value 0X2b Register 0x0c - Value 0X20 Register 0x0d - Value 0X08 Register 0x0e - Value 0X02 Register 0x0f - Value 0X0a Register 0x10 - Value 0Xff Register 0x11 - Value 0X71 Register 0x12 - Value 0X15 Register 0x13 - Value 0X0b Register 0x14 - Value 0X28 Register 0x15 - Value 0X0c Register 0x16 - Value 0X12 Register 0x17 - Value 0X47 Register 0x18 - Value 0X32 Register 0x19 - Value 0X3e Register 0x1a - Value 0X00 Register 0x1b - Value 0X00 Register 0x1c - Value 0X00 Register 0x1d - Value 0X00 Register 0x1e - Value 0X00 Register 0x1f - Value 0X40 Register 0x20 - Value 0X00 Register 0x21 - Value 0X00 Register 0x22 - Value 0X00 Register 0x23 - Value 0X00 Register 0x24 - Value 0X05 Register 0x25 - Value 0X00 Register 0x26 - Value 0X03 Register 0x27 - Value 0X93 Register 0x28 - Value 0X55 Register 0x29 - Value 0X55 Register 0x2a - Value 0X55 Register 0x2b - Value 0X55 Register 0x2c - Value 0X55 Register 0x2d - Value 0X55 Register 0x2e - Value 0X55 Register 0x2f - Value 0X55 Register 0x30 - Value 0X90 Register 0x31 - Value 0X40 Register 0x32 - Value 0X40 Register 0x33 - Value 0X00 Register 0x34 - Value 0X00 Register 0x35 - Value 0X0f Register 0x36 - Value 0X00 Register 0x37 - Value 0X00 Register 0x38 - Value 0X00 Register 0x39 - Value 0Xf5 Register 0x3a - Value 0X20 Register 0x3b - Value 0X82 Register 0x3c - Value 0Xfb Register 0x3d - Value 0X02 Register 0x3e - Value 0X80 Register 0x3f - Value 0X40 Register 0x40 - Value 0X00 Register 0x41 - Value 0X00 Register 0x42 - Value 0X12
The next step was to modify the RegisterReadAndWrite project to check I could read and write the SX127X configuration registers.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1, SC20100.GpioPin.PA15); #endif rfm9XDevice.RegisterDump(); while (true) { Debug.WriteLine("Read RegOpMode (read byte)"); Byte regOpMode1 = rfm9XDevice.RegisterReadByte(0x1); Debug.WriteLine($"RegOpMode 0x{regOpMode1:x2}"); Debug.WriteLine("Set LoRa mode and sleep mode (write byte)"); rfm9XDevice.RegisterWriteByte(0x01, 0b10000000); Debug.WriteLine("Read RegOpMode (read byte)"); Byte regOpMode2 = rfm9XDevice.RegisterReadByte(0x1); Debug.WriteLine($"RegOpMode 0x{regOpMode2:x2}"); Debug.WriteLine("Read the preamble (read word)"); ushort preamble = rfm9XDevice.RegisterReadWord(0x20); Debug.WriteLine($"Preamble 0x{preamble:x2}"); Debug.WriteLine("Set the preamble to 0x80 (write word)"); rfm9XDevice.RegisterWriteWord(0x20, 0x80); Debug.WriteLine("Read the center frequency (read byte array)"); byte[] frequencyReadBytes = rfm9XDevice.RegisterRead(0x06, 3); Debug.WriteLine($"Frequency Msb 0x{frequencyReadBytes[0]:x2} Mid 0x{frequencyReadBytes[1]:x2} Lsb 0x{frequencyReadBytes[2]:x2}"); Debug.WriteLine("Set the center frequency to 915MHz (write byte array)"); byte[] frequencyWriteBytes = { 0xE4, 0xC0, 0x00 }; rfm9XDevice.RegisterWrite(0x06, frequencyWriteBytes); rfm9XDevice.RegisterDump(); Thread.Sleep(30000); } }
When I ran the application in Visual Studio I could read and write register values.
The thread '<No Name>' (0x2) has exited with code 0 (0x0). Register dump Register 0x00 - Value 0X00 Register 0x01 - Value 0X09 Register 0x02 - Value 0X1a Register 0x03 - Value 0X0b Register 0x04 - Value 0X00 Register 0x05 - Value 0X52 Register 0x06 - Value 0X6c Register 0x07 - Value 0X80 Register 0x08 - Value 0X00 Register 0x09 - Value 0X4f Register 0x0a - Value 0X09 Register 0x0b - Value 0X2b Register 0x0c - Value 0X20 Register 0x0d - Value 0X08 Register 0x0e - Value 0X02 Register 0x0f - Value 0X0a Register 0x10 - Value 0Xff Register 0x11 - Value 0X71 Register 0x12 - Value 0X15 Register 0x13 - Value 0X0b Register 0x14 - Value 0X28 Register 0x15 - Value 0X0c Register 0x16 - Value 0X12 Register 0x17 - Value 0X47 Register 0x18 - Value 0X32 Register 0x19 - Value 0X3e Register 0x1a - Value 0X00 Register 0x1b - Value 0X00 Register 0x1c - Value 0X00 Register 0x1d - Value 0X00 Register 0x1e - Value 0X00 Register 0x1f - Value 0X40 Register 0x20 - Value 0X00 Register 0x21 - Value 0X00 Register 0x22 - Value 0X00 Register 0x23 - Value 0X00 Register 0x24 - Value 0X05 Register 0x25 - Value 0X00 Register 0x26 - Value 0X03 Register 0x27 - Value 0X93 Register 0x28 - Value 0X55 Register 0x29 - Value 0X55 Register 0x2a - Value 0X55 Register 0x2b - Value 0X55 Register 0x2c - Value 0X55 Register 0x2d - Value 0X55 Register 0x2e - Value 0X55 Register 0x2f - Value 0X55 Register 0x30 - Value 0X90 Register 0x31 - Value 0X40 Register 0x32 - Value 0X40 Register 0x33 - Value 0X00 Register 0x34 - Value 0X00 Register 0x35 - Value 0X0f Register 0x36 - Value 0X00 Register 0x37 - Value 0X00 Register 0x38 - Value 0X00 Register 0x39 - Value 0Xf5 Register 0x3a - Value 0X20 Register 0x3b - Value 0X82 Register 0x3c - Value 0Xfa Register 0x3d - Value 0X02 Register 0x3e - Value 0X80 Register 0x3f - Value 0X40 Register 0x40 - Value 0X00 Register 0x41 - Value 0X00 Register 0x42 - Value 0X12 Read RegOpMode (read byte) RegOpMode 0x09 Set LoRa mode and sleep mode (write byte) Read RegOpMode (read byte) RegOpMode 0x80 Read the preamble (read word) Preamble 0x08 Set the preamble to 0x80 (write word) Read the center frequency (read byte array) Frequency Msb 0x6c Mid 0x80 Lsb 0x00 Set the center frequency to 915MHz (write byte array) Register dump Register 0x00 - Value 0Xc3 Register 0x01 - Value 0X80 Register 0x02 - Value 0X1a Register 0x03 - Value 0X0b Register 0x04 - Value 0X00 Register 0x05 - Value 0X52 Register 0x06 - Value 0Xe4 Register 0x07 - Value 0Xc0 Register 0x08 - Value 0X00 Register 0x09 - Value 0X4f Register 0x0a - Value 0X09 Register 0x0b - Value 0X2b Register 0x0c - Value 0X20 Register 0x0d - Value 0X01 Register 0x0e - Value 0X80 Register 0x0f - Value 0X00 Register 0x10 - Value 0X00 Register 0x11 - Value 0X00 Register 0x12 - Value 0X00 Register 0x13 - Value 0X00 Register 0x14 - Value 0X00 Register 0x15 - Value 0X00 Register 0x16 - Value 0X00 Register 0x17 - Value 0X00 Register 0x18 - Value 0X10 Register 0x19 - Value 0X00 Register 0x1a - Value 0X00 Register 0x1b - Value 0X00 Register 0x1c - Value 0X00 Register 0x1d - Value 0X72 Register 0x1e - Value 0X70 Register 0x1f - Value 0X64 Register 0x20 - Value 0X80 Register 0x21 - Value 0X00 Register 0x22 - Value 0X01 Register 0x23 - Value 0Xff Register 0x24 - Value 0X00 Register 0x25 - Value 0X00 Register 0x26 - Value 0X04 Register 0x27 - Value 0X00 Register 0x28 - Value 0X00 Register 0x29 - Value 0X00 Register 0x2a - Value 0X00 Register 0x2b - Value 0X00 Register 0x2c - Value 0X00 Register 0x2d - Value 0X50 Register 0x2e - Value 0X14 Register 0x2f - Value 0X45 Register 0x30 - Value 0X55 Register 0x31 - Value 0Xc3 Register 0x32 - Value 0X05 Register 0x33 - Value 0X27 Register 0x34 - Value 0X1c Register 0x35 - Value 0X0a Register 0x36 - Value 0X03 Register 0x37 - Value 0X0a Register 0x38 - Value 0X42 Register 0x39 - Value 0X12 Register 0x3a - Value 0X49 Register 0x3b - Value 0X1d Register 0x3c - Value 0X00 Register 0x3d - Value 0Xaf Register 0x3e - Value 0X00 Register 0x3f - Value 0X00 Register 0x40 - Value 0X00 Register 0x41 - Value 0X00 Register 0x42 - Value 0X12
At this point I was confident that I could hardware reset the shield and read/modify registers on the SX127X.