0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-06-19 14:48:03 +03:00

FREQ/CTCSS/CDCSS search updates

This commit is contained in:
OneOfEleven
2023-10-30 11:23:56 +00:00
parent a188f846f5
commit c03ac606f1
19 changed files with 404 additions and 353 deletions

View File

@ -19,18 +19,9 @@
#include "driver/gpio.h"
#include "driver/i2c.h"
#include "driver/system.h"
#include "frequencies.h"
#include "misc.h"
#if defined(ENABLE_FMRADIO_64_76)
#define BAND 3u
#elif defined(ENABLE_FMRADIO_76_90)
#define BAND 2u
#elif defined(ENABLE_FMRADIO_76_108)
#define BAND 1u
#elif defined(ENABLE_FMRADIO_875_108)
#define BAND 0u
#endif
//#define CHAN_SPACING 0u // 200kHz
#define CHAN_SPACING 1u // 100kHz
//#define CHAN_SPACING 2u // 50kHz
@ -39,6 +30,36 @@
#define SEEK_THRESHOLD 10u
#if defined(ENABLE_FMRADIO_64_108)
const freq_band_table_t FM_RADIO_FREQ_BAND_TABLE[] =
{
{875, 1080},
{760, 1080},
{760, 900},
{640, 760}
};
#elif defined(ENABLE_FMRADIO_875_108)
const freq_band_table_t FM_RADIO_FREQ_BAND_TABLE[] =
{
{875, 1080}
};
#elif defined(ENABLE_FMRADIO_76_108)
const freq_band_table_t FM_RADIO_FREQ_BAND_TABLE[] =
{
{760, 1080}
};
#elif defined(ENABLE_FMRADIO_76_90)
const freq_band_table_t FM_RADIO_FREQ_BAND_TABLE[] =
{
{760, 900}
};
#elif defined(ENABLE_FMRADIO_64_76)
const freq_band_table_t FM_RADIO_FREQ_BAND_TABLE[] =
{
{640, 760}
};
#endif
static const uint16_t BK1080_RegisterTable[] =
{
0x0008, // 0x00
@ -46,7 +67,7 @@ static const uint16_t BK1080_RegisterTable[] =
(1u << 9) | (1u << 0), // 0x02 0x0201 0000001000000001
0x0000, // 0x03
0x40C0, // 0x04 0100000011000000
(SEEK_THRESHOLD << 8) | (BAND << 6) | (CHAN_SPACING << 4) | (VOLUME << 0), // 0x0A1F, // 0x05 00001010 00 01 1111
(SEEK_THRESHOLD << 8) | (0u << 6) | (CHAN_SPACING << 4) | (VOLUME << 0), // 0x0A1F, // 0x05 00001010 00 01 1111
0x002E, // 0x06 0000000000101110
0x02FF, // 0x07 0000001011111111
0x5B11, // 0x08 0101101100010001
@ -78,6 +99,8 @@ static const uint16_t BK1080_RegisterTable[] =
};
bool is_init;
uint16_t BK1080_freq_lower;
uint16_t BK1080_freq_upper;
uint16_t BK1080_BaseFrequency;
uint16_t BK1080_FrequencyDeviation;
@ -85,6 +108,24 @@ void BK1080_Init(uint16_t Frequency, bool bDoScan)
{
unsigned int i;
BK1080_freq_lower = 0xffff;
BK1080_freq_upper = 0;
for (i = 0; i < ARRAY_SIZE(FM_RADIO_FREQ_BAND_TABLE); i++)
{
const unsigned int lower = FM_RADIO_FREQ_BAND_TABLE[i].lower;
const unsigned int upper = FM_RADIO_FREQ_BAND_TABLE[i].upper;
if (BK1080_freq_lower > lower)
BK1080_freq_lower = lower;
if (BK1080_freq_lower > upper)
BK1080_freq_lower = upper;
if (BK1080_freq_upper < lower)
BK1080_freq_upper = lower;
if (BK1080_freq_upper < upper)
BK1080_freq_upper = upper;
}
if (bDoScan)
{
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BK1080);
@ -108,9 +149,6 @@ void BK1080_Init(uint16_t Frequency, bool bDoScan)
BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, (1u << 9) | (1u << 0));
}
// BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, 0x0A5F);
BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, (SEEK_THRESHOLD << 8) | (BAND << 6) | (CHAN_SPACING << 4) | (VOLUME << 0));
BK1080_SetFrequency(Frequency);
}
else
@ -128,7 +166,6 @@ uint16_t BK1080_ReadRegister(BK1080_Register_t Register)
I2C_Write((Register << 1) | I2C_READ);
I2C_ReadBuffer(Value, sizeof(Value));
I2C_Stop();
return (Value[0] << 8) | Value[1];
}
@ -153,27 +190,22 @@ void BK1080_Mute(bool Mute)
void BK1080_SetFrequency(uint16_t Frequency)
{
#if defined(ENABLE_FMRADIO_64_76)
uint16_t band;
uint16_t channel;
const uint16_t channel = Frequency - 640; // 100kHz channel spacing
// determine which band to use
for (band = 0; band < ARRAY_SIZE(FM_RADIO_FREQ_BAND_TABLE); band++)
if (Frequency >= FM_RADIO_FREQ_BAND_TABLE[band].lower && Frequency < FM_RADIO_FREQ_BAND_TABLE[band].upper)
break;
#elif defined(ENABLE_FMRADIO_76_90)
if (band >= ARRAY_SIZE(FM_RADIO_FREQ_BAND_TABLE))
return;
channel = Frequency - FM_RADIO_FREQ_BAND_TABLE[band].lower; // 100kHz channel spacing
const uint16_t channel = Frequency - 760; // 100kHz channel spacing
#elif defined(ENABLE_FMRADIO_76_108)
const uint16_t channel = Frequency - 760; // 100kHz channel spacing
#elif defined(ENABLE_FMRADIO_875_108)
// const uint16_t channel = Frequency - 760;
const uint16_t channel = Frequency - 875; // 100kHz channel spacing
#endif
BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, (SEEK_THRESHOLD << 8) | (band << 6) | (CHAN_SPACING << 4) | (VOLUME << 0));
BK1080_WriteRegister(BK1080_REG_03_CHANNEL, channel);
// SYSTEM_DelayMs(10);
BK1080_WriteRegister(BK1080_REG_03_CHANNEL, channel | (1u << 15));
}

