diff --git a/app/app.c b/app/app.c index dd52d34..8000ba9 100644 --- a/app/app.c +++ b/app/app.c @@ -508,6 +508,9 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) const uint8_t orig_pga = 6; // -3dB #ifdef ENABLE_AM_FIX + + BK4819_SetAGC(gRxVfo->Modulation != MODULATION_AM || !gSetting_AM_fix); + if (gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix) { // AM RX mode if (reset_am_fix) AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency diff --git a/debugging.h b/debugging.h index 1017166..a3ee0f7 100644 --- a/debugging.h +++ b/debugging.h @@ -21,6 +21,13 @@ static inline void LogRegUart(uint16_t reg) } - +static inline void LogPrint() +{ + uint16_t rssi = BK4819_GetRSSI(); + uint16_t reg7e = BK4819_ReadRegister(0x7E); + char buf[32]; + sprintf(buf, "reg7E: %d %2d %6d %2d %d rssi: %d\n", (reg7e >> 15), (reg7e >> 12) & 0b111, (reg7e >> 5) & 0b1111111, (reg7e >> 2) & 0b111, (reg7e >> 0) & 0b11, rssi); + LogUart(buf); +} #endif \ No newline at end of file diff --git a/driver/bk4819.c b/driver/bk4819.c index 469b28d..df3a3da 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -55,8 +55,8 @@ void BK4819_Init(void) BK4819_WriteRegister(BK4819_REG_37, 0x1D0F); BK4819_WriteRegister(BK4819_REG_36, 0x0022); - BK4819_DisableAGC(); -// BK4819_EnableAGC(); + BK4819_InitAGC(); + BK4819_SetAGC(true); BK4819_WriteRegister(BK4819_REG_19, 0b0001000001000001); // <15> MIC AGC 1 = disable 0 = enable @@ -236,19 +236,46 @@ void BK4819_WriteU16(uint16_t Data) } } -void BK4819_DisableAGC() +void BK4819_SetAGC(bool enable) { - // REG_10 + uint16_t regVal = BK4819_ReadRegister(BK4819_REG_7E); + if(!(regVal & (1 << 15)) == enable) + return; + + BK4819_WriteRegister(BK4819_REG_7E, (regVal & ~(1 << 15) & ~(0b111 << 12)) + | (!enable << 15) // 0 AGC fix mode + | (3u << 12) // 3 AGC fix index + ); + + // if(enable) { + // BK4819_WriteRegister(BK4819_REG_7B, 0x8420); + // } + // else { + // BK4819_WriteRegister(BK4819_REG_7B, 0x318C); + + // BK4819_WriteRegister(BK4819_REG_7C, 0x595E); + // BK4819_WriteRegister(BK4819_REG_20, 0x8DEF); + + // for (uint8_t i = 0; i < 8; i++) { + // //BK4819_WriteRegister(BK4819_REG_06, ((i << 13) | 0x2500u) + 0x036u); + // BK4819_WriteRegister(BK4819_REG_06, (i & 7) << 13 | 0x4A << 7 | 0x36); + // } + // } +} + +void BK4819_InitAGC() +{ + // REG_10, REG_11, REG_12 REG_13, REG_14 // - // 0x0038 Rx AGC Gain Table[0]. (Index Max->Min is 3,2,1,0,-1) + // Rx AGC Gain Table[]. (Index Max->Min is 3,2,1,0,-1) // // <15:10> ??? // - // <9:8> LNA Gain Short - // 3 = 0dB <<< - // 2 = -24dB // was -11 - // 1 = -30dB // was -16 - // 0 = -33dB // was -19 + // <9:8> LNA Gain Short + // 3 = 0dB <<< 1o11 read from spectrum reference manual + // 2 = -24dB -19 -11 + // 1 = -30dB -24 -16 + // 0 = -33dB -28 -19 // // <7:5> LNA Gain // 7 = 0dB @@ -276,75 +303,18 @@ void BK4819_DisableAGC() // 1 = -27dB // 0 = -33dB // - BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (5u << 5) | (3u << 3) | (6u << 0)); // 000000 11 101 11 110 - BK4819_WriteRegister(BK4819_REG_12, 0x037B); // 000000 11 011 11 011 - BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011 - BK4819_WriteRegister(BK4819_REG_10, 0x007A); // 000000 00 011 11 010 - BK4819_WriteRegister(BK4819_REG_14, 0x0019); // 000000 00 000 11 001 - - BK4819_WriteRegister(BK4819_REG_49, 0x2A38); + BK4819_WriteRegister(BK4819_REG_13, 0x03BE); // 0x03BE / 000000 11 101 11 110 / -7dB + BK4819_WriteRegister(BK4819_REG_12, 0x037B); // 0x037B / 000000 11 011 11 011 / -24dB + BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 0x027B / 000000 10 011 11 011 / -43dB + BK4819_WriteRegister(BK4819_REG_10, 0x007A); // 0x007A / 000000 00 011 11 010 / -58dB + BK4819_WriteRegister(BK4819_REG_14, 0x0019); // 0x0019 / 000000 00 000 11 001 / -79dB + BK4819_WriteRegister(BK4819_REG_49, (0 << 14) | (84 << 7) | (56 << 0)); //0x2A38 / 00 1010100 0111000 / 84, 56 BK4819_WriteRegister(BK4819_REG_7B, 0x8420); + } -void BK4819_EnableAGC() -{ - // REG_10 - // - // 0x0038 Rx AGC Gain Table[0]. (Index Max->Min is 3,2,1,0,-1) - // - // (15:10> ??? - // - // <9:8> LNA Gain Short - // 3 = 0dB << original - // 2 = -24dB // was -11 - // 1 = -30dB // was -16 - // 0 = -33dB // was -19 - // - // <7:5> LNA Gain - // 7 = 0dB - // 6 = -2dB - // 5 = -4dB - // 4 = -6dB - // 3 = -9dB - // 2 = -14dB << original - // 1 = -19dB - // 0 = -24dB - // - // <4:3> MIXER Gain - // 3 = 0dB << original - // 2 = -3dB - // 1 = -6dB - // 0 = -8dB - // - // <2:0> PGA Gain - // 7 = 0dB - // 6 = -3dB << original - // 5 = -6dB - // 4 = -9dB - // 3 = -15dB - // 2 = -21dB - // 1 = -27dB - // 0 = -33dB - // - BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (5u << 5) | (3u << 3) | (6u << 0)); - BK4819_WriteRegister(BK4819_REG_12, 0x037C); // 000000 11 011 11 100 - BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011 - BK4819_WriteRegister(BK4819_REG_10, 0x007A); // 000000 00 011 11 010 - BK4819_WriteRegister(BK4819_REG_14, 0x0018); // 000000 00 000 11 000 - - BK4819_WriteRegister(BK4819_REG_49, 0x2A38); - BK4819_WriteRegister(BK4819_REG_7B, 0x318C); - - BK4819_WriteRegister(BK4819_REG_7C, 0x595E); - BK4819_WriteRegister(BK4819_REG_20, 0x8DEF); - - for (uint8_t i = 0; i < 8; i++) { - //BK4819_WriteRegister(BK4819_REG_06, ((i << 13) | 0x2500u) + 0x036u); - BK4819_WriteRegister(BK4819_REG_06, (i & 7) << 13 | 0x4A << 7 | 0x36); - } -} void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet) { @@ -828,16 +798,18 @@ void BK4819_RX_TurnOn(void) // Turn off everything BK4819_WriteRegister(BK4819_REG_30, 0); - // Enable VCO Calibration - // Enable RX Link - // Enable AF DAC - // Enable PLL/VCO - // Disable PA Gain - // Disable MIC ADC - // Disable TX DSP - // Enable RX DSP - // - BK4819_WriteRegister(BK4819_REG_30, 0b1011111111110001); // 1 0 1111 1 1 1111 0 0 0 1 + + BK4819_WriteRegister(BK4819_REG_30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_DISABLE_UNKNOWN | + BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_DISABLE_PA_GAIN | + BK4819_REG_30_DISABLE_MIC_ADC | + BK4819_REG_30_DISABLE_TX_DSP | + BK4819_REG_30_ENABLE_RX_DSP ); } void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency) @@ -1130,11 +1102,15 @@ void BK4819_ExitBypass(void) // 0 ~ 7 // 0 = bypass DC filter // - BK4819_WriteRegister(BK4819_REG_7E, // 0x302E); // 0 011 000000 101 110 - (0u << 15) | // 0 AGC fix mode - (3u << 12) | // 3 AGC fix index - (5u << 3) | // 5 DC Filter band width for Tx (MIC In) - (6u << 0)); // 6 DC Filter band width for Rx (I.F In) + + uint16_t regVal = BK4819_ReadRegister(BK4819_REG_7E); + + // 0x302E / 0 011 000000 101 110 + BK4819_WriteRegister(BK4819_REG_7E, (regVal & ~(0b111 << 3)) + + | (5u << 3) // 5 DC Filter band width for Tx (MIC In) + + ); } void BK4819_PrepareTransmit(void) diff --git a/driver/bk4819.h b/driver/bk4819.h index c5dcdb4..3248c17 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -72,8 +72,8 @@ void BK4819_SetRegValue(RegisterSpec s, uint16_t v); void BK4819_WriteU8(uint8_t Data); void BK4819_WriteU16(uint16_t Data); -void BK4819_EnableAGC(); -void BK4819_DisableAGC(); +void BK4819_SetAGC(bool enable); +void BK4819_InitAGC(); void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet);