Forum: Mikrocontroller und Digitale Elektronik sgtl5000 Init LineIn zu Headphone via ADC/DAC


von A. B. (funky)


Lesenswert?

Hi,

ich habe ein Board welches noch mit einem SGTL5000 bestückt ist.
Ein Micro hängt an LineIn und der Lautsprecher an HeadphoneL/R

Der analoge Pfad  Mic -> LineIn -> Headphone funktioniert. Da ist der 
ADC/DAC & DAP komplett aussen vor und ich höre etwas (mit 
initBasicConfig() & initAnalogAudioPath() )

Nun möchte ich umswitchen auf LineIn -> ADC -> DAC ->  Headphone (mit 
mit initBasicConfig() & initDigitalAudioPath() )
Da höre ich jedoch keinen Pieps (langfristig soll der ADC per i2s zu 
einem Controller senden und von dort per i2s zum DAC aber das wäre der 
übernächste Schritt)

Wenn ich den DAP komplett deaktiviere und ADC als Eingang für den DAC 
konfiguriere sollte ich doch eigentlich etwas hören?
DAC & ADC habe ich auf unmute gesetzt
Ich habe mal probiert den DAP per DAP_EN  auf passthrough zu setzen da 
ich nicht sicher bin ob "When disabled, no audio passes through" sonst 
gilt?
Aber eigentlich wird in 
https://community.nxp.com/t5/Other-NXP-Products/Routing-ADC-gt-DAC-in-sgtl5000/m-p/699654 
gesagt, dass der DAP komplett optional ist (aber in welchem Fall muss 
ich den denn dann auf passthrough stellen? wenn ADC -> DAP -> DAC und 
ich benutze den DAP dann gar nicht? Welchen Sinn hat das? Oder hängt das 
dann mit dem DAP Mixer zusammen?)


