Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: radio_sx126x.cpp
- Revision:
- 9:295e37c38fb3
- Parent:
- 8:f8918514ec50
- Child:
- 11:3a73edb3b246
--- a/radio_sx126x.cpp Wed Mar 04 19:33:21 2020 +0000 +++ b/radio_sx126x.cpp Mon May 04 17:54:55 2020 -0700 @@ -46,6 +46,7 @@ uint8_t Radio::bw_idx; uint8_t Radio::cadParams[7]; uint16_t Radio::ppg; +unsigned Radio::tcxoDelayTicks; const char* opModes[] = { "SLEEP ", // 0 @@ -168,6 +169,8 @@ cadParams[2] = radio.readReg(REG_ADDR_LORA_CAD_MINPEAK, 1); } + pa_config_buf[2] = chipType; /* auto-detect device from pin pull */ + radio.xfer(OPCODE_SET_PA_CONFIG, 4, 0, pa_config_buf); } void Radio::hw_reset() @@ -393,7 +396,7 @@ const char* Radio::tx_ramp_strs[] = { "10 ", // 0 "20 ", // 1 - "80 ", // 2 + "40 ", // 2 "80 ", // 3 "200 ", // 4 "800 ", // 5 @@ -579,14 +582,14 @@ antswPower = 0; } -void Radio::cadDone(bool det) +/*void Radio::cadDone(bool det) { log_printf("cadDone "); if (det) pc.printf("CadDetected"); pc.printf("\r\n"); -} +}*/ uint8_t ana_regs[128]; @@ -606,6 +609,8 @@ lpt.start(); radio.SetDIO2AsRfSwitchCtrl(1); + + tcxoDelayTicks = 3200; // some default timeout for tcxo } bool Radio::deviceSel_read() @@ -618,10 +623,11 @@ bool Radio::deviceSel_push() { - if (pa_config_buf[2]) +/* if (pa_config_buf[2]) pa_config_buf[2] = 0; else - pa_config_buf[2] = 1; + pa_config_buf[2] = 1;*/ + pa_config_buf[2] ^= 1; radio.xfer(OPCODE_SET_PA_CONFIG, 4, 0, pa_config_buf); @@ -740,6 +746,142 @@ const value_item_t Radio::xtb_item = { _ITEM_VALUE, 3, xtb_print, xtb_write}; +void Radio::ldo_push() +{ + uint8_t buf = 0; + radio.xfer(OPCODE_SET_REGULATOR_MODE, 1, 0, &buf); + log_printf("-> LDO\r\n"); +} + +const button_item_t Radio::ldo_item = { _ITEM_BUTTON, "LDO", ldo_push }; + +void Radio::dcdc_push() +{ + uint8_t buf = 1; + radio.xfer(OPCODE_SET_REGULATOR_MODE, 1, 0, &buf); + log_printf("-> DC-DC\r\n"); +} + +const button_item_t Radio::dcdc_item = { _ITEM_BUTTON, "DCDC", dcdc_push }; + +static const char* const rxfe_pms[] = { + "LP 0dB", + "HP1 2dB", + "HP2 4dB", + "HP3 6dB", + NULL +}; + +unsigned Radio::rxfe_pm_read(bool) +{ + AgcSensiAdj_t agcs; + agcs.octet = radio.readReg(REG_ADDR_AGC_SENSI_ADJ, 1); + return agcs.bits.power_mode; +} + +menuMode_e Radio::rxfe_pm_write(unsigned sidx) +{ + AgcSensiAdj_t agcs; + agcs.octet = radio.readReg(REG_ADDR_AGC_SENSI_ADJ, 1); + agcs.bits.power_mode = sidx; + radio.writeReg(REG_ADDR_AGC_SENSI_ADJ, agcs.octet, 1); + return MENUMODE_REDRAW; +} + +const dropdown_item_t Radio::rxfe_pm_item = { _ITEM_DROPDOWN, rxfe_pms, rxfe_pms, rxfe_pm_read, rxfe_pm_write}; + +#ifdef MEMSCAN +#define SHADOW_SIZE 0x9ff +uint8_t Radio::shadow_read[SHADOW_SIZE]; + +void Radio::memread_push() +{ + unsigned addr; + for (addr = 0; addr < SHADOW_SIZE; addr++) { + shadow_read[addr] = radio.readReg(addr, 1); + } + log_printf("memread\r\n"); +} + +const button_item_t Radio::memread_item = { _ITEM_BUTTON, "MRead", memread_push }; + +void Radio::memcmp_push() +{ + unsigned addr; + uint8_t r; + for (addr = 0; addr < SHADOW_SIZE; addr++) { + r = radio.readReg(addr, 1); + if (shadow_read[addr] != r) { + log_printf("%03x: %02x -> %02x\r\n", addr, shadow_read[addr], r); + } + } + log_printf("memcmpDone\r\n"); +} + +const button_item_t Radio::memcmp_item = { _ITEM_BUTTON, "MCmp", memcmp_push }; +#endif /* MEMSCAN */ + +void to_big_endian24(uint32_t in, uint8_t *out) +{ + out[2] = in & 0xff; + in >>= 8; + out[1] = in & 0xff; + in >>= 8; + out[0] = in & 0xff; +} + +void Radio::tcxo_volts_print(void) +{ + // yyy; +} + +bool Radio::tcxo_volts_write(const char *txt) +{ + uint8_t buf[4]; + float volts; + sscanf(txt, "%f", &volts); + if (volts > 3.15) + buf[0] = 7; // 3.3v + else if (volts > 2.85) + buf[0] = 6; // 3.0v + else if (volts > 2.55) + buf[0] = 5; // 2.7v + else if (volts > 2.3) + buf[0] = 4; // 2.4v + else if (volts > 2.3) + buf[0] = 3; // 2.2v + else if (volts > 2.0) + buf[0] = 2; // 1.8v + else if (volts > 1.65) + buf[0] = 1; // 1.7v + else + buf[0] = 0; // 1.6v + + to_big_endian24(tcxoDelayTicks, buf+1); + + radio.xfer(OPCODE_SET_DIO3_AS_TCXO_CTRL, 4, 0, buf); + log_printf("set txco %u, %u\r\n", buf[0], tcxoDelayTicks); + return false; +} + +const value_item_t Radio::tcxo_volts_item = { _ITEM_VALUE, 3, tcxo_volts_print, tcxo_volts_write}; + +void Radio::tcxo_delay_print(void) +{ + pc.printf("%u", tcxoDelayTicks / 64); +} + + +bool Radio::tcxo_delay_write(const char *txt) +{ + unsigned ms; + sscanf(txt, "%u", &ms); + tcxoDelayTicks = ms * 64; + return false; +} + +const value_item_t Radio::tcxo_delay_item = { _ITEM_VALUE, 5, tcxo_delay_print, tcxo_delay_write}; + const menu_t Radio::common_menu[] = { { {FIRST_CHIP_MENU_ROW, 1}, "deviceSel:", &deviceSel_item, FLAG_MSGTYPE_ALL, &tx_dbm_item }, { {FIRST_CHIP_MENU_ROW, 18}, "paDutyCycle:", &paDutyCycle_item, FLAG_MSGTYPE_ALL }, @@ -748,6 +890,16 @@ { {FIRST_CHIP_MENU_ROW, 55}, "XTA:", &xta_item, FLAG_MSGTYPE_ALL }, { {FIRST_CHIP_MENU_ROW, 62}, "XTB:", &xtb_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &ldo_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+1, 5}, NULL, &dcdc_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+1, 12}, "rxfe power:", &rxfe_pm_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+1, 35}, "tcxoVolts:", &tcxo_volts_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+1, 50}, "tcxoDelay(ms):", &tcxo_delay_item, FLAG_MSGTYPE_ALL }, +#ifdef MEMSCAN + { {LAST_CHIP_MENU_ROW, 1}, NULL, &memread_item, FLAG_MSGTYPE_ALL }, + { {LAST_CHIP_MENU_ROW, 10}, NULL, &memcmp_item, FLAG_MSGTYPE_ALL }, +#endif /* MEMSCAN */ + { {0, 0}, NULL, NULL } }; @@ -859,7 +1011,7 @@ void Radio::lora_pblLen_print() { - uint32_t val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2); + unsigned val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2); ppLORA.lora.PreambleLengthHi = val >> 8; ppLORA.lora.PreambleLengthLo = val; pc.printf("%u", val); @@ -1119,24 +1271,24 @@ const value_item_t Radio::lora_cadtimeout_item = { _ITEM_VALUE, 4, lora_cadtimeout_print, lora_cadtimeout_write}; const menu_t Radio::lora_menu[] = { - { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &lora_bw_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 12}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 20}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 30}, NULL, &lora_ppmOffset_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 1}, NULL, &lora_bw_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 12}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 20}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 30}, NULL, &lora_ppmOffset_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 1}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 22}, NULL, &lora_headerType_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 32}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &lora_inviq_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 49}, "ppg:", &lora_ppg_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 58}, NULL, &lora_sdmode_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 1}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 22}, NULL, &lora_headerType_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 32}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 39}, NULL, &lora_inviq_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 49}, "ppg:", &lora_ppg_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 58}, NULL, &lora_sdmode_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &lora_cad_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 5}, "symbols:", &lora_cadsymbs_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 20}, "peak/noise:", &lora_cadpnratio_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 35}, "min:", &lora_cadmin_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 45}, "exit:", &lora_cadexit_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 62}, "timeout us:", &lora_cadtimeout_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 1}, NULL, &lora_cad_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 5}, "symbols:", &lora_cadsymbs_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 20}, "peak/noise:", &lora_cadpnratio_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 35}, "min:", &lora_cadmin_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 45}, "exit:", &lora_cadexit_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 62}, "timeout us:", &lora_cadtimeout_item, FLAG_MSGTYPE_ALL }, { {0, 0}, NULL, NULL } }; @@ -1359,7 +1511,7 @@ swl_bits++; } while (swl_bits > 0) { - pc.printf("%02x", radio.readReg(addr++, 1)); + pc.printf("%02x", (unsigned)radio.readReg(addr++, 1)); swl_bits -= 8; } } @@ -1439,7 +1591,7 @@ void Radio::gfsk_nodeadrs_print() { - pc.printf("%02x", radio.readReg(REG_ADDR_NODEADDR, 1)); + pc.printf("%02x", (unsigned)radio.readReg(REG_ADDR_NODEADDR, 1)); } bool Radio::gfsk_nodeadrs_write(const char* txt) @@ -1455,7 +1607,7 @@ void Radio::gfsk_broadcast_print() { - pc.printf("%02x", radio.readReg(REG_ADDR_BROADCAST, 1)); + pc.printf("%02x", (unsigned)radio.readReg(REG_ADDR_BROADCAST, 1)); } bool Radio::gfsk_broadcast_write(const char* txt) @@ -1532,7 +1684,7 @@ void Radio::gfsk_crcinit_print() { - pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCINIT, 2)); + pc.printf("%04x", (unsigned)radio.readReg(REG_ADDR_FSK_CRCINIT, 2)); } bool Radio::gfsk_crcinit_write(const char* txt) @@ -1548,7 +1700,7 @@ void Radio::gfsk_crcpoly_print() { - pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCPOLY, 2)); + pc.printf("%04x", (unsigned)radio.readReg(REG_ADDR_FSK_CRCPOLY, 2)); } bool Radio::gfsk_crcpoly_write(const char* txt) @@ -1584,28 +1736,28 @@ const value_item_t Radio::gfsk_whiteInit_item = { _ITEM_VALUE, 5, gfsk_whiteInit_print, gfsk_whiteInit_write}; const menu_t Radio::gfsk_menu[] = { - { {FIRST_CHIP_MENU_ROW+1, 1}, "bps:", &gfsk_bitrate_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 15}, "bt:", &gfsk_bt_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 23}, "rxbw:", &gfsk_rxbw_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 39}, "fdev:", &gfsk_fdev_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+1, 53}, NULL, &gfsk_fixLen_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 1}, "bps:", &gfsk_bitrate_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 15}, "bt:", &gfsk_bt_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 23}, "rxbw:", &gfsk_rxbw_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 39}, "fdev:", &gfsk_fdev_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+2, 53}, NULL, &gfsk_fixLen_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 1}, "PreambleLength:", &gfsk_pblLen_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 21}, "PreambleDetectorLength:", &gfsk_pblDetLen_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+2, 51}, "SyncWordLength bits:", &gfsk_swl_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 1}, "PreambleLength:", &gfsk_pblLen_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 21}, "PreambleDetectorLength:", &gfsk_pblDetLen_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+3, 51}, "SyncWordLength bits:", &gfsk_swl_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+3, 1}, "SyncWord:", &gfsk_syncword_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+4, 1}, "SyncWord:", &gfsk_syncword_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+4, 1}, "AddrComp:", &gfsk_addrcomp_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+4, 33}, "NodeAdrs:", &gfsk_nodeadrs_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+4, 47}, "broadcast:", &gfsk_broadcast_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+5, 1}, "AddrComp:", &gfsk_addrcomp_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+5, 33}, "NodeAdrs:", &gfsk_nodeadrs_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+5, 47}, "broadcast:", &gfsk_broadcast_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+5, 1}, "crcType:", &gfsk_crctype_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+5, 21}, "crcInit:", &gfsk_crcinit_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+5, 34}, "crcPoly:", &gfsk_crcpoly_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+6, 1}, "crcType:", &gfsk_crctype_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+6, 21}, "crcInit:", &gfsk_crcinit_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+6, 34}, "crcPoly:", &gfsk_crcpoly_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+6, 1}, NULL, &gfsk_white_item, FLAG_MSGTYPE_ALL }, - { {FIRST_CHIP_MENU_ROW+6, 12}, "lfsr init:", &gfsk_whiteInit_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+7, 1}, NULL, &gfsk_white_item, FLAG_MSGTYPE_ALL }, + { {FIRST_CHIP_MENU_ROW+7, 12}, "lfsr init:", &gfsk_whiteInit_item, FLAG_MSGTYPE_ALL }, //12345678901234567890123456789012 { {0, 0}, NULL, NULL }