diff --git a/src/HamShield.cpp b/src/HamShield.cpp index 2d7df0b..2de61bc 100644 --- a/src/HamShield.cpp +++ b/src/HamShield.cpp @@ -151,10 +151,19 @@ HamShield::HamShield(uint8_t cs_pin) { digitalWrite(DAT, HIGH); } + + /** Power on and prepare for general usage. * */ void HamShield::initialize() { + initialize(true); +} + +/** Power on and prepare for general usage. + * + */ +void HamShield::initialize(bool narrowBand) { // Note: these initial settings are for UHF 12.5kHz channel // see the A1846S register table and initial settings for more info @@ -183,7 +192,99 @@ void HamShield::initialize() { tx_data = 0x0AF2; // HSwriteWord(devAddr, 0x33, tx_data); // agc number - // AGC table + tx_data = 0x067F; //0x0601; //0x470F; + HSwriteWord(devAddr, 0x41, tx_data); // voice gain tx [6:0] + tx_data = 0x02FF; // using 0x04FF to avoid tx voice delay + HSwriteWord(devAddr, 0x44, tx_data); // tx gain [11:8] + tx_data = 0x7F2F; + HSwriteWord(devAddr, 0x47, tx_data); + tx_data = 0x2C62; + HSwriteWord(devAddr, 0x4F, tx_data); + tx_data = 0x0094; + HSwriteWord(devAddr, 0x53, tx_data); // compressor update time (bits 6:0, 5.12ms per unit) + tx_data = 0x2A18; + HSwriteWord(devAddr, 0x54, tx_data); + tx_data = 0x0081; + HSwriteWord(devAddr, 0x55, tx_data); + tx_data = 0x0B22; + HSwriteWord(devAddr, 0x56, tx_data); // sq detect time + tx_data = 0x1C00; + HSwriteWord(devAddr, 0x57, tx_data); + tx_data = 0x800D; + HSwriteWord(devAddr, 0x58, tx_data); + tx_data = 0x0EDD; + HSwriteWord(devAddr, 0x5A, tx_data); // sq and noise detect times + tx_data = 0x3FFF; + HSwriteWord(devAddr, 0x63, tx_data); // pre-emphasis bypass + + // calibration + tx_data = 0x00A4; + HSwriteWord(devAddr, 0x30, tx_data); + delay(100); + tx_data = 0x00A6; + HSwriteWord(devAddr, 0x30, tx_data); + delay(100); + tx_data = 0x0006; + HSwriteWord(devAddr, 0x30, tx_data); + delay(100); + + + // set band width + if (narrowBand) { + setupNarrowBand(); + } else { + setupWideBand(); + } + + delay(100); + + /* + // setup default values + frequency(446000); + //setVolume1(0xF); + //setVolume2(0xF); + setModeReceive(); + setTxSourceMic(); + setRfPower(0); + setSQLoThresh(80); + setSQOn(); + */ +} + + +/** Set up the AU1846 in Narrow Band mode (12.5kHz). + */ +void HamShield::setupNarrowBand() { + uint16_t tx_data; + // setup for 12.5kHz channel width + tx_data = 0x3D37; + HSwriteWord(devAddr, 0x11, tx_data); + tx_data = 0x0100; + HSwriteWord(devAddr, 0x12, tx_data); + tx_data = 0x1100; + HSwriteWord(devAddr, 0x15, tx_data); + tx_data = 0x4495; + HSwriteWord(devAddr, 0x32, tx_data); // agc target power [11:6] + tx_data = 0x2B8E; + HSwriteWord(devAddr, 0x34, tx_data); + tx_data = 0x40C3; + HSwriteWord(devAddr, 0x3A, tx_data); // modu_det_sel sq setting + tx_data = 0x0407; + HSwriteWord(devAddr, 0x3C, tx_data); // pk_det_th sq setting [8:7] + tx_data = 0x28D0; + HSwriteWord(devAddr, 0x3F, tx_data); // rssi3_th sq setting + tx_data = 0x203E; + HSwriteWord(devAddr, 0x48, tx_data); + tx_data = 0x1BB7; + HSwriteWord(devAddr, 0x60, tx_data); + tx_data = 0x0A10; // use 0x1425 if there's an LNA + HSwriteWord(devAddr, 0x62, tx_data); + tx_data = 0x2494; + HSwriteWord(devAddr, 0x65, tx_data); + tx_data = 0xEB2E; + HSwriteWord(devAddr, 0x66, tx_data); + + // AGC table tx_data = 0x0001; HSwriteWord(devAddr, 0x7F, tx_data); tx_data = 0x000C; @@ -224,84 +325,80 @@ void HamShield::initialize() { HSwriteWord(devAddr, 0x7F, tx_data); // end AGC table - tx_data = 0x067F; //0x0601; //0x470F; - HSwriteWord(devAddr, 0x41, tx_data); // voice gain tx [6:0] - tx_data = 0x02FF; // using 0x04FF to avoid tx voice delay - HSwriteWord(devAddr, 0x44, tx_data); // tx gain [11:8] - tx_data = 0x7F2F; - HSwriteWord(devAddr, 0x47, tx_data); - tx_data = 0x2C62; - HSwriteWord(devAddr, 0x4F, tx_data); - tx_data = 0x0094; - HSwriteWord(devAddr, 0x53, tx_data); // compressor update time (bits 6:0, 5.12ms per unit) - tx_data = 0x2A18; - HSwriteWord(devAddr, 0x54, tx_data); - tx_data = 0x0081; - HSwriteWord(devAddr, 0x55, tx_data); - tx_data = 0x0B22; - HSwriteWord(devAddr, 0x56, tx_data); // sq detect time - tx_data = 0x1C00; - HSwriteWord(devAddr, 0x57, tx_data); - tx_data = 0x800D; - HSwriteWord(devAddr, 0x58, tx_data); - tx_data = 0x0EDD; - HSwriteWord(devAddr, 0x5A, tx_data); // sq and noise detect times - tx_data = 0x3FFF; - HSwriteWord(devAddr, 0x63, tx_data); // pre-emphasis bypass - - // calibration - tx_data = 0x00A4; - HSwriteWord(devAddr, 0x30, tx_data); - delay(100); - tx_data = 0x00A6; - HSwriteWord(devAddr, 0x30, tx_data); - delay(100); - tx_data = 0x0006; - HSwriteWord(devAddr, 0x30, tx_data); - delay(100); +} - - // setup for 12.5kHz channel width +/** Set up the AU1846 in Wide Band mode (25kHz). + */ +void HamShield::setupWideBand() { + uint16_t tx_data; + // setup for 25kHz channel width tx_data = 0x3D37; HSwriteWord(devAddr, 0x11, tx_data); tx_data = 0x0100; HSwriteWord(devAddr, 0x12, tx_data); - tx_data = 0x1100; + tx_data = 0x1F00; HSwriteWord(devAddr, 0x15, tx_data); - tx_data = 0x4495; + tx_data = 0x7564; HSwriteWord(devAddr, 0x32, tx_data); // agc target power [11:6] tx_data = 0x2B8E; HSwriteWord(devAddr, 0x34, tx_data); - tx_data = 0x40C3; + tx_data = 0x44C3; HSwriteWord(devAddr, 0x3A, tx_data); // modu_det_sel sq setting - tx_data = 0x0407; + tx_data = 0x1930; HSwriteWord(devAddr, 0x3C, tx_data); // pk_det_th sq setting [8:7] - tx_data = 0x28D0; + tx_data = 0x29D2; HSwriteWord(devAddr, 0x3F, tx_data); // rssi3_th sq setting - tx_data = 0x203E; + tx_data = 0x21C0; HSwriteWord(devAddr, 0x48, tx_data); - tx_data = 0x1BB7; + tx_data = 0x101E; HSwriteWord(devAddr, 0x60, tx_data); - tx_data = 0x0A10; // use 0x1425 if there's an LNA + tx_data = 0x3767; // use 0x1425 if there's an LNA HSwriteWord(devAddr, 0x62, tx_data); - tx_data = 0x2494; + tx_data = 0x248A; HSwriteWord(devAddr, 0x65, tx_data); - tx_data = 0xEB2E; - HSwriteWord(devAddr, 0x66, tx_data); - - delay(100); - - /* - // setup default values - frequency(446000); - //setVolume1(0xF); - //setVolume2(0xF); - setModeReceive(); - setTxSourceMic(); - setRfPower(0); - setSQLoThresh(80); - setSQOn(); - */ + tx_data = 0xFFAE; + HSwriteWord(devAddr, 0x66, tx_data); + + // AGC table + tx_data = 0x0001; + HSwriteWord(devAddr, 0x7F, tx_data); + tx_data = 0x000C; + HSwriteWord(devAddr, 0x05, tx_data); + tx_data = 0x0024; + HSwriteWord(devAddr, 0x06, tx_data); + tx_data = 0x0214; + HSwriteWord(devAddr, 0x07, tx_data); + tx_data = 0x0224; + HSwriteWord(devAddr, 0x08, tx_data); + tx_data = 0x0314; + HSwriteWord(devAddr, 0x09, tx_data); + tx_data = 0x0324; + HSwriteWord(devAddr, 0x0A, tx_data); + tx_data = 0x0344; + HSwriteWord(devAddr, 0x0B, tx_data); + tx_data = 0x0384; + HSwriteWord(devAddr, 0x0C, tx_data); + tx_data = 0x1384; + HSwriteWord(devAddr, 0x0D, tx_data); + tx_data = 0x1B84; + HSwriteWord(devAddr, 0x0E, tx_data); + tx_data = 0x3F84; + HSwriteWord(devAddr, 0x0F, tx_data); + tx_data = 0xE0EB; + HSwriteWord(devAddr, 0x12, tx_data); + tx_data = 0xF2FE; + HSwriteWord(devAddr, 0x13, tx_data); + tx_data = 0x0A16; + HSwriteWord(devAddr, 0x14, tx_data); + tx_data = 0x2424; + HSwriteWord(devAddr, 0x15, tx_data); + tx_data = 0x2424; + HSwriteWord(devAddr, 0x16, tx_data); + tx_data = 0x2424; + HSwriteWord(devAddr, 0x17, tx_data); + tx_data = 0x0000; + HSwriteWord(devAddr, 0x7F, tx_data); + // end AGC table } /** Verify the I2C connection. diff --git a/src/HamShield.h b/src/HamShield.h index a0093bf..5a5f7a0 100644 --- a/src/HamShield.h +++ b/src/HamShield.h @@ -255,7 +255,10 @@ class HamShield { HamShield(); HamShield(uint8_t cs_pin); - void initialize(); + void initialize(); // defaults to 12.5kHz + void initialize(bool narrowBand); // select 12.5kHz if true or 25kHz if false + void setupWideBand(); + void setupNarrowBand(); bool testConnection(); // read control reg