SCPI interface to SX1272 and SX1276

Dependencies:   SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 libscpi mbed

Description

This program implements a SCPI command parser. When connected via the debug virtual comm port, you can command the radio and peripherals to perform specific tasks or to set specific parameters. The serial port defaults to 9600bps N-8-1.

Example

The following exampling causes the NA Mote to transmit a continuous LoRa signal.

Example SCPI Commands

*IDN?
RA:MOD LORA
RA:FREQ 903
RA:PAS PA_BOOST
RA:OCP 170
RA:BGR 7
RA:POW 15
RA:LORA:TXContinuous ON
RA:FI "test"

Commands

SCPI is case-insensitive. Commands can be entered lower case.

  • RAdio
    • :FIfo "text" write to fifo, and transmit packet
    • :FIfo? read from fifo (last received packet)
    • :REGister { address }, {value} write radio register (SCPI takes #H for hex prefix)
    • :REGister? { address } read radio register (SCPI takes #H for hex prefix)
    • :MODulation { FSK | OOK | LORa } set modem type
    • :MODulation? get modem type
    • :OPmode { SLE | STB | FST | TX | FSR | RXC | RXS | CAD } set mode
    • :OPmode? get mode
    • :DIOMap { 0 - 5 }, { 0 - 3 } set DIO pin function {pin number}, {map value}
    • :DIOMap? { 0 - 5 } get DIO pin function {pin number}
    • :DIO? { 0 - 5 } read DIO pin level
    • :RSSI? read received signal strength (if in RXC mode)
    • :PASelect { RFO | PA_BOOST } set RF output pin
    • :PASelect? get RF output pin selected
    • :OCP {mA} set over current protection
    • :OCP? read current limit
    • :POWer {0 to 15} set OutputPower
    • :POWer? get OutputPower
    • :BGR { 0 - 7 } set PA ref current
    • :BGR? get PA ref current
    • :FREQuency {MHz} set FRF
    • :FREQuency? get FRF
    • :LNABoost { OFF | ON } set LNA boost
    • :LNABoost? get LNA boost
    • :LORa
      • :BW {KHz} set lora bandwidth
      • :BW? get lora bandwidth (in KHz)
      • :SF {7 to 12} set spreading factor
      • :SF? get spreading factor
      • :TXContinuous { OFF | ON } set continuous TX (end transmit by turning off)
      • :TXContinuous? get continuous TX
      • :PRELen {n-symbols} set preamble length
      • :PRELen? get preamble length
      • :CR {0-4} set coding rate
      • :CR? get coding rate
      • :LDRO { OFF | ON } set LowDataRateOptimize bit
      • :LDRO? get LowDataRateOptimize bit
      • :CRC { OFF | ON} enable CRC in transmitted packet
      • :CRC? read CRC enabled state
      • :INVRx { OFF | ON } enable receiver spectral invert
      • :INVRx? get receiver inversion state
      • :INVTx { OFF | ON } enable transmitter spectral invert
      • :INVTx? get transmitter inversion state
      • :FEI? get frequency error of last received packet
      • :PKTSnr? get S/N (dB) of last received packet
    • :FSK
      • :DATAMode { CONT | PKT } select continuous/packet mode
      • :DATAMode? get packet mode / continuous
      • :FDev {Hz} set TX frequency deviation
      • :FDev? get TX frequency deviation
      • :BITRate {bps} set bit rate
      • :BITRate? get bit rate
      • :BT { 1.0 | 0.5 | 0.3 | 0.0 } set transmit shaping
      • :BT? get transmit shaping
      • :PRELen {n} set preamble size
      • :PRELen? get preamble size
      • :RXBW {Hz} set receive bandwidth
      • :RXBW? set receive bandwidth
      • :AFCBW {Hz} set receive bandwidth (during preamble)
      • :AFCBW? set receive bandwidth (during preamble)
      • :DCFree { OFF | MAN | WHIT } set DC-free encoding
      • :DCFree? get DC-free encoding
      • :RXTrigger { OFF | RSSI | PRE | BOTH } set RX trigger mode
      • :RXTrigger? get RX trigger selection

radio events

Radio events are reported into the Questionable Data Status Event Register, which is summarized in Bit 3 (QSB) of Status Byte Register.

enabling event and reading event

RA:MOD?
"LORa"
RA:OP?
"RXC"
STAT:QUES:ENAB 512
*STB?
8
STAT:QUES:EVEN?
512
RA:FI?
"4747474747474747"
*STB?
0

Bit 9 of QUEStionable event register indicates DIO0 event occurred upon radio packet reception.

NA Mote-72 specific commands

  • PD2 { OFF | ON } set power amplifier voltage state
  • PD2? get power amplifier voltage state
  • VBAT? read battery voltage
  • GPS
    • :EN { OFF | ON } enable GPS
    • :EN? get GPS enabled state
    • :NUMCoords {n} set count of coordinates received (use to clear count)
    • :NUMCoords? get count of coordinates received
    • :LOngitude {n} set longitude
    • :LOngitude? get longitude
    • :LAtitude {n} set latitude
    • :LAtitude? get latitude
  • MMA MMA8451Q
    • :ID? read ID register (WHO_AM_I == 0x1a)
  • MPL MPL3115A2
    • :ID? read ID register (WHO_AM_I == 0xc4)
  • SX9500
    • :RST reset SX9500
    • :REGister {addr}, {value} write SX9500 register
    • :REGister? {addr} read SX9500 register
Revision:
1:33d322ad66b1
Parent:
0:8767be3c1b7f
Child:
2:547cc73f8887
--- a/scpi-def.cpp	Wed Aug 12 22:20:33 2015 +0000
+++ b/scpi-def.cpp	Fri Aug 14 01:43:32 2015 +0000
@@ -91,6 +91,10 @@
     if (radio.RegOpMode.bits.LongRangeMode) {
         act = lora.service();
         switch (act) {
+            case SERVICE_READ_FIFO:
+                //printf("lora SERVICE_READ_FIFO\r\n");
+                SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200);    // bit 9 for packet received
+                break;
             case SERVICE_TX_DONE:
                 tx_busy = false;
                 break;
@@ -99,6 +103,12 @@
         /* FSK: */
         act = fsk.service();     
         switch (act) {
+            case SERVICE_READ_FIFO:
+                SCPI_RegSetBits(&scpi_context, SCPI_REG_QUES, 0x200);    // bit 9 for packet received
+                break;            
+            case SERVICE_TX_DONE:
+                tx_busy = false;
+                break;
         } // ...switch (act)           
     }
 }
@@ -198,6 +208,131 @@
     return SCPI_RES_OK;
 }
 
