Transmit Interrupt
Starting with the TransmitBasic sample application I modified the code so that a hardware interrupt (specified in RegDioMapping1) was generated on TxDone (FIFO Payload Transmission completed).
The application inserts a message into the RFM95 transmit FIFO every 10 seconds with confirmation of transmission displayed shortly afterwards
public Rfm9XDevice(IIODevice device, ISpiBus spiBus, IPin chipSelectPin, IPin resetPin, IPin interruptPin) { // Chip select pin configuration ChipSelectGpioPin = device.CreateDigitalOutputPort(chipSelectPin, initialState: true); if (ChipSelectGpioPin == null) { Console.WriteLine("ChipSelectGpioPin == null"); } // Factory reset pin configuration IDigitalOutputPort resetGpioPin = device.CreateDigitalOutputPort(resetPin); if (resetGpioPin == null) { Console.WriteLine("resetGpioPin == null"); } resetGpioPin.State = false; Task.Delay(10); resetGpioPin.State = true; Task.Delay(10); // Interrupt pin for RX message & TX done notification InterruptGpioPin = device.CreateDigitalInputPort(interruptPin, InterruptMode.EdgeRising); InterruptGpioPin.Changed += InterruptGpioPin_ValueChanged; Rfm9XLoraModem = new SpiPeripheral(spiBus, ChipSelectGpioPin); if (Rfm9XLoraModem == null) { Console.WriteLine("Rfm9XLoraModem == null"); } } private void InterruptGpioPin_ValueChanged(object sender, DigitalInputPortEventArgs args) { byte irqFlags = this.RegisterReadByte(0x12); // RegIrqFlags this.RegisterWriteByte(0x12, 0xff);// Clear RegIrqFlags //Console.WriteLine(string.Format("RegIrqFlags:{0}", Convert.ToString(irqFlags, 2).PadLeft(8, '0'))); if ((irqFlags & 0b00001000) == 0b00001000) // TxDone { Console.WriteLine("Transmit-Done"); } } … public class MeadowApp : App<F7Micro, MeadowApp> { private Rfm9XDevice rfm9XDevice; public MeadowApp() { ISpiBus spiBus = Device.CreateSpiBus(500); if (spiBus == null) { Console.WriteLine("spiBus == null"); } rfm9XDevice = new Rfm9XDevice(Device, spiBus, Device.Pins.D09, Device.Pins.D11, Device.Pins.D10); // 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 // Interrupt on TxDone rfm9XDevice.RegisterWriteByte(0x40, 0b01000000); // RegDioMapping1 0b00000000 DI0 TxDone while (true) { // Set the Register Fifo address pointer rfm9XDevice.RegisterWriteByte(0x0E, 0x00); // RegFifoTxBaseAddress // Set the Register Fifo address pointer rfm9XDevice.RegisterWriteByte(0x0D, 0x0); // RegFifoAddrPtr string messageText = "Hello LoRa!"; // 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 Console.WriteLine("Sending {0} bytes message {1}", messageBytes.Length, messageText); rfm9XDevice.RegisterWriteByte(0x01, 0b10000011); // RegOpMode Task.Delay(10000).Wait(); } } }
The output in the debug window
'App.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 'App.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.Meadow\TransmitInterrupt\bin\Debug\net472\App.exe'. Symbols loaded. 'App.exe' (CLR v4.0.30319: App.exe): Loaded 'C:\Users\BrynLewis\source\repos\RFM9X.Meadow\TransmitInterrupt\bin\Debug\net472\Meadow.dll'. The program '[11164] App.exe: Program Trace' has exited with code 0 (0x0). The program '[11164] App.exe' has exited with code 0 (0x0). . . DirectRegisterAccess = True . . Sending 11 bytes message Hello LoRa! Transmit-Done Sending 11 bytes message Hello LoRa! Transmit-Done Sending 11 bytes message Hello LoRa! Transmit-Done
On the Arduino test client the serial monitor displayed
13:02:09.098 -> Sending HeLoRa World! 4 13:02:19.130 -> Message: ⸮LoRaIoT1Maduino2at 79.7,ah 39,wsa 6,wsg 13,wd 28.13,r 0.00, 13:02:19.177 -> RSSI: -72 13:02:19.177 -> Snr: 9.25 13:02:19.177 -> 13:02:19.431 -> Sending HeLoRa World! 6 13:02:29.994 -> Sending HeLoRa World! 8 13:02:32.000 -> Message: Hello LoRa! 13:02:32.000 -> RSSI: -46 13:02:32.047 -> Snr: 9.50 13:02:32.047 -> 13:02:40.750 -> Sending HeLoRa World! 10 13:02:42.260 -> Message: Hello LoRa! 13:02:42.260 -> RSSI: -45 13:02:42.314 -> Snr: 9.50 13:02:42.314 -> 13:02:51.286 -> Sending HeLoRa World! 12 13:02:52.541 -> Message: Hello LoRa! 13:02:52.541 -> RSSI: -45 13:02:52.541 -> Snr: 9.75 13:02:52.541 -> 13:03:02.112 -> Sending HeLoRa World! 14 13:03:02.745 -> Message: Hello LoRa! 13:03:02.745 -> RSSI: -45 13:03:02.792 -> Snr: 9.50 13:03:02.792 ->
Now that I’m confident my hardware is all working the next step will be building a full featured client based on my Windows 10 IoT Core library.