While fixing up the Signal to Noise Ratio(SNR) and Received Signal Strength Indication(RSSI) in a previous posts. I noted the Low Noise Amplifier(LNA) had High Frequency(LF) and Low Frequency settings.
First step was to update the initialise method parameter list (the parameter list is huge but for most scenarios the defaults are fine)
public void Initialise(RegOpModeMode regOpModeAfterInitialise, // RegOpMode double frequency = FrequencyDefault, // RegFrMsb, RegFrMid, RegFrLsb bool paBoost = false, byte maxPower = RegPAConfigMaxPowerDefault, byte outputPower = RegPAConfigOutputPowerDefault, // RegPaConfig bool ocpOn = true, byte ocpTrim = RegOcpOcpTrimDefault, // RegOcp RegLnaLnaGain lnaGain = LnaGainDefault, bool lnaBoost = false, // RegLna RegModemConfigBandwidth bandwidth = RegModemConfigBandwidthDefault, RegModemConfigCodingRate codingRate = RegModemConfigCodingRateDefault, RegModemConfigImplicitHeaderModeOn implicitHeaderModeOn = RegModemConfigImplicitHeaderModeOnDefault, //RegModemConfig1 RegModemConfig2SpreadingFactor spreadingFactor = RegModemConfig2SpreadingFactorDefault, bool txContinuousMode = false, bool rxPayloadCrcOn = false, ushort symbolTimeout = SymbolTimeoutDefault, ushort preambleLength = PreambleLengthDefault, byte payloadLength = PayloadLengthDefault, byte payloadMaxLength = PayloadMaxLengthDefault, byte freqHoppingPeriod = FreqHoppingPeriodDefault, bool lowDataRateOptimize = false, bool agcAutoOn = false, byte ppmCorrection = ppmCorrectionDefault, RegDetectOptimizeDectionOptimize detectionOptimize = RegDetectOptimizeDectionOptimizeDefault, bool invertIQ = false, RegisterDetectionThreshold detectionThreshold = RegisterDetectionThresholdDefault, byte syncWord = RegSyncWordDefault) {
The SX127X RegLNA configuration code and the SetMode method required modification
if ((lnaGain != LnaGainDefault) || (lnaBoost != false)) { byte regLnaValue = (byte)lnaGain; if (lnaBoost) { if (Frequency > RFMidBandThreshold) { regLnaValue |= RegLnaLnaBoostHfOn; } else { regLnaValue |= RegLnaLnaBoostLfOn; } } Rfm9XLoraModem.WriteByte((byte)Registers.RegLna, regLnaValue); }
public void SetMode(RegOpModeMode mode) { byte regOpModeValue; regOpModeValue = RegOpModeLongRangeModeLoRa; regOpModeValue |= RegOpModeAcessSharedRegLoRa; if (Frequency > RFMidBandThreshold) { regOpModeValue |= RegOpModeLowFrequencyModeOnHighFrequency; } else { regOpModeValue |= RegOpModeLowFrequencyModeOnLowFrequency; } regOpModeValue |= (byte)mode; Rfm9XLoraModem.WriteByte((byte)Registers.RegOpMode, regOpModeValue); }
Having to convert all the Flags & masks from binary to hexadecimal values was a bit painful
// RegDioMapping1 [Flags] public enum RegDioMapping1 { Dio0RxDone = 0x00, Dio0TxDone = 0x40, Dio0CadDone = 0x80, }
The HF & LF differences where not obviously handled in Arduino-LoRa library and the Semtech LoRaMac node GitHub repository wasn’t so helpful.
When I stress tested this code the UTF8Encoding.UTF8.GetChars kept on throwing exceptions as the messages were corrupt. Need to add CRC presence and validity checking to next version.
static void rfm9XDevice_OnDataReceived(float packetSnr, int packetRssi, int rssi, byte[] data) { try { string messageText = new string(UTF8Encoding.UTF8.GetChars(data)); Debug.Print(DateTime.UtcNow.ToString("HH:MM:ss") + "-Rfm9X PacketSnr " + packetSnr.ToString("F1") + " Packet RSSI " + packetRssi + "dBm RSSI " + rssi + "dBm = " + data.Length + " byte message " + @"""" + messageText + @"""") ; } catch (Exception ex) { Debug.Print(ex.Message); } }