+scpi_result_t fsk_fdev(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    fsk.set_tx_fdev_hz(i);
+    return SCPI_RES_OK;
+}
+
+scpi_result_t fsk_fdevQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    SCPI_ResultInt(context, fsk.get_tx_fdev_hz());    
+    return SCPI_RES_OK;      
+}
+
+scpi_result_t fsk_rxbw(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR; 
+        
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    fsk.set_rx_dcc_bw_hz(i, 0);
+    return SCPI_RES_OK;
+}
+
+scpi_result_t fsk_rxbwQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+        
+    SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_RXBW));    
+    return SCPI_RES_OK;          
+}
+
+scpi_result_t fsk_afcbw(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR; 
+        
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    fsk.set_rx_dcc_bw_hz(i, 1);
+    return SCPI_RES_OK;
+}
+
+scpi_result_t fsk_afcbwQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+        
+    SCPI_ResultInt(context, fsk.get_rx_bw_hz(REG_FSK_AFCBW));    
+    return SCPI_RES_OK;          
+} 
+
+scpi_result_t fsk_bitrate(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+        
+    fsk.set_bitrate(i);
+    return SCPI_RES_OK;     
+}
+
+scpi_result_t fsk_bitrateQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+    
+    SCPI_ResultInt(context, fsk.get_bitrate());    
+    return SCPI_RES_OK;    
+}
+
+scpi_result_t fsk_prelen(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;
+        
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;     
+        
+    radio.write_u16(REG_FSK_PREAMBLEMSB, i); 
+    return SCPI_RES_OK;          
+}
+
+scpi_result_t fsk_prelenQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;     
+        
+    SCPI_ResultInt(context, radio.read_u16(REG_FSK_PREAMBLEMSB) );    
+    return SCPI_RES_OK;      
+} 
+
 scpi_result_t fsk_sync(scpi_t* context)
 {
     char buffer[100];
@@ -212,13 +347,11 @@
         
     buffer[0] = 0;
     SCPI_ParamCopyText(context, buffer, 100, &copy_len, false);
-
-    printf("TEXT: ***%s***\r\n", buffer);    
+   
     fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
     len = strlen(buffer);
     sync_size = 0;
     addr = REG_FSK_SYNCVALUE1;
-    printf("len:%d\r\n", len);
     for (i = 0; i < len; i+=2) {
         int o;
         sscanf(buffer+i, "%02x", &o);
@@ -244,7 +377,7 @@
         return SCPI_RES_ERR;
         
     fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
-    for (i = 0; i < fsk.RegSyncConfig.bits.SyncSize; i++) {
+    for (i = 0; i <= fsk.RegSyncConfig.bits.SyncSize; i++) {
         uint8_t o = radio.read_reg(i + REG_FSK_SYNCVALUE1);
         sprintf(ptr, "%02x", o);
         ptr += 2;
@@ -273,6 +406,48 @@
     return SCPI_RES_OK;
 }
 
+scpi_result_t radio_binFifo(scpi_t* context)
+{
+    size_t len;
+    const char* buf = (const char *)radio.tx_buf;
+             
+     /*scpi_bool_t SCPI_ParamArbitraryBlock(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory);*/
+     if (!SCPI_ParamArbitraryBlock(context, &buf, &len, TRUE))
+        return SCPI_RES_ERR; 
+
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode) {
+        lora.RegPayloadLength = len;
+        radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
+        lora.start_tx(lora.RegPayloadLength);        
+    } else {
+        fsk.start_tx(len);
+    }    
+    
+    tx_busy = true;
+    
+    return SCPI_RES_OK;            
+}
+
+scpi_result_t radio_binFifoQ(scpi_t* context)
+{
+    int len;
+    const char* buf = (const char *)radio.rx_buf;
+        
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (radio.RegOpMode.bits.LongRangeMode) {
+        len = lora.RegRxNbBytes;  
+    } else {
+        len = fsk.rx_buf_length;
+    }
+    
+    //size_t SCPI_ResultArbitraryBlock(scpi_t * context, const char * data, size_t len);
+    if (SCPI_ResultArbitraryBlock(context, buf, len) == len)
+        return SCPI_RES_OK;    
+    else
+        return SCPI_RES_ERR; 
+}
+
 scpi_result_t radio_fifoQ(scpi_t* context)
 {
     int i;
@@ -281,15 +456,15 @@
         
     radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
     if (radio.RegOpMode.bits.LongRangeMode) {
-        printf("rxnb:%d\r\n", lora.RegRxNbBytes);
         for (i = 0; i < lora.RegRxNbBytes; i++) {
             sprintf(ptr, "%02x", radio.rx_buf[i]);
-            printf("%p: %c %c\r\n", ptr, ptr[0], ptr[1]);
             ptr += 2;
         }        
     } else {
-        /* fsk todo */
-        return SCPI_RES_ERR;
+        for (i = 0; i < fsk.rx_buf_length; i++) {
+            sprintf(ptr, "%02x", radio.rx_buf[i]);
+            ptr += 2;
+        }   
     }
     
     SCPI_ResultText(context, txt);
@@ -319,7 +494,7 @@
         lora.start_tx(lora.RegPayloadLength);        
     } else {
         /* fsk todo */
-        return SCPI_RES_ERR;
+        fsk.start_tx(copy_len);
     }    
     
     tx_busy = true;
@@ -404,6 +579,71 @@
     return SCPI_RES_OK;         
 }
 
+scpi_result_t radio_bgr(scpi_t* context)
+{
+    RegPdsTrim1_t pds_trim;
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;  
+            
+    if (radio.type == SX1276) {
+        pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276);
+        pds_trim.bits.prog_txdac = i;
+        radio.write_reg(REG_PDSTRIM1_SX1276, pds_trim.octet);
+    } else if (radio.type == SX1272) { 
+        pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);       
+        pds_trim.bits.prog_txdac = i;
+        radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet);
+    } else
+        return SCPI_RES_ERR; 
+    
+    return SCPI_RES_OK;
+}
+
+scpi_result_t radio_bgrQ(scpi_t* context)
+{
+    RegPdsTrim1_t pds_trim;
+      
+    if (radio.type == SX1276)
+        pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276);    
+    else if (radio.type == SX1272)
+        pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
+    else
+        return SCPI_RES_ERR;
+        
+    SCPI_ResultInt(context, pds_trim.bits.prog_txdac);  
+    return SCPI_RES_OK;        
+}
+
+scpi_result_t radio_lnaBoost(scpi_t* context)
+{
+    scpi_bool_t param1;
+    
+    if (!SCPI_ParamBool(context, &param1, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegLna.octet = radio.read_reg(REG_LNA);  
+    if (param1)
+        radio.RegLna.bits.LnaBoostHF = 3;
+    else
+        radio.RegLna.bits.LnaBoostHF = 0;
+        
+    radio.write_reg(REG_LNA, radio.RegLna.octet);
+    return SCPI_RES_OK;
+}
+
+scpi_result_t radio_lnaBoostQ(scpi_t* context)
+{
+    radio.RegLna.octet = radio.read_reg(REG_LNA);
+    if (radio.RegLna.bits.LnaBoostHF)
+        SCPI_ResultBool(context, 1);
+    else
+        SCPI_ResultBool(context, 0);
+    
+    return SCPI_RES_OK;     
+}
+
 scpi_result_t radio_power(scpi_t* context)
 {
     int32_t i;
@@ -425,6 +665,64 @@
     return SCPI_RES_OK;
 }
 
+scpi_result_t radio_diomap(scpi_t* context)
+{
+    int32_t dioN, map_value;
+    
+    if (!SCPI_ParamInt(context, &dioN, TRUE))
+        return SCPI_RES_ERR;  
+        
+    if (!SCPI_ParamInt(context, &map_value, TRUE))
+        return SCPI_RES_ERR;    
+      
+    if (dioN < 4) {
+        radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
+        switch (dioN) {
+            case 0: radio.RegDioMapping1.bits.Dio0Mapping = map_value; break;
+            case 1: radio.RegDioMapping1.bits.Dio1Mapping = map_value; break;
+            case 2: radio.RegDioMapping1.bits.Dio2Mapping = map_value; break;
+            case 3: radio.RegDioMapping1.bits.Dio3Mapping = map_value; break;
+        } // ...switch (dioN)
+        radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
+    } else {
+        radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
+        switch (dioN) {
+            case 4: radio.RegDioMapping2.bits.Dio4Mapping = map_value; break;
+            case 5: radio.RegDioMapping2.bits.Dio5Mapping = map_value; break;
+        } // ...switch (dioN)        
+        radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
+    }
+    
+    return SCPI_RES_OK;
+}
+
+scpi_result_t radio_diomapQ(scpi_t* context)
+{
+    int32_t dioN, map_value = -1;
+    
+    if (!SCPI_ParamInt(context, &dioN, TRUE))
+        return SCPI_RES_ERR; 
+        
+    if (dioN < 4) {
+        radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
+        switch (dioN) {
+            case 0: map_value = radio.RegDioMapping1.bits.Dio0Mapping; break;
+            case 1: map_value = radio.RegDioMapping1.bits.Dio1Mapping; break;
+            case 2: map_value = radio.RegDioMapping1.bits.Dio2Mapping; break;
+            case 3: map_value = radio.RegDioMapping1.bits.Dio3Mapping; break;
+        } // ...switch (dioN)        
+    } else {
+        radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
+        switch (dioN) {
+            case 4: map_value = radio.RegDioMapping2.bits.Dio4Mapping; break;
+            case 5: map_value = radio.RegDioMapping2.bits.Dio5Mapping; break;
+        } // ...switch (dioN)          
+    }
+    
+    SCPI_ResultInt(context, map_value);
+    return SCPI_RES_OK;    
+}
+
 scpi_result_t radio_freq(scpi_t* context)
 {
     double MHz;
@@ -443,6 +741,102 @@
     return SCPI_RES_OK;
 }
 
+scpi_result_t lora_cr(scpi_t* context)
+{
+    int32_t i;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+        
+    lora.setCodingRate(i);
+    return SCPI_RES_OK;    
+}
+
+scpi_result_t lora_crQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+
+     SCPI_ResultInt(context, lora.getCodingRate(false));
+     return SCPI_RES_OK;   
+}  
+
+scpi_result_t lora_ih(scpi_t* context)
+{
+    scpi_bool_t param1;
+    
+    if (!SCPI_ParamBool(context, &param1, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;    
+
+    lora.setHeaderMode(param1);   
+    return SCPI_RES_OK;    
+}
+
+scpi_result_t lora_ihQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;     
+        
+    SCPI_ResultBool(context, lora.getHeaderMode());
+    return SCPI_RES_OK;
+}
+
+scpi_result_t lora_ldro(scpi_t* context)
+{
+    scpi_bool_t param1;
+    
+    if (!SCPI_ParamBool(context, &param1, TRUE))
+        return SCPI_RES_ERR;
+            
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR; 
+        
+    if (radio.type == SX1272) {
+        lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
+        lora.RegModemConfig.sx1272bits.LowDataRateOptimize = param1;
+        radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
+    } else if (radio.type == SX1276) {
+        lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
+        lora.RegModemConfig3.sx1276bits.LowDataRateOptimize = param1;
+        radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
+    } else
+        return SCPI_RES_ERR; 
+    
+    return SCPI_RES_OK;                
+}
+
+scpi_result_t lora_ldroQ(scpi_t* context)
+{
+    scpi_bool_t param1;
+    
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;   
+        
+    if (radio.type == SX1272) {
+        lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
+        param1 = lora.RegModemConfig.sx1272bits.LowDataRateOptimize;
+    } else if (radio.type == SX1276) {
+        lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
+        param1 = lora.RegModemConfig3.sx1276bits.LowDataRateOptimize;
+    } else
+        return SCPI_RES_ERR;         
+        
+    SCPI_ResultBool(context, param1);
+    return SCPI_RES_OK;    
+}
+
 scpi_result_t lora_bw(scpi_t* context)
 {
     double KHz;
@@ -519,6 +913,64 @@
      return SCPI_RES_OK; 
 }
 
+scpi_result_t lora_feiQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;     
+        
+    SCPI_ResultInt(context, lora.get_freq_error_Hz());    
+    return SCPI_RES_OK;                
+}
+
+scpi_result_t lora_pktsnrQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;     
+        
+    SCPI_ResultDouble(context, lora.RegPktSnrValue / 4.0);
+    return SCPI_RES_OK;                
+}
+
+scpi_result_t lora_pktrssiQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    SCPI_ResultDouble(context, lora.get_pkt_rssi());
+    return SCPI_RES_OK;
+}
+
+
+scpi_result_t lora_prelen(scpi_t* context)
+{
+    int32_t i;
+        
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+    
+    if (!SCPI_ParamInt(context, &i, TRUE))
+        return SCPI_RES_ERR;    
+        
+    lora.RegPreamble = i;
+    radio.write_u16(REG_LR_PREAMBLEMSB, lora.RegPreamble);  
+    return SCPI_RES_OK;       
+}
+
+scpi_result_t lora_prelenQ(scpi_t* context)
+{
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    if (!radio.RegOpMode.bits.LongRangeMode)
+        return SCPI_RES_ERR;
+        
+    lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
+    SCPI_ResultInt(context, lora.RegPreamble);    
+    return SCPI_RES_OK;      
+}
+
 scpi_result_t lora_txc(scpi_t* context)
 {
     scpi_bool_t param1;
@@ -554,9 +1006,9 @@
 scpi_result_t pd2_set(scpi_t* context)
 {
     scpi_bool_t param1;
-    if (!SCPI_ParamBool(context, &param1, TRUE)) {
+    
+    if (!SCPI_ParamBool(context, &param1, TRUE))
         return SCPI_RES_ERR;
-    }
 
     pd2 = param1;
     return SCPI_RES_OK;
@@ -616,6 +1068,8 @@
 
     {.pattern = "RAdio:FIfo", .callback = radio_fifo,},
     {.pattern = "RAdio:FIfo?", .callback = radio_fifoQ,},
+    {.pattern = "RAdio:BINFIfo", .callback = radio_binFifo,},
+    {.pattern = "RAdio:BINFIfo?", .callback = radio_binFifoQ,},
     {.pattern = "RAdio:MODulation", .callback = radio_modulation,},
     {.pattern = "RAdio:MODulation?", .callback = radio_modulationQ,},
     {.pattern = "RAdio:RSSI?", .callback = radio_rssiQ,},
@@ -627,11 +1081,28 @@
     {.pattern = "RAdio:OCP?", .callback = radio_ocpQ,},
     {.pattern = "RAdio:POWer", .callback = radio_power,},
     {.pattern = "RAdio:POWer?", .callback = radio_powerQ,},
+    {.pattern = "RAdio:BGR", .callback = radio_bgr,},
+    {.pattern = "RAdio:BGR?", .callback = radio_bgrQ,},
+    {.pattern = "RAdio:LNABoost", .callback = radio_lnaBoost,},
+    {.pattern = "RAdio:LNABoost?", .callback = radio_lnaBoostQ,},    
     {.pattern = "RAdio:FREQuency", .callback = radio_freq,},
     {.pattern = "RAdio:FREQuency?", .callback = radio_freqQ,},
+    {.pattern = "RAdio:DIOMap", .callback = radio_diomap,},
+    {.pattern = "RAdio:DIOMap?", .callback = radio_diomapQ,},
+    
        
     {.pattern = "RAdio:FSK:SYNC", .callback = fsk_sync,},
     {.pattern = "RAdio:FSK:SYNC?", .callback = fsk_syncQ,}, 
+    {.pattern = "RAdio:FSK:FDev", .callback = fsk_fdev,},
+    {.pattern = "RAdio:FSK:FDev?", .callback = fsk_fdevQ,}, 
+    {.pattern = "RAdio:FSK:BITRate", .callback = fsk_bitrate,},
+    {.pattern = "RAdio:FSK:BITRate?", .callback = fsk_bitrateQ,},     
+    {.pattern = "RAdio:FSK:PRELen", .callback = fsk_prelen,},
+    {.pattern = "RAdio:FSK:PRELen?", .callback = fsk_prelenQ,},  
+    {.pattern = "RAdio:FSK:RXBW", .callback = fsk_rxbw,},
+    {.pattern = "RAdio:FSK:RXBW?", .callback = fsk_rxbwQ,},        
+    {.pattern = "RAdio:FSK:AFCBW", .callback = fsk_afcbw,},
+    {.pattern = "RAdio:FSK:AFCBW?", .callback = fsk_afcbwQ,},    
     
     {.pattern = "RAdio:LORa:BW", .callback = lora_bw,},
     {.pattern = "RAdio:LORa:BW?", .callback = lora_bwQ,},    
@@ -639,6 +1110,17 @@
     {.pattern = "RAdio:LORa:SF?", .callback = lora_sfQ,},     
     {.pattern = "RAdio:LORa:TXContinuous", .callback = lora_txc,},
     {.pattern = "RAdio:LORa:TXContinuous?", .callback = lora_txcQ,},         
+    {.pattern = "RAdio:LORa:PRELen", .callback = lora_prelen,},
+    {.pattern = "RAdio:LORa:PRELen?", .callback = lora_prelenQ,},    
+    {.pattern = "RAdio:LORa:CR", .callback = lora_cr,},
+    {.pattern = "RAdio:LORa:CR?", .callback = lora_crQ,},      
+    {.pattern = "RAdio:LORa:LDRO", .callback = lora_ldro,},
+    {.pattern = "RAdio:LORa:LDRO?", .callback = lora_ldroQ,},
+    {.pattern = "RAdio:LORa:FEI?", .callback = lora_feiQ,},         
+    {.pattern = "RAdio:LORa:PKTSnr?", .callback = lora_pktsnrQ,},   
+    {.pattern = "RAdio:LORa:PKTRssi?", .callback = lora_pktrssiQ,},     
+    {.pattern = "RAdio:LORa:Ih", .callback = lora_ih,},
+    {.pattern = "RAdio:LORa:Ih?", .callback = lora_ihQ,},        
         
     //{.pattern = "SET9", .callback = wbr_set_bit9,},