1
void SGTL5000::initBasicConfig(){
2
  writeRegister(CHIP_LINREG_CTRL_ADD, 0x006C);  // VDDA & VDDIO both over 3.1V
3
  writeRegister(CHIP_ANA_POWER_ADD, 0x77FF); /*DAC_STEREO | LINREG_SIMPLE_POWERUP | STARTUP_POWERUP
4
   | VDDC_CHRGPMP_POWERDOWN | PLL_POWERUP | LINREG_D_POWERUP
5
   | VCOAMP_POWERUP | VAG_POWERUP | ADC_STEREO | REFTOP_POWERUP
6
   | HEADPHONE_POWERUP | DAC_POWERUP | CAPLESS_HEADPHONE_POWERUP
7
   | ADC_POWERUP | LINEOUT_POWERUP*/
8
9
  CHIP_REF_CTRL.VAG_VAL   = 0x1f;  // 1.575v
10
  CHIP_REF_CTRL.BIAS_CTRL = 0x00;  // nominal
11
  CHIP_REF_CTRL.SMALL_POP = 0x01;  // slow
12
  writeRegister(CHIP_REF_CTRL_ADD, CHIP_REF_CTRL.data);
13
14
  CHIP_LINE_OUT_CTRL.OUT_CURRENT = 0x03;  // 0,36mA
15
  CHIP_LINE_OUT_CTRL.LO_VAGCNTRL = 0x22;  // 1,65 V
16
  writeRegister(CHIP_LINE_OUT_CTRL_ADD, CHIP_LINE_OUT_CTRL.data);
17
  
18
  CHIP_MIC_CTRL.BIAS_RESISTOR = 0x01;  // 2kOhm
19
  CHIP_MIC_CTRL.BIAS_VOLT     = 0x03;  // 3.00V
20
  CHIP_MIC_CTRL.GAIN          = 0x02;  // 30dB
21
  writeRegister(CHIP_MIC_CTRL_ADD, CHIP_MIC_CTRL.data);
22
23
  writeRegister(CHIP_DIG_POWER_ADD, 0x0073);   // power up all digital stuff
24
  writeRegister(CHIP_SHORT_CTRL_ADD, 0x4446);  // allow up to 125mA
25
    
26
  writeRegister(CHIP_CLK_CTRL_ADD, 0x0000);      // 32k kHz, 256*Fs default values
27
  writeRegister(CHIP_I2S_CTRL_ADD, 0x0130);      // SCLK=32*Fs, 16bit, I2S format
28
  
29
}
30
31
void SGTL5000::initAnalogAudioPath()
32
{
33
  DAP_CONTROL.DAP_EN = 0x00;  // 
34
  DAP_CONTROL.MIX_EN = 0x00;  // dap mixer disable
35
  writeRegister(DAP_CONTROL_ADD, DAP_CONTROL.data);
36
  
37
  CHIP_ANA_CTRL.MUTE_ADC   = 0x01;           // 
38
  CHIP_ANA_CTRL.EN_ZCD_ADC = 0x01;           // adc zero cross detection enabled
39
  CHIP_ANA_CTRL.SELECT_ADC = 0x01;           // ADC input: line in
40
  CHIP_ANA_CTRL.MUTE_HP    = 0x00;           // unmute headphone
41
  CHIP_ANA_CTRL.EN_ZCD_HP  = 0x01;           // headphone zerocross detection enabled
42
  CHIP_ANA_CTRL.SELECT_HP  = 0x01;           // headphone input: line in
43
  CHIP_ANA_CTRL.MUTE_LO    = 0x01;           // mute line out
44
  writeRegister(CHIP_ANA_CTRL_ADD, CHIP_ANA_CTRL.data);  // enable zero cross detectors
45
46
}
47
48
49
void SGTL5000::initDigitalAudioPath(){
50
  DAP_CONTROL.MIX_EN = 0x00;   
51
  DAP_CONTROL.DAP_EN = 0x00;  
52
  writeRegister(DAP_CONTROL_ADD, DAP_CONTROL.data);
53
    
54
  CHIP_ANA_CTRL.MUTE_ADC   = 0x00;           // unmute ADC
55
  CHIP_ANA_CTRL.EN_ZCD_ADC = 0x01;           // adc zero cross detection enabled
56
  CHIP_ANA_CTRL.SELECT_ADC = 0x01;           // ADC input: line in
57
  CHIP_ANA_CTRL.MUTE_HP    = 0x00;           // unmute headphone
58
  CHIP_ANA_CTRL.EN_ZCD_HP  = 0x01;           // headphone zerocross detection enabled
59
  CHIP_ANA_CTRL.SELECT_HP  = 0x00;           // headphone input: DAC
60
  CHIP_ANA_CTRL.MUTE_LO    = 0x01;           // mute line out
61
  writeRegister(CHIP_ANA_CTRL_ADD, CHIP_ANA_CTRL.data);  // enable zero cross detectors
62
63
  CHIP_ADCDAC_CTRL.DAC_MUTE_RIGHT = 0x00; //unmute
64
  CHIP_ADCDAC_CTRL.DAC_MUTE_LEFT = 0x00;  //unmute
65
  writeRegister(CHIP_ADCDAC_CTRL_ADD, CHIP_ADCDAC_CTRL.data);
66
  
67
  // ROUTING
68
  CHIP_SSS_CTRL.DAC_SELECT = 0x00;  // Source for DAC: ADC
69
  writeRegister(CHIP_SSS_CTRL_ADD, CHIP_SSS_CTRL.data);
70
}

Die wesentliche Zeile für den digital Pfad sind eigentlich
1
CHIP_SSS_CTRL.DAC_SELECT = 0x00;  // Source for DAC: ADC
2
CHIP_ANA_CTRL.SELECT_HP  = 0x00;  // headphone input: DAC
Übersehe ich da irgendeine Einstellung? Die Volumes habe ich erstmal 
unangetastet gelassen da die nicht auf 0 standen.

: Bearbeitet durch User
von A. B. (funky)


Lesenswert?

btw, ganz vergessen zu updaten

Also den Modus digital Modus mit SGTL5000 only mit
LineIN -> ADC -> (DAP) ->DAC -> HP out habe ich nie hinbekommen.
Das Teil macht bei mir einfach kein Mucks (egal ob mit oder ohne 
DAP)...warum auch immer. Hab auch im NXP Forum diesbezüglich nachgefragt 
aber da kam kein hilfreicher Hinweis.

linein > ADC -> i2sout -> Controller -> i2sin -> DAC -> HP out 
funktioniert dann aber zumindest

Hier war dannnoch der Knackpunkt, dass die STM32H7 HAL durchwachsen ist
HAL_I2S_Transmit_DMA & HAL_I2S_Receive_DMA funktioniert nicht, da intern 
was mit den Interrupts & DMA vermurkst ist aber
HAL_I2SEx_TransmitReceive_DMA funktioniert.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.