Transmit Basic
I had a couple of Armtronix IA005 SX1276 loRa nodes sitting on my desk from a recent post so I used one of them running a modified version of the Arduino LoRa library LoRaSetSyncWord example to receive messages from my device.

/* LoRa Duplex communication with Sync Word Sends a message every half second, and polls continually for new incoming messages. Sets the LoRa radio's Sync Word. Spreading factor is basically the radio's network ID. Radios with different Sync Words will not receive each other's transmissions. This is one way you can filter out radios you want to ignore, without making an addressing scheme. See the Semtech datasheet, http://www.semtech.com/images/datasheet/sx1276.pdf for more on Sync Word. created 28 April 2017 by Tom Igoe */ #include <stdlib.h> #include <LoRa.h> const int csPin = PA4; // LoRa radio chip select const int resetPin = PC13; // LoRa radio reset const int irqPin = PA11; // change for your board; must be a hardware interrupt pin byte msgCount = 0; // count of outgoing messages int interval = 2000; // interval between sends long lastSendTime = 0; // time of last packet send void setup() { Serial.begin(9600); // initialize serial while (!Serial); Serial.println("LoRa Duplex - Set sync word"); // override the default CS, reset, and IRQ pins (optional) LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin if (!LoRa.begin(915E6)) { // initialize ratio at 915 MHz Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } LoRa.setSyncWord(0x12); // ranges from 0-0xFF, default 0x34, see API docs LoRa.dumpRegisters(Serial); Serial.println("LoRa init succeeded."); } void loop() { if (millis() - lastSendTime > interval) { String message = "HeLoRa World! "; // send a message message += msgCount; sendMessage(message); Serial.println("Sending " + message); lastSendTime = millis(); // timestamp the message interval = random(1000) + 10000; // 10-11 seconds msgCount++; } // parse for a packet, and call onReceive with the result: onReceive(LoRa.parsePacket()); } void sendMessage(String outgoing) { LoRa.beginPacket(); // start packet LoRa.print(outgoing); // add payload LoRa.endPacket(); // finish packet and send it msgCount++; // increment message ID } void onReceive(int packetSize) { if (packetSize == 0) return; // if there's no packet, return // read packet header bytes: String incoming = ""; while (LoRa.available()) { incoming += (char)LoRa.read(); } Serial.println("Message: " + incoming); Serial.println("RSSI: " + String(LoRa.packetRssi())); Serial.println("Snr: " + String(LoRa.packetSnr())); Serial.println(); }
The FEZT-18N application
class Program { static void Main() { Rfm9XDevice rfm9XDevice = new Rfm9XDevice(FEZ.GpioPin.D10, FEZ.GpioPin.D9); int SendCount = 0; // Put device into LoRa + Sleep mode rfm9XDevice.RegisterWriteByte(0x01, 0b10000000); // RegOpMode // Set the frequency to 915MHz byte[] frequencyWriteBytes = { 0xE4, 0xC0, 0x00 }; // RegFrMsb, RegFrMid, RegFrLsb rfm9XDevice.RegisterWrite(0x06, frequencyWriteBytes); // More power PA Boost rfm9XDevice.RegisterWriteByte(0x09, 0b10000000); // RegPaConfig while (true) { rfm9XDevice.RegisterWriteByte(0x0E, 0x0); // RegFifoTxBaseAddress // Set the Register Fifo address pointer rfm9XDevice.RegisterWriteByte(0x0D, 0x0); // RegFifoAddrPtr string messageText = $"Hello LoRa {SendCount += 1}!"; // load the message into the fifo byte[] messageBytes = UTF8Encoding.UTF8.GetBytes(messageText); rfm9XDevice.RegisterWrite(0x0, messageBytes); // RegFifo // Set the length of the message in the fifo rfm9XDevice.RegisterWriteByte(0x22, (byte)messageBytes.Length); // RegPayloadLength Debug.WriteLine($"Sending {messageBytes.Length} bytes message {messageText}"); /// Set the mode to LoRa + Transmit rfm9XDevice.RegisterWriteByte(0x01, 0b10000011); // RegOpMode // Wait until send done, no timeouts in PoC Debug.WriteLine("Send-wait"); byte IrqFlags = rfm9XDevice.RegisterReadByte(0x12); // RegIrqFlags while ((IrqFlags & 0b00001000) == 0) // wait until TxDone cleared { Thread.Sleep(10); IrqFlags = rfm9XDevice.RegisterReadByte(0x12); // RegIrqFlags Debug.WriteLine("."); } rfm9XDevice.RegisterWriteByte(0x12, 0b00001000); // clear TxDone bit Debug.WriteLine("Send-Done"); Thread.Sleep(30000); } }
When I ran the FEZ application in Visual Studio
'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\TransmitBasic\bin\Debug\pe\..\GHIElectronics.TinyCLR.Native.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\TransmitBasic\bin\Debug\pe\..\GHIElectronics.TinyCLR.Devices.Gpio.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\TransmitBasic\bin\Debug\pe\..\GHIElectronics.TinyCLR.Devices.Spi.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\TransmitBasic\bin\Debug\pe\..\TransmitBasic.exe', Symbols loaded. The thread '<No Name>' (0x2) has exited with code 0 (0x0). Sending 13 bytes message Hello LoRa 1! Send-wait . . . . Send-Done Sending 13 bytes message Hello LoRa 2! Send-wait . . . . Send-Done Sending 13 bytes message Hello LoRa 3! Send-wait . . . . Send-Done Sending 13 bytes message Hello LoRa 4! Send-wait . . . . Send-Done Sending 13 bytes message Hello LoRa 5! Send-wait . . . . Send-Done
I could the see the messages arriving at the Armtronix device in the Arduino monitor.
19:22:28.445 -> Message: Hello LoRa 1!
19:22:28.445 -> RSSI: -36
19:22:28.479 -> Snr: 9.50
19:22:28.479 ->
19:22:29.362 -> Sending HeLoRa World! 48
19:22:40.390 -> Sending HeLoRa World! 50
19:22:50.654 -> Sending HeLoRa World! 52
19:22:58.484 -> Message: Hello LoRa 2!
19:22:58.484 -> RSSI: -36
19:22:58.553 -> Snr: 9.25
19:22:58.553 ->
19:23:01.254 -> Sending HeLoRa World! 54
19:23:11.873 -> Sending HeLoRa World! 56
19:23:22.103 -> Sending HeLoRa World! 58
19:23:28.558 -> Message: Hello LoRa 3!
19:23:28.558 -> RSSI: -31
19:23:28.592 -> Snr: 9.75
19:23:28.592 ->
19:23:32.307 -> Sending HeLoRa World! 60
19:23:42.929 -> Sending HeLoRa World! 62
19:23:53.392 -> Sending HeLoRa World! 64
19:23:58.622 -> Message: Hello LoRa 4!
19:23:58.622 -> RSSI: -36
19:23:58.655 -> Snr: 9.75
19:23:58.655 ->
19:24:03.629 -> Sending HeLoRa World! 66
19:24:14.299 -> Sending HeLoRa World! 68
19:24:24.989 -> Sending HeLoRa World! 70
This PoC code is getting a bit nasty with magic numbers and no error checking. The next step is getting a basic packet receive working…