Forum: Mikrocontroller und Digitale Elektronik SAMC21 PLL lockt nicht


von Daniel H. (Gast)


Lesenswert?

Ich versuche gerade die DPLL des SAMC21 Controllers von Microchip 
(Atmel) in Betrieb zu nehmen.

Ich generiere mit dem internen 32k Oszillator eine Clock auf dem Generic 
Clock Generator 8 (GCG8).
Diese Clock möchte ich gerne als input für den DPLL des Controllers 
verwernden.
Die GCG8 funktioniert auch soweit denn wenn ich den GCG8 mit z.B. einem 
Timer verwende dann funktioniert dieser.

Jetzt kommt aber das Problem das eben dieser GCG8 auch von dem DPLL 
genutzt
werden soll damit ich daraus eine belibige Frquenz ezeugen kann.

Hier mein Code denn ich nutze:
1
void clock::config_oscctrl_dpll()
2
{
3
  OSCCTRL->DPLLCTRLA.bit.ONDEMAND = false;
4
  OSCCTRL->DPLLCTRLA.bit.RUNSTDBY = false;
5
  
6
  //DPLL Source
7
  OSCCTRL->DPLLCTRLB.bit.REFCLK = 2;
8
  
9
  //use generic clock 8
10
  clock::config_gclk_perf_clock(0,8,1,0);
11
12
  OSCCTRL->DPLLCTRLB.bit.DIV = 1;
13
  
14
  OSCCTRL->DPLLRATIO.bit.LDR = 1;
15
  
16
  OSCCTRL->DPLLRATIO.bit.LDRFRAC = 0;
17
  
18
  OSCCTRL->DPLLCTRLA.bit.ENABLE = true;
19
  
20
  //wait until enable is sync with input clock
21
  while((OSCCTRL->DPLLSYNCBUSY.bit.ENABLE));
22
  
23
  //wait until clock is stable
24
  while(!(OSCCTRL->DPLLSTATUS.bit.LOCK));
25
}
26
27
void clock::config_gclk_perf_clock(uint8_t clock, uint8_t source, bool enable, bool writelock)
28
{
29
  int reg = 0;
30
  
31
  //Clock Generator
32
  reg = source;
33
  
34
  //Enable
35
  reg |= (enable << 6);
36
  
37
  //Write Lock
38
  reg |= (writelock << 7);
39
  
40
  //write register
41
  GCLK->PCHCTRL[clock].reg = reg;
42
}

jemand eine Idee warum der DPLL nicht lockt?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Weiß nicht, ob es vergleichbar ist. Das hier habe ich in einer 
SAML21-Demo stehen:
1
/**
2
 * @brief Configure clock for timers
3
 *
4
 * This configures the DPLL to run at 48 MHz, post-scaled to 12 MHz.
5
 */
6
static void timer_clk_init(void)
7
{
8
    // Routing the reference and timing clock for FDPLL from generator 1
9
    GCLK->PCHCTRL[2].reg = GCLK_PCHCTRL_GEN(1) | GCLK_PCHCTRL_CHEN;
10
    GCLK->PCHCTRL[1].reg = GCLK_PCHCTRL_GEN(1) | GCLK_PCHCTRL_CHEN;
11
    OSCCTRL->DPLLCTRLB.bit.REFCLK = 0; // XOSC32K
12
13
    // Set multiplication ratio
14
    OSCCTRL->DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDR(DPLL_LDR) |
15
        OSCCTRL_DPLLRATIO_LDRFRAC(DPLL_LDRFRAC);
16
    while (OSCCTRL->DPLLSYNCBUSY.bit.DPLLRATIO) {}
17
    OSCCTRL->DPLLPRESC.bit.PRESC = DPLL_PRESCALER;
18
    while (OSCCTRL->DPLLSYNCBUSY.bit.DPLLPRESC) {}
19
    OSCCTRL->DPLLCTRLA.bit.ENABLE = 1;
20
    while (OSCCTRL->DPLLSYNCBUSY.bit.ENABLE) {}
21
    OSCCTRL->DPLLCTRLA.bit.ONDEMAND = 0;
22
    // wait for lock
23
    while (!OSCCTRL->DPLLSTATUS.bit.LOCK) {}
24
25
    // Switch generic clock generator 2 to DPLL 1 MHz
26
    GCLK->GENCTRL[2].reg = GCLK_GENCTRL_DIV(0) |
27
        GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DPLL96M_Val) |
28
        GCLK_GENCTRL_GENEN | GCLK_GENCTRL_OE;
29
}

von Daniel H. (Gast)


Lesenswert?

Danke Jörg für die schnelle Antwort.

Dein Beispiel benutzt als quelle einen externen 32k Oszillator.

Außerdem wird der Takt der Generic Clock 1 and beide clock teile des
DPLL geschickt:
GCLK_DPLL
GCLK_DPLL_32K

Könnte mein Problem damit zusammen hängen das ich die Generic CLock 8 
gewählt habe?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Daniel H. schrieb:
> Könnte mein Problem damit zusammen hängen das ich die Generic CLock 8
> gewählt habe?

Könnte. Musst du nochmal im Datasheet gucken. Ich glaube mich zu 
erinnern, dass manche der Clocks fest vorgegeben sind, wo sie hingelegt 
werden müssen, aber die Details habe ich gerade nicht so in Erinnerung.

von Daniel H. (Gast)


Lesenswert?

Hallo zusammen,

ich hab das Problem auch mal bei dem AVR Freaks gestellt und hier kam 
der entscheidende Tip.

Die PLL kann nur Ausgangsfrequenzen zwischen 48 MHz und 96 MHz erzeugen. 
Das ist auch der Grund warum hier dann kein Lock statt finden kann.

Hab den LDR auf 1499 gesetzt und damit 48MHz erzeugt.
32kHz * (1499 + 1) =  48MHz.

Danke nochmal an Jörg für die Hilfe.

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.