mirror of
https://github.com/ttrftech/NanoVNA.git
synced 2025-12-06 03:31:59 +01:00
chore: update codec control
This commit is contained in:
parent
7adba06333
commit
0124e1b32d
9
main.c
9
main.c
|
|
@ -661,7 +661,7 @@ bool sweep(bool break_on_operation)
|
||||||
|
|
||||||
for (i = 0; i < sweep_points; i++) {
|
for (i = 0; i < sweep_points; i++) {
|
||||||
int delay = set_frequency(frequencies[i]);
|
int delay = set_frequency(frequencies[i]);
|
||||||
tlv320aic3204_select_in3(); // CH0:REFLECT
|
tlv320aic3204_select(0); // CH0:REFLECT
|
||||||
wait_dsp(delay);
|
wait_dsp(delay);
|
||||||
|
|
||||||
// blink LED while scanning
|
// blink LED while scanning
|
||||||
|
|
@ -670,7 +670,7 @@ bool sweep(bool break_on_operation)
|
||||||
/* calculate reflection coeficient */
|
/* calculate reflection coeficient */
|
||||||
(*sample_func)(measured[0][i]);
|
(*sample_func)(measured[0][i]);
|
||||||
|
|
||||||
tlv320aic3204_select_in1(); // CH1:TRANSMISSION
|
tlv320aic3204_select(1); // CH1:TRANSMISSION
|
||||||
wait_dsp(delay + DELAY_CHANNEL_CHANGE);
|
wait_dsp(delay + DELAY_CHANNEL_CHANGE);
|
||||||
|
|
||||||
/* calculate transmission coeficient */
|
/* calculate transmission coeficient */
|
||||||
|
|
@ -1904,10 +1904,7 @@ static void cmd_port(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
port = atoi(argv[0]);
|
port = atoi(argv[0]);
|
||||||
if (port)
|
tlv320aic3204_select(port);
|
||||||
tlv320aic3204_select_in1();
|
|
||||||
else
|
|
||||||
tlv320aic3204_select_in3(); // default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_stat(BaseSequentialStream *chp, int argc, char *argv[])
|
static void cmd_stat(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
|
|
|
||||||
15
nanovna.h
15
nanovna.h
|
|
@ -115,23 +115,10 @@ int si5351_set_frequency_with_offset(uint32_t freq, int offset, uint8_t drive_st
|
||||||
/*
|
/*
|
||||||
* tlv320aic3204.c
|
* tlv320aic3204.c
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
|
||||||
int target_level;
|
|
||||||
int gain_hysteresis;
|
|
||||||
int attack;
|
|
||||||
int attack_scale;
|
|
||||||
int decay;
|
|
||||||
int decay_scale;
|
|
||||||
} tlv320aic3204_agc_config_t;
|
|
||||||
|
|
||||||
extern void tlv320aic3204_init(void);
|
extern void tlv320aic3204_init(void);
|
||||||
extern void tlv320aic3204_set_gain(int lgain, int rgain);
|
extern void tlv320aic3204_set_gain(int lgain, int rgain);
|
||||||
extern void tlv320aic3204_set_digital_gain(int gain);
|
extern void tlv320aic3204_select(int channel);
|
||||||
extern void tlv320aic3204_set_volume(int gain);
|
|
||||||
extern void tlv320aic3204_agc_config(tlv320aic3204_agc_config_t *conf);
|
|
||||||
extern void tlv320aic3204_select_in1(void);
|
|
||||||
extern void tlv320aic3204_select_in3(void);
|
|
||||||
extern void tlv320aic3204_adc_filter_enable(int enable);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
424
tlv320aic3204.c
424
tlv320aic3204.c
|
|
@ -25,325 +25,133 @@
|
||||||
|
|
||||||
#define wait_ms(ms) chThdSleepMilliseconds(ms)
|
#define wait_ms(ms) chThdSleepMilliseconds(ms)
|
||||||
|
|
||||||
void tlv320aic3204_config_adc_filter(void);
|
static const uint8_t conf_data_pll[] = {
|
||||||
|
// len, ( reg, data ),
|
||||||
|
2, 0x00, 0x00, /* Initialize to Page 0 */
|
||||||
|
2, 0x01, 0x01, /* Initialize the device through software reset */
|
||||||
|
2, 0x04, 0x43, /* PLL Clock High, MCLK, PLL */
|
||||||
|
#ifdef REFCLK_8000KHZ
|
||||||
|
/* 8.000MHz*10.7520 = 86.016MHz, 86.016MHz/(2*7*128) = 48kHz */
|
||||||
|
2, 0x05, 0x91, /* Power up PLL, P=1,R=1 */
|
||||||
|
2, 0x06, 0x0a, /* J=10 */
|
||||||
|
2, 0x07, 29, /* D=7520 = (29<<8) + 96 */
|
||||||
|
2, 0x08, 96,
|
||||||
|
#endif
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
static void I2CWrite(int addr, uint8_t d0, uint8_t d1)
|
// default fs=48kHz
|
||||||
|
static const uint8_t conf_data_clk[] = {
|
||||||
|
2, 0x0b, 0x82, /* Power up the NDAC divider with value 2 */
|
||||||
|
2, 0x0c, 0x87, /* Power up the MDAC divider with value 7 */
|
||||||
|
2, 0x0d, 0x00, /* Program the OSR of DAC to 128 */
|
||||||
|
2, 0x0e, 0x80,
|
||||||
|
2, 0x3c, 0x08, /* Set the DAC Mode to PRB_P8 */
|
||||||
|
//2, 0x3c, 25, /* Set the DAC Mode to PRB_P25 */
|
||||||
|
2, 0x1b, 0x0c, /* Set the BCLK,WCLK as output */
|
||||||
|
2, 0x1e, 0x80 + 28, /* Enable the BCLKN divider with value 28 */
|
||||||
|
2, 0x25, 0xee, /* DAC power up */
|
||||||
|
|
||||||
|
2, 0x12, 0x82, /* Power up the NADC divider with value 2 */
|
||||||
|
2, 0x13, 0x87, /* Power up the MADC divider with value 7 */
|
||||||
|
2, 0x14, 0x80, /* Program the OSR of ADC to 128 */
|
||||||
|
2, 0x3d, 0x01, /* Select ADC PRB_R1 */
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t conf_data_routing[] = {
|
||||||
|
2, 0x00, 0x01, /* Select Page 1 */
|
||||||
|
2, 0x01, 0x08, /* Disable Internal Crude AVdd in presence of external AVdd supply or before powering up internal AVdd LDO*/
|
||||||
|
2, 0x02, 0x01, /* Enable Master Analog Power Control */
|
||||||
|
2, 0x7b, 0x01, /* Set the REF charging time to 40ms */
|
||||||
|
2, 0x14, 0x25, /* HP soft stepping settings for optimal pop performance at power up Rpop used is 6k with N = 6 and soft step = 20usec. This should work with 47uF coupling capacitor. Can try N=5,6 or 7 time constants as well. Trade-off delay vs “pop” sound. */
|
||||||
|
2, 0x0a, 0x33, /* Set the Input Common Mode to 0.9V and Output Common Mode for Headphone to 1.65V */
|
||||||
|
|
||||||
|
2, 0x3d, 0x00, /* Select ADC PTM_R4 */
|
||||||
|
2, 0x47, 0x32, /* Set MicPGA startup delay to 3.1ms */
|
||||||
|
2, 0x7b, 0x01, /* Set the REF charging time to 40ms */
|
||||||
|
2, 0x34, 0x10, /* Route IN2L to LEFT_P with 10K */
|
||||||
|
2, 0x36, 0x10, /* Route IN2R to LEFT_N with 10K */
|
||||||
|
2, 0x37, 0x04, /* Route IN3R to RIGHT_P with 10K */
|
||||||
|
2, 0x39, 0x04, /* Route IN3L to RIGHT_N with 10K */
|
||||||
|
2, 0x3b, 0, /* Unmute Left MICPGA, Gain selection of 32dB to make channel gain 0dB */
|
||||||
|
2, 0x3c, 0, /* Unmute Right MICPGA, Gain selection of 32dB to make channel gain 0dB */
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t conf_data_unmute[] = {
|
||||||
|
2, 0x00, 0x00, /* Select Page 0 */
|
||||||
|
2, 0x51, 0xc0, /* Power up Left and Right ADC Channels */
|
||||||
|
2, 0x52, 0x00, /* Unmute Left and Right ADC Digital Volume Control */
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
tlv320aic3204_bulk_write(const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
uint8_t buf[] = { d0, d1 };
|
int addr = AIC3204_ADDR;
|
||||||
i2cAcquireBus(&I2CD1);
|
i2cAcquireBus(&I2CD1);
|
||||||
(void)i2cMasterTransmitTimeout(&I2CD1, addr, buf, 2, NULL, 0, 1000);
|
(void)i2cMasterTransmitTimeout(&I2CD1, addr, buf, len, NULL, 0, 1000);
|
||||||
i2cReleaseBus(&I2CD1);
|
i2cReleaseBus(&I2CD1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static int
|
||||||
|
tlv320aic3204_read(uint8_t d0)
|
||||||
|
{
|
||||||
|
int addr = AIC3204_ADDR;
|
||||||
|
uint8_t buf[] = { d0 };
|
||||||
|
i2cAcquireBus(&I2CD1);
|
||||||
|
i2cMasterTransmitTimeout(&I2CD1, addr, buf, 1, buf, 1, 1000);
|
||||||
|
i2cReleaseBus(&I2CD1);
|
||||||
|
return buf[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
tlv320aic3204_config(const uint8_t *data)
|
||||||
|
{
|
||||||
|
const uint8_t *p = data;
|
||||||
|
while (*p) {
|
||||||
|
uint8_t len = *p++;
|
||||||
|
tlv320aic3204_bulk_write(p, len);
|
||||||
|
p += len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tlv320aic3204_init(void)
|
void tlv320aic3204_init(void)
|
||||||
{
|
{
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Initialize to Page 0 */
|
tlv320aic3204_config(conf_data_pll);
|
||||||
I2CWrite(AIC3204_ADDR, 0x01, 0x01); /* Initialize the device through software reset */
|
tlv320aic3204_config(conf_data_clk);
|
||||||
I2CWrite(AIC3204_ADDR, 0x04, 0x43); /* PLL Clock High, MCLK, PLL */
|
tlv320aic3204_config(conf_data_routing);
|
||||||
#ifdef REFCLK_8000KHZ
|
wait_ms(40);
|
||||||
/* 8.000MHz*10.7520 = 86.016MHz, 86.016MHz/(2*7*128) = 48kHz */
|
tlv320aic3204_config(conf_data_unmute);
|
||||||
I2CWrite(AIC3204_ADDR, 0x05, 0x91); /* Power up PLL, P=1,R=1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x06, 0x0a); /* J=10 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x07, 29); /* D=7520 = (29<<8) + 96 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x08, 96);
|
|
||||||
#endif
|
|
||||||
#ifdef REFCLK_12000KHZ
|
|
||||||
/* 12.000MHz*7.1680 = 86.016MHz, 86.016MHz/(2*7*128) = 48kHz */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x05, 0x91); /* Power up PLL, P=1,R=1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x06, 0x07); /* J=7 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x07, 6); /* D=1680 = (6<<8) + 144 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x08, 144);
|
|
||||||
#endif
|
|
||||||
#ifdef REFCLK_19200KHZ
|
|
||||||
/* 19.200MHz*4.48 = 86.016MHz, 86.016MHz/(2*7*128) = 48kHz */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x05, 0x91); /* Power up PLL, P=1,R=1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x06, 0x04); /* J=4 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x07, 18); /* D=4800 = (18<<8) + 192 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x08, 192);
|
|
||||||
#endif
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x0b, 0x82); /* Power up the NDAC divider with value 2 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x0c, 0x87); /* Power up the MDAC divider with value 7 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x0d, 0x00); /* Program the OSR of DAC to 128 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x0e, 0x80);
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3c, 0x08); /* Set the DAC Mode to PRB_P8 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x1b, 0x0c); /* Set the BCLK,WCLK as output */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x1e, 0x80 + 28); /* Enable the BCLKN divider with value 28 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x25, 0xee); /* DAC power up */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x01, 0x08); /* Disable Internal Crude AVdd in presence of external AVdd supply or before powering up internal AVdd LDO*/
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x02, 0x01); /* Enable Master Analog Power Control */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x7b, 0x01); /* Set the REF charging time to 40ms */
|
|
||||||
// I2CWrite(AIC3204_ADDR, 0x0a, 0x00); /* Set the Input Common Mode to 0.9V and Output Common Mode for Headphone to Input Common Mode */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x0a, 0x33); /* Set the Input Common Mode to 0.9V and Output Common Mode for Headphone to 1.65V */
|
|
||||||
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x12, 0x87); /* Power up the NADC divider with value 7 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x13, 0x82); /* Power up the MADC divider with value 2 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x14, 0x80); /* Program the OSR of ADC to 128 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3d, 0x01); /* Select ADC PRB_R1 */
|
|
||||||
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3d, 0x00); /* Select ADC PTM_R4 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x47, 0x32); /* Set MicPGA startup delay to 3.1ms */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x7b, 0x01); /* Set the REF charging time to 40ms */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x34, 0x10); /* Route IN2L to LEFT_P with 10K input impedance */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x36, 0x10); /* Route IN2R to LEFT_N with 10K input impedance */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x37, 0x04); /* Route IN3R to RIGHT_P with input impedance of 10K */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x39, 0x04); /* Route IN3L to RIGHT_N with impedance of 10K */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3b, 0); /* Unmute Left MICPGA, Gain selection of 32dB to make channel gain 0dB */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3c, 0); /* Unmute Right MICPGA, Gain selection of 32dB to make channel gain 0dB */
|
|
||||||
|
|
||||||
wait_ms(40);
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x51, 0xc0); /* Power up Left and Right ADC Channels */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x52, 0x00); /* Unmute Left and Right ADC Digital Volume Control */
|
|
||||||
|
|
||||||
//tlv320aic3204_config_adc_filter();
|
|
||||||
//tlv320aic3204_adc_filter_enable(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tlv320aic3204_select_in3(void)
|
void tlv320aic3204_select(int channel)
|
||||||
{
|
{
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
const uint8_t ch3[] = {
|
||||||
I2CWrite(AIC3204_ADDR, 0x37, 0x04); /* Route IN3R to RIGHT_P with input impedance of 10K */
|
2, 0x00, 0x01, /* Select Page 1 */
|
||||||
I2CWrite(AIC3204_ADDR, 0x39, 0x04); /* Route IN3L to RIGHT_N with input impedance of 10K */
|
2, 0x37, 0x04, /* Route IN3R to RIGHT_P with input impedance of 10K */
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
2, 0x39, 0x04, /* Route IN3L to RIGHT_N with input impedance of 10K */
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
const uint8_t ch1[] = {
|
||||||
|
2, 0x00, 0x01, /* Select Page 1 */
|
||||||
|
2, 0x37, 0x40, /* Route IN1R to RIGHT_P with input impedance of 10K */
|
||||||
|
2, 0x39, 0x10, /* Route IN1L to RIGHT_N with input impedance of 10K */
|
||||||
|
0 // sentinel
|
||||||
|
};
|
||||||
|
tlv320aic3204_config(channel ? ch1 : ch3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tlv320aic3204_select_in1(void)
|
|
||||||
{
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x37, 0x40); /* Route IN1R to RIGHT_P with input impedance of 10K */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x39, 0x10); /* Route IN1L to RIGHT_N with input impedance of 10K */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlv320aic3204_adc_filter_enable(int enable)
|
|
||||||
{
|
|
||||||
if (enable)
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3d, 0x02); /* Select ADC PRB_R2 */
|
|
||||||
else
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3d, 0x01); /* Select ADC PRB_R1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* bb, aa = signal.ellip(5, 0.1, 100, (4800.0/24000, 5200.0/24000), 'bandpass') */
|
|
||||||
const uint8_t adc_filter_config[] = {
|
|
||||||
/* len, page, reg, data.... */
|
|
||||||
|
|
||||||
/* left channel C7 - C31 */
|
|
||||||
92, 8, 36,
|
|
||||||
/* Pg8 Reg36-127 */
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf5, 0xeb, 0x1c, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x63, 0x04, 0xf8, 0x00,
|
|
||||||
0x82, 0xf3, 0x20, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf8, 0xac, 0x58, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x64, 0x26, 0x9e, 0x00,
|
|
||||||
0x83, 0x9c, 0x9a, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf5, 0x92, 0x43, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x65, 0xcc, 0x37, 0x00,
|
|
||||||
0x82, 0xd1, 0x6e, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf7, 0xd5, 0x05, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x67, 0x48, 0x63, 0x00,
|
|
||||||
0x81, 0x0a, 0xab, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0xf4, 0x4c, 0x16, 0x00,
|
|
||||||
8, 9, 8,
|
|
||||||
/* Pg9 Reg 8-15 */
|
|
||||||
0x62, 0xdd, 0xc7, 0x00,
|
|
||||||
0x81, 0x1e, 0xf9, 0x00,
|
|
||||||
|
|
||||||
/* right channel C39 - C63 */
|
|
||||||
84, 9, 44,
|
|
||||||
/* Pg9 Reg 44-127 */
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf5, 0xeb, 0x1c, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x63, 0x04, 0xf8, 0x00,
|
|
||||||
0x82, 0xf3, 0x20, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf8, 0xac, 0x58, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x64, 0x26, 0x9e, 0x00,
|
|
||||||
0x83, 0x9c, 0x9a, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf5, 0x92, 0x43, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x65, 0xcc, 0x37, 0x00,
|
|
||||||
0x82, 0xd1, 0x6e, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0xf7, 0xd5, 0x05, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
0x67, 0x48, 0x63, 0x00,
|
|
||||||
0x81, 0x0a, 0xab, 0x00,
|
|
||||||
0x0b, 0xb3, 0xea, 0x00,
|
|
||||||
|
|
||||||
16, 10, 8,
|
|
||||||
/* Pg10 Reg 8-23 */
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0xf4, 0x4c, 0x16, 0x00,
|
|
||||||
0x62, 0xdd, 0xc7, 0x00,
|
|
||||||
0x81, 0x1e, 0xf9, 0x00,
|
|
||||||
0 /* sentinel */
|
|
||||||
};
|
|
||||||
#elif 0
|
|
||||||
/* bb, aa = signal.ellip(2, 0.1, 100, (4500.0/24000, 5500.0/24000), 'bandpass') */
|
|
||||||
const uint8_t adc_filter_config[] = {
|
|
||||||
/* len, page, reg, data.... */
|
|
||||||
/* left channel C7 - C31 */
|
|
||||||
40, 8, 36,
|
|
||||||
/* Pg8 Reg36-127 */
|
|
||||||
0x02, 0x65, 0xce, 0x00,
|
|
||||||
0x02, 0x65, 0x1b, 0x00,
|
|
||||||
0x02, 0x65, 0xce, 0x00,
|
|
||||||
0x65, 0x27, 0x96, 0x00,
|
|
||||||
0x90, 0x4b, 0xd5, 0x00,
|
|
||||||
0x52, 0x46, 0xbb, 0x00,
|
|
||||||
0xad, 0xb9, 0x96, 0x00,
|
|
||||||
0x52, 0x46, 0xbb, 0x00,
|
|
||||||
0x56, 0x5f, 0xd2, 0x00,
|
|
||||||
0x94, 0x52, 0x41, 0x00,
|
|
||||||
/* right channel C39 - C63 */
|
|
||||||
40, 9, 44,
|
|
||||||
/* Pg9 Reg 44-127 */
|
|
||||||
0x02, 0x65, 0xce, 0x00,
|
|
||||||
0x02, 0x65, 0x1b, 0x00,
|
|
||||||
0x02, 0x65, 0xce, 0x00,
|
|
||||||
0x65, 0x27, 0x96, 0x00,
|
|
||||||
0x90, 0x4b, 0xd5, 0x00,
|
|
||||||
0x52, 0x46, 0xbb, 0x00,
|
|
||||||
0xad, 0xb9, 0x96, 0x00,
|
|
||||||
0x52, 0x46, 0xbb, 0x00,
|
|
||||||
0x56, 0x5f, 0xd2, 0x00,
|
|
||||||
0x94, 0x52, 0x41, 0x00,
|
|
||||||
0 /* sentinel */
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
/* bb, aa = signal.bessel(2, (4500.0/24000, 5500.0/24000), 'bandpass') */
|
|
||||||
const uint8_t adc_filter_config[] = {
|
|
||||||
/* len, page, reg, data.... */
|
|
||||||
/* left channel C7 - C31 */
|
|
||||||
40, 8, 36,
|
|
||||||
/* Pg8 Reg36-127 */
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x5d, 0x91, 0x0f, 0x00,
|
|
||||||
0x8e, 0x4b, 0x9a, 0x00,
|
|
||||||
0x18, 0x22, 0x1d, 0x00,
|
|
||||||
0xe7, 0xdd, 0xe3, 0x00,
|
|
||||||
0x18, 0x22, 0x1d, 0x00,
|
|
||||||
0x62, 0xd9, 0x9b, 0x00,
|
|
||||||
0x8d, 0x2c, 0xda, 0x00,
|
|
||||||
|
|
||||||
/* right channel C39 - C63 */
|
|
||||||
40, 9, 44,
|
|
||||||
/* Pg9 Reg 44-127 */
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x02, 0x9b, 0xed, 0x00,
|
|
||||||
0x5d, 0x91, 0x0f, 0x00,
|
|
||||||
0x8e, 0x4b, 0x9a, 0x00,
|
|
||||||
0x18, 0x22, 0x1d, 0x00,
|
|
||||||
0xe7, 0xdd, 0xe3, 0x00,
|
|
||||||
0x18, 0x22, 0x1d, 0x00,
|
|
||||||
0x62, 0xd9, 0x9b, 0x00,
|
|
||||||
0x8d, 0x2c, 0xda, 0x00,
|
|
||||||
0 /* sentinel */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void tlv320aic3204_config_adc_filter(void)
|
|
||||||
{
|
|
||||||
const uint8_t *p = adc_filter_config;
|
|
||||||
|
|
||||||
while (*p != 0) {
|
|
||||||
uint8_t len = *p++;
|
|
||||||
uint8_t page = *p++;
|
|
||||||
uint8_t reg = *p++;
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, page);
|
|
||||||
while (len-- > 0)
|
|
||||||
I2CWrite(AIC3204_ADDR, reg++, *p++);
|
|
||||||
}
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* page 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void tlv320aic3204_set_gain(int lgain, int rgain)
|
void tlv320aic3204_set_gain(int lgain, int rgain)
|
||||||
{
|
{
|
||||||
if (lgain < 0)
|
uint8_t data[] = {
|
||||||
lgain = 0;
|
2, 0x00, 0x01, /* Select Page 1 */
|
||||||
if (lgain > 95)
|
2, 0x3b, lgain, /* Unmute Left MICPGA, set gain */
|
||||||
lgain = 95;
|
2, 0x3c, rgain, /* Unmute Right MICPGA, set gain */
|
||||||
if (rgain < 0)
|
0 // sentinel
|
||||||
rgain = 0;
|
};
|
||||||
if (rgain > 95)
|
tlv320aic3204_config(data);
|
||||||
rgain = 95;
|
|
||||||
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3b, lgain); /* Unmute Left MICPGA, set gain */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x3c, rgain); /* Unmute Right MICPGA, set gain */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlv320aic3204_set_digital_gain(int gain)
|
|
||||||
{
|
|
||||||
if (gain < -24)
|
|
||||||
gain = -24;
|
|
||||||
if (gain > 40)
|
|
||||||
gain = 40;
|
|
||||||
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x53, gain & 0x7f); /* Left ADC Channel Volume */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x54, gain & 0x7f); /* Right ADC Channel Volume */
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlv320aic3204_set_volume(int gain)
|
|
||||||
{
|
|
||||||
if (gain > 29)
|
|
||||||
gain = 29;
|
|
||||||
else if (gain < -6)
|
|
||||||
gain = 0x40;
|
|
||||||
else
|
|
||||||
gain &= 0x3f;
|
|
||||||
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x01); /* Select Page 1 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x10, gain); /* Unmute Left MICPGA, set gain */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x11, gain); /* Unmute Right MICPGA, set gain */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
void tlv320aic3204_agc_config(tlv320aic3204_agc_config_t *conf)
|
|
||||||
{
|
|
||||||
int ctrl = 0;
|
|
||||||
if (conf == NULL) {
|
|
||||||
ctrl = 0;
|
|
||||||
} else {
|
|
||||||
ctrl = 0x80
|
|
||||||
| ((conf->target_level & 0x7) << 4)
|
|
||||||
| (conf->gain_hysteresis & 0x3);
|
|
||||||
}
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x00, 0x00); /* Select Page 0 */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x56, ctrl); /* Left AGC Control Register */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x5e, ctrl); /* Right AGC Control Register */
|
|
||||||
if (ctrl == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ctrl = ((conf->attack & 0x1f) << 3) | (conf->attack_scale & 0x7);
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x59, ctrl); /* Left AGC Attack Time */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x61, ctrl); /* Right AGC Attack Time */
|
|
||||||
|
|
||||||
ctrl = ((conf->decay & 0x1f) << 3) | (conf->decay_scale & 0x7);
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x5a, ctrl); /* Left AGC Decay Time */
|
|
||||||
I2CWrite(AIC3204_ADDR, 0x62, ctrl); /* Right AGC Decay Time */
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue