RFM9X.IoTCore Uputronics Raspberry PiZero LoRa(TM) Expansion Board

I had to make some modifications to my RFM9X.IoT core library to support the Uputronics Raspberry PiZero LoRa(TM) Expansion Board as it doesn’t appear to have the HopeRF 9X reset pin connected.

I create another overload of the class constructor

// Constructor for RPI shields with chip select connected to CS0/CS1 and no reset pin e.g. Uputronics
public Rfm9XDevice(ChipSelectPin chipSelectPin, int interruptPinNumber)
	RegisterManager = new RegisterManager(chipSelectPin);

	// Check that SX127X chip is present
	Byte regVersionValue = RegisterManager.ReadByte((byte)Registers.RegVersion);
	if (regVersionValue != RegVersionValueExpected)
		throw new ApplicationException("Semtech SX127X not found");

	GpioController gpioController = GpioController.GetDefault();

	// Interrupt pin for RX message, TX done etc. notifications
	InterruptGpioPin = gpioController.OpenPin(interruptPinNumber);

	InterruptGpioPin.ValueChanged += InterruptGpioPin_ValueChanged;

Then disabled the strobing of the reset pin if it was not configured in the Initialise method

ublic void Initialise(
	double frequency = FrequencyDefault, // RegFrMsb, RegFrMid, RegFrLsb
	bool rxDoneignoreIfCrcMissing = true, bool rxDoneignoreIfCrcInvalid = true,
	bool paBoost = PABoostDefault, byte maxPower = RegPAConfigMaxPowerDefault, byte outputPower = RegPAConfigOutputPowerDefault, // RegPaConfig
	bool ocpOn = RegOcpDefault, byte ocpTrim = RegOcpOcpTrimDefault, // RegOcp
	RegLnaLnaGain lnaGain = LnaGainDefault, bool lnaBoost = LnaBoostDefault, // RegLna
	RegModemConfigBandwidth bandwidth = RegModemConfigBandwidthDefault, RegModemConfigCodingRate codingRate = RegModemConfigCodingRateDefault, RegModemConfigImplicitHeaderModeOn implicitHeaderModeOn = RegModemConfigImplicitHeaderModeOnDefault, //RegModemConfig1
	RegModemConfig2SpreadingFactor spreadingFactor = RegModemConfig2SpreadingFactorDefault, bool txContinuousMode = false, bool rxPayloadCrcOn = false,
	ushort symbolTimeout = SymbolTimeoutDefault,
	ushort preambleLength = PreambleLengthDefault,
	byte payloadLength = PayloadLengthDefault,
	byte payloadMaxLength = PayloadMaxLengthDefault,
	byte freqHoppingPeriod = FreqHoppingPeriodDefault,
	bool lowDataRateOptimize = LowDataRateOptimizeDefault, bool agcAutoOn = AgcAutoOnDefault,
	byte ppmCorrection = ppmCorrectionDefault,
	RegDetectOptimizeDectionOptimize detectionOptimize = RegDetectOptimizeDectionOptimizeDefault,
	bool invertIQ = InvertIqDefault,
	RegisterDetectionThreshold detectionThreshold = RegisterDetectionThresholdDefault,
	byte syncWord = RegSyncWordDefault)
	Frequency = frequency; // Store this away for RSSI adjustments
	RxDoneIgnoreIfCrcMissing = rxDoneignoreIfCrcMissing;
	RxDoneIgnoreIfCrcInvalid = rxDoneignoreIfCrcInvalid;

	// If the HopeRF module doesn't have the reset pin connected (e.g. uputroncis) not point in resetting it
	if (ResetGpioPin != null)
		// Strobe Reset pin briefly to factory reset SX127X chip

In the calling application the constructor is called when UPUTRONICS_RPIZERO_CS0 or UPUTRONICS_RPIZERO_CS0 is defined.

	private const byte InterruptLine = 25;
	private Rfm9XDevice rfm9XDevice = new Rfm9XDevice(ChipSelectPin.CS0, InterruptLine);
	private const byte InterruptLine = 16;
	private Rfm9XDevice rfm9XDevice = new Rfm9XDevice(ChipSelectPin.CS1, InterruptLine);

I rebuilt the test application with the necessary uputronics definitions and it worked.

Register 0x40 - Value 0X00 - Bits 00000000
Register 0x41 - Value 0X00 - Bits 00000000
Register 0x42 - Value 0X12 - Bits 00010010
'backgroundTaskHost.exe' (CoreCLR: CoreCLR_UWP_Domain): <span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>Loaded 'C:\Data\Users\DefaultAccount\AppData\Local\DevelopmentFiles\Rfm9xLoRaDeviceClient-uwpVS.Debug_ARM.Bryn.Lewis\System.Threading.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
14:26:42-TX 25 byte message Hello from LoRaIoT1 ! 255
14:26:42-TX Done
14:26:42-RX PacketSnr 9.5 Packet RSSI -55dBm RSSI -112dBm = 24 byte message "11 Hello Arduino LoRa! 0"
14:26:43-RX PacketSnr 9.3 Packet RSSI -56dBm RSSI -110dBm = 24 byte message "11 Hello Arduino LoRa! 1"
14:26:44-RX PacketSnr 9.8 Packet RSSI -58dBm RSSI -111dBm = 24 byte message "11 Hello Arduino LoRa! 2"
14:26:45-RX PacketSnr 9.5 Packet RSSI -58dBm RSSI -111dBm = 24 byte message "11 Hello Arduino LoRa! 3"
14:26:46-RX PacketSnr 9.3 Packet RSSI -58dBm RSSI -112dBm = 24 byte message "11 Hello Arduino LoRa! 4"
The thread 0x154 has exited with code 0 (0x0).
14:26:47-RX PacketSnr 9.8 Packet RSSI -58dBm RSSI -114dBm = 24 byte message "11

I back integrated the code into my Adafruit.IO LoRa gateway and it worked (second time after I fixed the conditional compile directive) just need to do some further stress and soak testing.


2 thoughts on “RFM9X.IoTCore Uputronics Raspberry PiZero LoRa(TM) Expansion Board

  1. Hi

    I am using the same LoRa board but I’m struggling to get it to work with the RPi. The library I am using asks for a reset pin but from what you have said above, I don’t think that the board has a reset line connected. How did you manage to get everything to work? I don’t quite follow the above approach (as I don’t use C#).

    Thanks very much

  2. Hi

    I asked about the reset pin not being connected when I purchased the cards, see email below.

    Initially I got my C# library to work by configuring an “unused” RPi GPIO as the reset pin. My library then strobed a pin on startup which wasn’t connected to anything. This worked as a temporary solution until I added an overload for my Initialise method which didn’t require a reset pin.

    Depending on how many of the GPIO pins you are using on the RPI you could try this approach.

    Some libraries have a “default” pin value which indicates that the pin isn’t used you may have to did into code/docs to see if this is the case for your setup.


    We don’t link the reset. We tried it once and had stability issues.


    Just adapting my library & samples for your shield (I like the switch setup of CS0/CS1 on RPI0, the printed pamphlet of pin assignments, and pin assignments on the silk screen makes it a lot easier) and noticed the HopeRF module Reset pin wasn’t listed.

    Do your shields have the HopeRF module reset pin connected to an RPI GPIO?



Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.