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?