Receive and Transmit
The first step was to confirm the transmission of messages with polled completion confirmation was working as expected.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1, SC20100.GpioPin.PA15); #endif 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 rfm9XDevice.RegisterDump(); 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); } } }
The diagnostic output shows messages being sent and on another device I could see the messages arriving. I do wonder why the first message often takes so long to send?
Register dump Register 0x00 - Value 0Xc3 Register 0x01 - Value 0X80 Register 0x02 - Value 0X1a Register 0x03 - Value 0X0b Register 0x04 - Value 0X00 Register 0x05 - Value 0X52 Register 0x06 - Value 0Xe4 Register 0x07 - Value 0Xc0 Register 0x08 - Value 0X00 Register 0x09 - Value 0X80 Register 0x0a - Value 0X09 Register 0x0b - Value 0X2b Register 0x0c - Value 0X20 Register 0x0d - Value 0X01 Register 0x0e - Value 0X80 Register 0x0f - Value 0X00 Register 0x10 - Value 0X00 Register 0x11 - Value 0X00 Register 0x12 - Value 0X00 Register 0x13 - Value 0X00 Register 0x14 - Value 0X00 Register 0x15 - Value 0X00 Register 0x16 - Value 0X00 Register 0x17 - Value 0X00 Register 0x18 - Value 0X10 Register 0x19 - Value 0X00 Register 0x1a - Value 0X00 Register 0x1b - Value 0X00 Register 0x1c - Value 0X00 Register 0x1d - Value 0X72 Register 0x1e - Value 0X70 Register 0x1f - Value 0X64 Register 0x20 - Value 0X00 Register 0x21 - Value 0X08 Register 0x22 - Value 0X01 Register 0x23 - Value 0Xff Register 0x24 - Value 0X00 Register 0x25 - Value 0X00 Register 0x26 - Value 0X04 Register 0x27 - Value 0X00 Register 0x28 - Value 0X00 Register 0x29 - Value 0X00 Register 0x2a - Value 0X00 Register 0x2b - Value 0X00 Register 0x2c - Value 0X00 Register 0x2d - Value 0X50 Register 0x2e - Value 0X14 Register 0x2f - Value 0X45 Register 0x30 - Value 0X55 Register 0x31 - Value 0Xc3 Register 0x32 - Value 0X05 Register 0x33 - Value 0X27 Register 0x34 - Value 0X1c Register 0x35 - Value 0X0a Register 0x36 - Value 0X03 Register 0x37 - Value 0X0a Register 0x38 - Value 0X42 Register 0x39 - Value 0X12 Register 0x3a - Value 0X49 Register 0x3b - Value 0X1d Register 0x3c - Value 0X00 Register 0x3d - Value 0Xaf Register 0x3e - Value 0X00 Register 0x3f - Value 0X00 Register 0x40 - Value 0X00 Register 0x41 - Value 0X00 Register 0x42 - Value 0X12 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 Sending 13 bytes message Hello LoRa 6! Send-wait Send-Done
The second step was to confirm the polled reception of messages was working as expected.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1, SC20100.GpioPin.PA15); #endif // 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 rfm9XDevice.RegisterWriteByte(0x01, 0b10000101); // RegOpMode set LoRa & RxContinuous while (true) { // Wait until a packet is received, no timeouts in PoC Debug.WriteLine("Receive-Wait"); byte irqFlags = rfm9XDevice.RegisterReadByte(0x12); // RegIrqFlags while ((irqFlags & 0b01000000) == 0) // wait until RxDone cleared { Thread.Sleep(100); irqFlags = rfm9XDevice.RegisterReadByte(0x12); // RegIrqFlags //Debug.Write("."); } Debug.WriteLine(""); Debug.WriteLine($"RegIrqFlags 0X{irqFlags:X2}"); Debug.WriteLine("Receive-Message"); byte currentFifoAddress = rfm9XDevice.RegisterReadByte(0x10); // RegFifiRxCurrent rfm9XDevice.RegisterWriteByte(0x0d, currentFifoAddress); // RegFifoAddrPtr byte numberOfBytes = rfm9XDevice.RegisterReadByte(0x13); // RegRxNbBytes byte[] messageBytes = rfm9XDevice.RegisterRead(0x00, numberOfBytes); // RegFifo rfm9XDevice.RegisterWriteByte(0x0d, 0); rfm9XDevice.RegisterWriteByte(0x12, 0b11111111); // RegIrqFlags clear all the bits string messageText = UTF8Encoding.UTF8.GetString(messageBytes); Debug.WriteLine($"Received {messageBytes.Length} byte message {messageText}"); Debug.WriteLine("Receive-Done"); } } }
The diagnostic output shows messages being received from one of my other devices.
The thread ” (0x2) has exited with code 0 (0x0).
Receive-Wait
RegIrqFlags 0X50
Receive-Message
Received 23 byte message �LoRaIoT1N3WT 18.8,H 78
Receive-Done
Receive-Wait
RegIrqFlags 0X50
Receive-Message
Received 23 byte message �LoRaIoT1N3WT 18.8,H 78
Receive-Done
Receive-Wait
The next step was to confirm the interrupt driven reception of messages was working as expected.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14, SC20100.GpioPin.PE4); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1, SC20100.GpioPin.PA15, SC20100.GpioPin.PA1); #endif // 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 rfm9XDevice.RegisterWriteByte(0x40, 0b00000000); // RegDioMapping1 0b00000000 DI0 RxReady & TxReady rfm9XDevice.RegisterWriteByte(0x01, 0b10000101); // RegOpMode set LoRa & RxContinuous rfm9XDevice.RegisterDump(); Debug.WriteLine("Receive-Wait"); Thread.Sleep(Timeout.Infinite); } } 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 // Get number of bytes in the message byte[] messageBytes = this.RegisterRead(0x00, numberOfBytes); string messageText = UTF8Encoding.UTF8.GetString(messageBytes); Debug.WriteLine($"Received {messageBytes.Length} byte message {messageText}"); } this.RegisterWriteByte(0x12, 0xff);// RegIrqFlags }
The diagnostic output shows messages being received from one of my other devices.
The thread '<No Name>' (0x2) has exited with code 0 (0x0). Receive-Wait RegIrqFlags 0X50 Receive-Message Received 23 byte message �LoRaIoT1N3WT 18.8,H 78 RegIrqFlags 0X50 Receive-Message Received 23 byte message �LoRaIoT1N3WT 18.7,H 79
The final step was to confirm the interrupt driven transmission of messages was working as expected.
class Program { static void Main() { #if TINYCLR_V2_SC20100DEV Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi3, SC20100.GpioPin.PA13, SC20100.GpioPin.PA14, SC20100.GpioPin.PE4); #endif #if TINYCLR_V2_FEZDUINO Rfm9XDevice rfm9XDevice = new Rfm9XDevice(SC20100.SpiBus.Spi6, SC20100.GpioPin.PB1, SC20100.GpioPin.PA15, SC20100.GpioPin.PA1); // Doesn't work #endif 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 // 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 {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}"); rfm9XDevice.RegisterWriteByte(0x01, 0b10000011); // RegOpMode Thread.Sleep(10000); } } } 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 & 0b00001000) == 0b00001000) // TxDone { Debug.WriteLine("Transmit-Done"); } this.RegisterWriteByte(0x12, 0xff);// RegIrqFlags }
The diagnostic output shows messages being sent but after the first message (sometimes the second or third) there are no confirmations.
The thread ” (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!
Sending 13 bytes message Hello LoRa 3!
Sending 13 bytes message Hello LoRa 4!
Sending 13 bytes message Hello LoRa 5!
Sending 13 bytes message Hello LoRa 6!
Sending 13 bytes message Hello LoRa 7!
Sending 13 bytes message Hello LoRa 8!
Sending 13 bytes message Hello LoRa 9!
Sending 14 bytes message Hello LoRa 10!
Sending 14 bytes message Hello LoRa 11!
Sending 14 bytes message Hello LoRa 12!
Sending 14 bytes message Hello LoRa 13!
Sending 14 bytes message Hello LoRa 14!
It looks like something has been broken (possibly by RC1) in my implementation of interrupt driven transmission of messages.