Transmit and Receive with Interrupts
For the final revision of the “nasty” test harness I ensured interrupts were working for the simultaneous transmission and reception of messages. It’s not quite simultaneous, the code sends a message every 10 seconds then goes back to receive continuous mode after each message has been sent.
private void InterruptGpioPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) { if (e.Edge != GpioPinEdge.RisingEdge) { return; } byte irqFlags = this.RegisterReadByte(0x12); // RegIrqFlags Debug.WriteLine($"RegIrqFlags 0X{irqFlags:x2}"); if ((irqFlags & 0b01000000) == 0b01000000) // RxDone { Debug.WriteLine("Receive-Message"); byte currentFifoAddress = this.RegisterReadByte(0x10); // RegFifiRxCurrent this.RegisterWriteByte(0x0d, currentFifoAddress); // RegFifoAddrPtr byte numberOfBytes = this.RegisterReadByte(0x13); // RegRxNbBytes // Allocate buffer for message byte[] messageBytes = this.RegisterRead(0X0, numberOfBytes); string messageText = UTF8Encoding.UTF8.GetString(messageBytes); Debug.WriteLine($"Received {messageBytes.Length} byte message {messageText}"); } if ((irqFlags & 0b00001000) == 0b00001000) // TxDone { this.RegisterWriteByte(0x01, 0b10000101); // RegOpMode set LoRa & RxContinuous Debug.WriteLine("Transmit-Done"); } this.RegisterWriteByte(0x40, 0b00000000); // RegDioMapping1 0b00000000 DI0 RxReady & TxReady this.RegisterWriteByte(0x12, 0xff);// RegIrqFlags } … class Program { static void Main() { Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14, SC20100.GpioPin.PE4); 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); rfm9XDevice.RegisterWriteByte(0x0F, 0x0); // RegFifoRxBaseAddress // More power PA Boost rfm9XDevice.RegisterWriteByte(0x09, 0b10000000); // RegPaConfig rfm9XDevice.RegisterWriteByte(0x01, 0b10000101); // RegOpMode set LoRa & RxContinuous 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 rfm9XDevice.RegisterWriteByte(0x40, 0b01000000); // RegDioMapping1 0b00000000 DI0 RxReady & TxReady rfm9XDevice.RegisterWriteByte(0x01, 0b10000011); // RegOpMode Debug.WriteLine($"Sending {messageBytes.Length} bytes message {messageText}"); Thread.Sleep(10000); } } }
The diagnostic output shows inbound and outbound messages
Found debugger! Create TS. Loading Deployment Assemblies. Attaching deployed file. Assembly: mscorlib (2.0.0.0) Attaching deployed file. Assembly: GHIElectronics.TinyCLR.Devices.Spi (2.0.0.0) Attaching deployed file. Assembly: GHIElectronics.TinyCLR.Native (2.0.0.0) Attaching deployed file. Assembly: GHIElectronics.TinyCLR.Devices.Gpio (2.0.0.0) Attaching deployed file. Assembly: ReceiveTransmitInterrupt (1.0.0.0) Resolving. The debugging target runtime is loading the application assemblies and starting execution. Ready. 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\ReceiveTransmitInterrupt\bin\Debug\pe\..\GHIElectronics.TinyCLR.Native.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\ReceiveTransmitInterrupt\bin\Debug\pe\..\GHIElectronics.TinyCLR.Devices.Gpio.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\ReceiveTransmitInterrupt\bin\Debug\pe\..\GHIElectronics.TinyCLR.Devices.Spi.dll' 'GHIElectronics.TinyCLR.VisualStudio.ProjectSystem.dll' (Managed): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.TinyCLR\ReceiveTransmitInterrupt\bin\Debug\pe\..\ReceiveTransmitInterrupt.exe', Symbols loaded. The thread '<No Name>' (0x2) has exited with code 0 (0x0). Sending 13 bytes message Hello LoRa 1! RegIrqFlags 0X08 Transmit-Done Sending 13 bytes message Hello LoRa 2! RegIrqFlags 0X08 Transmit-Done Sending 13 bytes message Hello LoRa 3! RegIrqFlags 0X08 Transmit-Done RegIrqFlags 0X50 Receive-Message Received 59 byte message �LoRaIoT1Maduino2at 77.9,ah 24,wsa 0,wsg 1,wd 12.38,r 0.00, Sending 13 bytes message Hello LoRa 4! RegIrqFlags 0X08 Transmit-Done
15:11:42.775 -> ync word 15:11:42.775 -> 0x0: 0x8A 15:11:42.775 -> 0x1: 0x81 15:11:42.798 -> 0x2: 0x1A 15:11:42.798 -> 0x3: 0xB 15:11:42.798 -> 0x4: 0x0 15:11:42.798 -> 0x5: 0x52 … 15:11:44.223 -> 0x7B: 0x0 15:11:44.223 -> 0x7C: 0x0 15:11:44.256 -> 0x7D: 0x0 15:11:44.256 -> 0x7E: 0x0 15:11:44.256 -> 0x7F: 0x0 15:11:44.291 -> LoRa init succeeded. 15:11:44.839 -> Sending HeLoRa World! 0 15:11:48.788 -> Message: ⸮LoRaIoT1Maduino2at 77.5,ah 25,wsa 1,wsg 5,wd 21.00,r 0.00, 15:11:48.856 -> Length: 59 15:11:48.856 -> FirstChar: 136 15:11:48.891 -> RSSI: -83 15:11:48.891 -> Snr: 9.50 15:11:48.891 -> 15:11:49.234 -> Message: Hello LoRa 22! 15:11:49.234 -> Length: 14 15:11:49.268 -> FirstChar: 72 15:11:49.268 -> RSSI: -47 15:11:49.268 -> Snr: 9.75 15:11:49.303 -> 15:11:55.815 -> Sending HeLoRa World! 2 15:11:59.219 -> Message: Hello LoRa 23! 15:11:59.219 -> Length: 14 15:11:59.254 -> FirstChar: 72 15:11:59.254 -> RSSI: -48 15:11:59.254 -> Snr: 9.75 15:11:59.288 -> 15:12:06.597 -> Sending HeLoRa World! 4 15:12:09.218 -> Message: Hello LoRa 24! 15:12:09.218 -> Length: 14 15:12:09.253 -> FirstChar: 72 15:12:09.253 -> RSSI: -46 15:12:09.253 -> Snr: 9.25 15:12:09.287 -> 15:12:16.919 -> Sending HeLoRa World! 6 15:12:19.240 -> Message: Hello LoRa 25! 15:12:19.240 -> Length: 14 15:12:19.275 -> FirstChar: 72 15:12:19.275 -> RSSI: -47 15:12:19.275 -> Snr: 9.75 15:12:19.309 ->
The final step is back porting all the necessary changes to my Rfm9XDevice class then functionality and stress testing.