NAMote72 Utility Application – Serial Terminal Monitor control for NAMote72 (note: this application replaces the previous na_mote1 test code application)
Dependencies: SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 mbed
Fork of na_mote1 by
See wiki Page for a detailed
This is a link to the wiki page
Diff: main.cpp
- Revision:
- 15:cdc215392e60
- Parent:
- 14:35e7156e73ff
- Child:
- 17:f73dbeca8736
--- a/main.cpp Tue Sep 01 00:29:36 2015 +0000 +++ b/main.cpp Fri Oct 30 00:17:45 2015 +0000 @@ -25,6 +25,8 @@ #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1 #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2 +#define FSK_RSSI_OFFSET 5 +#define FSK_RSSI_SMOOTHING 2 /* * */ @@ -128,8 +130,7 @@ DigitalOut rfsw1(RFSW1); DigitalOut rfsw2(RFSW2); - - +DigitalIn dio2(RADIO_DIO_2); void rfsw_callback() { @@ -961,7 +962,7 @@ { RegPdsTrim1_t pds_trim; - pds_trim.octet = radio.read_reg(REG_PDSTRIM1); + pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272); printf(" txdac=%.1fuA", 2.5 + (pds_trim.bits.prog_txdac * 0.625)); radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); if (radio.RegPaConfig.bits.PaSelect) { @@ -1027,7 +1028,12 @@ for (i = 0; i < 8; i++) radio.tx_buf[8] += radio.tx_buf[i]; red_led = LED_ON; - lora.start_tx(lora.RegPayloadLength); + + if (radio.RegOpMode.bits.LongRangeMode) { + lora.start_tx(lora.RegPayloadLength); + } else { + fsk.start_tx(9); + } } @@ -1193,11 +1199,53 @@ } #endif /* LORA_WAN_ENABLE */ } + +int per_parse_rx(uint8_t len) +{ + if (len > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') { + int i; + float per; + + /* this is PER packet */ + uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4]; + PacketPerOkCnt++; + + if( PacketRxSequence <= PacketRxSequencePrev ) + { // Sequence went back => resynchronization + // dont count missed packets this time + i = 0; + } + else + { + // determine number of missed packets + i = PacketRxSequence - PacketRxSequencePrev - 1; + } + + red_led = !red_led.read(); + // be ready for the next + PacketRxSequencePrev = PacketRxSequence; + // increment 'missed' counter for the RX session + PacketPerKoCnt += i; + per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0; + printf("%d, ok=%d missed=%d normal=%d per:%.3f ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt, per); + if (radio.RegOpMode.bits.LongRangeMode) + printf("pkt:%ddBm, snr:%.1fdB, %ddBm\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0, lora.get_current_rssi()); + else { + wait_us(10000); + printf(" -%.1fdBm\r\n", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0); + } + + return 1; + } else { + return 0; + } +} void service_radio() { service_action_e act; + static uint8_t rssi = 0; if (radio.RegOpMode.bits.LongRangeMode) { @@ -1209,40 +1257,13 @@ if (app == APP_NONE) { if (per_en) { - if (lora.RegRxNbBytes > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') { - int i; - float per; - red_led = LED_OFF; - /* this is PER packet */ - uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4]; - PacketPerOkCnt++; - //IntervalPerOkCnt++; - - if( PacketRxSequence <= PacketRxSequencePrev ) - { // Sequence went back => resynchronization - // dont count missed packets this time - i = 0; - } - else - { - // determine number of missed packets - i = PacketRxSequence - PacketRxSequencePrev - 1; - } - - // be ready for the next - PacketRxSequencePrev = PacketRxSequence; - // increment 'missed' counter for the RX session - PacketPerKoCnt += i; - //IntervalPerKoCnt += i; - printf("%d, ok=%d missed=%d normal=%d ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt); - per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0; - printf("per:%f\r\n", per); - } else { + if (!per_parse_rx(lora.RegRxNbBytes)) { PacketNormalCnt++; - print_rx_verbose(lora.RegRxNbBytes); + print_rx_verbose(lora.RegRxNbBytes); } - } else + } else print_rx_verbose(lora.RegRxNbBytes); + fflush(stdout); } else if (app == APP_CHAT) { if (lora.RegHopChannel.bits.RxPayloadCrcOn) { if (lora.RegIrqFlags.bits.PayloadCrcError) @@ -1289,21 +1310,40 @@ radio.rx_buf[n] = 0; // null terminate printf((char *)radio.rx_buf); } else { - int i; if (fsk.RegRxConfig.bits.AfcAutoOn) - printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue)); - printf("%d: ", fsk.rx_buf_length); - for (i = 0; i < fsk.rx_buf_length; i++) - printf("%02x ", radio.rx_buf[i]); - printf("\r\n"); + printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue)); + if (rssi != 0) { + printf("pkt:-%.1fdBm ", rssi / 2.0); + rssi = 0; + } + if (per_en) { + if (!per_parse_rx(fsk.rx_buf_length)) { + PacketNormalCnt++; + print_rx_buf(fsk.rx_buf_length); + } + } else { + print_rx_buf(fsk.rx_buf_length); + } + fflush(stdout); } break; case SERVICE_TX_DONE: if (app == APP_CHAT) { fsk.start_rx(); + } else if (per_en) { + per_timeout.attach(&per_cb, per_tx_delay); // start next TX } break; } // ...switch (act) + + /* fsk sync address */ + if (dio2 && radio.RegDioMapping1.bits.Dio2Mapping == 3) { + // syncAdrs when in RX mode + if (rssi == 0) { + rssi = radio.read_reg(REG_FSK_RSSIVALUE); + } + } + } if (clear_valid_header) { @@ -1538,6 +1578,13 @@ } else printf("(fsk)\r\n"); break; + case 'c': + if (!radio.RegOpMode.bits.LongRangeMode) { + printf("%dbps fdev:%dhz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz()); + printf("rxbw:%dHz ", fsk.get_rx_bw_hz(REG_FSK_RXBW)); + printf("afcbw:%dHz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB)); + } + break; case 'C': if (radio.RegOpMode.bits.LongRangeMode) { lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn()); @@ -1666,6 +1713,7 @@ } else { printf("bw[a][%%d] FSK get-set rxbw (bwa=afcbw)\r\n"); printf("br[%%d] FSK get-set bitrate\r\n"); + printf("c[%%d] FSK set test case\r\n"); printf("fdev[%%d] FSK get-set TX frequency deviation (hz)\r\n"); printf("rt FSK change RxTrigger\r\n"); printf("pd FSK enable/disable preamble detector\r\n"); @@ -1697,12 +1745,12 @@ } // ...switch (pcbuf[0]) } else { if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX - if (radio.RegOpMode.bits.LongRangeMode) { - if (per_en) { - printf("timeout attach %f\r\n", per_tx_delay); - PacketTxCnt = 0; - per_timeout.attach(&per_cb, per_tx_delay); - } else { + if (per_en) { + printf("timeout attach %f\r\n", per_tx_delay); + PacketTxCnt = 0; + per_timeout.attach(&per_cb, per_tx_delay); + } else { + if (radio.RegOpMode.bits.LongRangeMode) { if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { sscanf(pcbuf+2, "%d", &i); lora.RegPayloadLength = i; @@ -1717,20 +1765,20 @@ rx_after_tx = true; else rx_after_tx = false; - } - } else { // FSK: - if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { - sscanf(pcbuf+2, "%d", &i); - fsk_tx_length = i; - } - if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting - tx_cnt++; - for (i = 0; i < fsk_tx_length; i++) { - radio.tx_buf[i] = tx_cnt; + } else { // FSK: + if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { + sscanf(pcbuf+2, "%d", &i); + fsk_tx_length = i; } - fsk.start_tx(fsk_tx_length); - } - } + if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting + tx_cnt++; + for (i = 0; i < fsk_tx_length; i++) { + radio.tx_buf[i] = tx_cnt; + } + fsk.start_tx(fsk_tx_length); + } + } // ...fsk + } // ..!per_en #ifdef FCC_TEST if (hop_type != HOP_TYPE_NONE) hop_timeout.attach(&hop_cb, 0.4); @@ -1841,8 +1889,16 @@ if (radio.RegOpMode.bits.LongRangeMode) { last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR); lora.start_rx(); - } else + } else { fsk.start_rx(); + radio.RegDioMapping1.bits.Dio2Mapping = 3; // dio2 to syncadrs + radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); + + fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG); + fsk.RegRssiConfig.bits.RssiOffset = FSK_RSSI_OFFSET; + fsk.RegRssiConfig.bits.RssiSmoothing = FSK_RSSI_SMOOTHING; + radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet); + } } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register sscanf(pcbuf+2, "%x", &i); printf("%02x: %02x\r\n", i, radio.read_reg(i)); @@ -2056,6 +2112,85 @@ } radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower); + } else if (pcbuf[0] == 'c' && (pcbuf[1] >= '0' && pcbuf[1] <= '9') && !radio.RegOpMode.bits.LongRangeMode) { + radio.set_opmode(RF_OPMODE_STANDBY); + per_tx_delay = 0.3; + + fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH); + fsk.RegFifoThreshold.bits.TxStartCondition = 1; // to nFifoEmpty + radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet); + + if (radio.read_reg(REG_FSK_SYNCVALUE1) == 0x55 && radio.read_reg(REG_FSK_SYNCVALUE2)) { + fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); + fsk.RegSyncConfig.bits.SyncSize = 2; + radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); + radio.write_reg(REG_FSK_SYNCVALUE3, 0x90); + radio.write_reg(REG_FSK_SYNCVALUE2, 0x4e); + radio.write_reg(REG_FSK_SYNCVALUE1, 0x63); + } + + fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT); + fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1; + radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet); + + fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); + fsk.RegRxConfig.bits.AfcAutoOn = 1; + fsk.RegRxConfig.bits.AgcAutoOn = 1; + fsk.RegRxConfig.bits.RxTrigger = 7; + radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); + + fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1; + fsk.RegPreambleDetect.bits.PreambleDetectorSize = 1; + fsk.RegPreambleDetect.bits.PreambleDetectorTol = 10; + radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet); + + switch (pcbuf[1]) { + case '0': + fsk.set_bitrate(4800); + fsk.set_tx_fdev_hz(5005); + fsk.set_rx_dcc_bw_hz(10417, 0); // rxbw + fsk.set_rx_dcc_bw_hz(50000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 8); + break; + case '1': + fsk.set_bitrate(50000); + fsk.set_tx_fdev_hz(25000); + fsk.set_rx_dcc_bw_hz(62500, 0); // rxbw + fsk.set_rx_dcc_bw_hz(100000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 9); + break; + case '2': + fsk.set_bitrate(38400); + fsk.set_tx_fdev_hz(20020); + fsk.set_rx_dcc_bw_hz(50000, 0); // rxbw + fsk.set_rx_dcc_bw_hz(100000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 8); + break; + case '3': + fsk.set_bitrate(1201); + fsk.set_tx_fdev_hz(20020); + fsk.set_rx_dcc_bw_hz(25000, 0); // rxbw + fsk.set_rx_dcc_bw_hz(50000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 8); + break; + case '4': + fsk.set_bitrate(1201); + fsk.set_tx_fdev_hz(4028); + fsk.set_rx_dcc_bw_hz(7813, 0); // rxbw + fsk.set_rx_dcc_bw_hz(25000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 8); + break; + case '5': + fsk.set_bitrate(1201); + fsk.set_tx_fdev_hz(4028); + fsk.set_rx_dcc_bw_hz(5208, 0); // rxbw + fsk.set_rx_dcc_bw_hz(10417, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 8); + break; + } // ...switch (pcbuf[1]) + printf("%dbps fdev:%dhz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz()); + printf("rxbw:%dHz ", fsk.get_rx_bw_hz(REG_FSK_RXBW)); + printf("afcbw:%dHz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB)); } else if (pcbuf[0] == 'o' && pcbuf[1] == 'c' && pcbuf[2] == 'p') { if (pcbuf[3] >= '0' && pcbuf[3] <= '9') { sscanf(pcbuf+3, "%d", &i); @@ -2116,12 +2251,12 @@ printf("%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB))); } else if (pcbuf[0] == 'b' && pcbuf[1] == 'g' && pcbuf[2] == 'r') { RegPdsTrim1_t pds_trim; - pds_trim.octet = radio.read_reg(REG_PDSTRIM1); + pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272); if (pcbuf[3] >= '0' && pcbuf[3] <= '9') { sscanf(&pcbuf[3], "%d", &i); pds_trim.bits.prog_txdac = i; } - radio.write_reg(REG_PDSTRIM1, pds_trim.octet); + radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet); printf("prog_txdac:%.1fuA\r\n", 2.5 + (pds_trim.bits.prog_txdac * 0.625)); /* increase OCP threshold to allow more power */ radio.RegOcp.octet = radio.read_reg(REG_OCP); @@ -2523,13 +2658,13 @@ mpl3115a2.SetModeStandby(); GPIOA->MODER |= 0x01415500; // unused pins as outputs: PA4, PA5, PA6, PA7, PA8, (PA11,PA12 USB) - printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER); + //printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER); GPIOB->MODER |= 0x00000401; // unused pins as outputs: PB0(HDR_DIO1), PB5 (PB10 pulled hi by LED), PB3-T_SWO - printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER); + //printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER); GPIOC->MODER |= 0x00000045; // unused pins as outputs: PC0(hdr_fem_csd) PC1(hdr_fem_ctx) PC3(SPI3_enable) - printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER); + //printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER); /*wait(0.1); all_peripherals_off();