View File

@ -22,6 +22,8 @@
#include "driver/bk1080-regs.h"
extern uint16_t BK1080_freq_lower;
extern uint16_t BK1080_freq_upper;
extern uint16_t BK1080_BaseFrequency;
extern uint16_t BK1080_FrequencyDeviation;

View File

@ -94,6 +94,8 @@ void BK4819_Init(void)
(58u << 4) | // AF Rx Gain-2
( 8u << 0)); // AF DAC Gain (after Gain-1 and Gain-2)
BK4819_sub_audible();
#if 1
const uint8_t dtmf_coeffs[] = {111, 107, 103, 98, 80, 71, 58, 44, 65, 55, 37, 23, 228, 203, 181, 159};
for (unsigned int i = 0; i < ARRAY_SIZE(dtmf_coeffs); i++)
@ -1258,18 +1260,19 @@ void BK4819_PrepareTransmit(void)
{
// BK4819_ExitBypass();
BK4819_ExitTxMute();
BK4819_TxOn_Beep();
BK4819_sub_audible();
}
void BK4819_TxOn_Beep(void)
void BK4819_sub_audible(void)
{
BK4819_WriteRegister(0x37, 0x1D0F); // 0001110100001111
#ifdef ENABLE_CTCSS_TAIL_PHASE_SHIFT
BK4819_WriteRegister(0x52, (1u << 15) | (2u << 13) | (0u << 12) | (10u << 6) | (15u << 0));
#else
BK4819_WriteRegister(0x52, (0u << 15) | (0u << 13) | (0u << 12) | (10u << 6) | (15u << 0)); // 0x028F); // 0 00 0 001010 001111
#endif
#ifdef ENABLE_CTCSS_TAIL_PHASE_SHIFT
BK4819_GenTail(2); // 180 deg
#else
// BK4819_GenTail(4);
BK4819_WriteRegister(0x52, (0u << 15) | (0u << 13) | (0u << 12) | (10u << 6) | (15u << 0)); // 0x028F); // 0 00 0 001010 001111
#endif
BK4819_WriteRegister(0x30, 0);
BK4819_WriteRegister(0x30,
@ -1505,11 +1508,11 @@ void BK4819_TransmitTone(bool bLocalLoopback, uint32_t Frequency)
BK4819_ExitTxMute();
}
void BK4819_GenTail(uint8_t Tail)
void BK4819_GenTail(const unsigned int tail)
{
// REG_52
//
// <15> 0 Enable 120/180/240 degree shift CTCSS or 134.4Hz Tail when CDCSS mode
// <15> 0 120/180/240 degree shift CTCSS or 134.4Hz Tail when CDCSS mode
// 0 = Normal
// 1 = Enable
//
@ -1519,49 +1522,49 @@ void BK4819_GenTail(uint8_t Tail)
// 10 = CTCSS0 180° phase shift
// 11 = CTCSS0 240° phase shift
//
// <12> 0 CTCSSDetectionThreshold Mode
// <12> 0 CTCSS Detection Threshold Mode
// 1 = ~0.1%
// 0 = 0.1 Hz
//
// <11:6> 0x0A CTCSS found detect threshold
// <11:6> 10 CTCSS found detect threshold 0 ~ 63
//
// <5:0> 0x0F CTCSS lost detect threshold
// <5:0> 15 CTCSS lost detect threshold 0 ~ 63
// REG_07 <15:0>
//
// When <13> = 0 for CTC1
// <12:0> = CTC1 frequency control word =
// freq(Hz) * 20.64888 for XTAL 13M/26M or
// freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M
//
// When <13> = 1 for CTC2 (Tail 55Hz Rx detection)
// <12:0> = CTC2 (should below 100Hz) frequency control word =
// 25391 / freq(Hz) for XTAL 13M/26M or
// 25000 / freq(Hz) for XTAL 12.8M/19.2M/25.6M/38.4M
//
// When <13> = 2 for CDCSS 134.4Hz
// <12:0> = CDCSS baud rate frequency (134.4Hz) control word =
// freq(Hz) * 20.64888 for XTAL 13M/26M or
// freq(Hz)*20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M
switch (Tail)
uint16_t tail_phase_shift = 1;
uint16_t ctcss_tail_mode_selection = 0;
uint16_t ctcss_detect_threshold_mode = 0;
// uint16_t ctcss_found_threshold = 10;
// uint16_t ctcss_lost_threshold = 15;
uint16_t ctcss_found_threshold = 20;
uint16_t ctcss_lost_threshold = 30;
switch (tail)
{
case 0: // 134.4Hz CTCSS Tail
BK4819_WriteRegister(0x52, 0x828F); // 1 00 0 001010 001111
break;
case 1: // 120° phase shift
BK4819_WriteRegister(0x52, 0xA28F); // 1 01 0 001010 001111
ctcss_tail_mode_selection = 1;
break;
case 2: // 180° phase shift
BK4819_WriteRegister(0x52, 0xC28F); // 1 10 0 001010 001111
ctcss_tail_mode_selection = 2;
break;
case 3: // 240° phase shift
BK4819_WriteRegister(0x52, 0xE28F); // 1 11 0 001010 001111
ctcss_tail_mode_selection = 3;
break;
default:
case 4: // 55Hz tone freq
BK4819_WriteRegister(0x07, 0x046f); // 0 00 0 010001 101111
tail_phase_shift = 0;
ctcss_found_threshold = 17;
ctcss_lost_threshold = 47;
break;
}
BK4819_WriteRegister(0x52,
(tail_phase_shift << 15) |
(ctcss_tail_mode_selection << 13) |
(ctcss_detect_threshold_mode << 12) |
(ctcss_found_threshold << 6) |
(ctcss_lost_threshold << 0));
}
void BK4819_EnableCDCSS(void)

View File

@ -119,7 +119,7 @@ void BK4819_TurnsOffTones_TurnsOnRX(void);
void BK4819_reset_fsk(void);
void BK4819_Idle(void);
void BK4819_PrepareTransmit(void);
void BK4819_TxOn_Beep(void);
void BK4819_sub_audible(void);
void BK4819_ExitSubAu(void);
void BK4819_Conditional_RX_TurnOn(void);
@ -133,7 +133,7 @@ void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t F
void BK4819_TransmitTone(bool bLocalLoopback, uint32_t Frequency);
void BK4819_GenTail(uint8_t Tail);
void BK4819_GenTail(const unsigned int tail);
void BK4819_EnableCDCSS(void);
void BK4819_EnableCTCSS(void);