Transmit and Receive with Interrupts
For the final iteration of the “nasty” test harness I got the interrupts working for the transmitting and receiving 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.
public Rfm9XDevice(int chipSelectPin, int resetPin, int interruptPin) { var settings = new SpiConnectionSettings() { ChipSelectType = SpiChipSelectType.Gpio, ChipSelectLine = chipSelectPin, Mode = SpiMode.Mode0, ClockFrequency = 500000, DataBitLength = 8, ChipSelectActiveState = false, }; SpiController spiCntroller = SpiController.FromName(FEZ.SpiBus.Spi1); rfm9XLoraModem = spiCntroller.GetDevice(settings); // Factory reset pin configuration GpioController gpioController = GpioController.GetDefault(); GpioPin resetGpioPin = gpioController.OpenPin(resetPin); resetGpioPin.SetDriveMode(GpioPinDriveMode.Output); resetGpioPin.Write(GpioPinValue.Low); Thread.Sleep(10); resetGpioPin.Write(GpioPinValue.High); Thread.Sleep(10); // Interrupt pin for RX message & TX done notification InterruptGpioPin = gpioController.OpenPin(interruptPin); resetGpioPin.SetDriveMode(GpioPinDriveMode.Input); InterruptGpioPin.ValueChanged += InterruptGpioPin_ValueChanged; } 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 } … public void RegisterDump() { Debug.WriteLine("Register dump"); for (byte registerIndex = 0; registerIndex <= 0x42; registerIndex++) { byte registerValue = this.RegisterReadByte(registerIndex); Debug.WriteLine($"Register 0x{registerIndex:x2} - Value 0X{registerValue:x2}"); } } } class Program { static void Main() { Rfm9XDevice rfm9XDevice = new Rfm9XDevice(FEZ.GpioPin.D10, FEZ.GpioPin.D9, FEZ.GpioPin.D2); 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 (Arduino then Meadow diagnostics)
'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 RegIrqFlags 0X50 Receive-Message Received 17 byte message HeLoRa World! 156 Sending 13 bytes message Hello LoRa 2! RegIrqFlags 0X08 Transmit-Done RegIrqFlags 0X50 Receive-Message Received 17 byte message HeLoRa World! 158 Sending 13 bytes message Hello LoRa 3! RegIrqFlags 0X08 Transmit-Done RegIrqFlags 0X50 Receive-Message Received 17 byte message HeLoRa World! 160 Sending 13 bytes message Hello LoRa 4! RegIrqFlags 0X08 Transmit-Done RegIrqFlags 0X50 Receive-Message Received 17 byte message HeLoRa World! 162 Sending 13 bytes message Hello LoRa 5! RegIrqFlags 0X08 Transmit-Done RegIrqFlags 0X50 Receive-Message Received 17 byte message HeLoRa World! 164 Sending 13 bytes message Hello LoRa 6! RegIrqFlags 0X08 Transmit-Done
20:55:09.280 -> Sending HeLoRa World! 152 20:55:25.179 -> Message: Hello LoRa 1! 20:55:25.179 -> RSSI: -44 20:55:25.212 -> Snr: 9.50 20:55:25.212 -> 20:55:30.707 -> Sending HeLoRa World! 156 20:55:35.182 -> Message: Hello LoRa 2! 20:55:35.182 -> RSSI: -43 20:55:35.215 -> Snr: 9.50 20:55:35.215 -> 20:55:41.358 -> Sending HeLoRa World! 158 20:55:45.181 -> Message: Hello LoRa 3! 20:55:45.181 -> RSSI: -44 20:55:45.214 -> Snr: 9.50 20:55:45.214 -> 20:55:52.032 -> Sending HeLoRa World! 160 20:55:55.190 -> Message: Hello LoRa 4! 20:55:55.190 -> RSSI: -44 20:55:55.258 -> Snr: 9.50 20:55:55.258 -> 20:56:02.451 -> Sending HeLoRa World! 162 20:56:05.206 -> Message: Hello LoRa 5! 20:56:05.206 -> RSSI: -41 20:56:05.241 -> Snr: 9.00 20:56:05.241 -> 20:56:12.685 -> Sending HeLoRa World! 164 20:56:15.226 -> Message: Hello LoRa 6! 20:56:15.226 -> RSSI: -41 20:56:15.261 -> Snr: 9.25 20:56:15.261 -> 20:56:22.817 -> Sending HeLoRa World! 166 20:56:25.248 -> Message: Hello LoRa 7! 20:56:25.248 -> RSSI: -36 20:56:25.283 -> Snr: 10.00 20:56:25.283 ->
Next step is some refactoring to extract the register access code and merging with my Windows 10 IoT Core RMF9X library code base.