Forum: Mikrocontroller und Digitale Elektronik Problem mit DFLL im SAMD20


von Stefan (Gast)


Lesenswert?

Hallo Forum,

ich versuche mit dem ASF 3.12.1 einen SAMD20 per DFLL zu clocken.
Leider funktioniert das ganz und gar nicht! :-(

Ich habe in der clock_conf.cfg folgendes stehen:
1
#include <clock.h>
2
3
#ifndef CONF_CLOCKS_H_INCLUDED
4
#  define CONF_CLOCKS_H_INCLUDED
5
6
/* System clock bus configuration */
7
#  define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT     true
8
#  define CONF_CLOCK_FLASH_WAIT_STATES            0
9
#  define CONF_CLOCK_CPU_DIVIDER                  SYSTEM_MAIN_CLOCK_DIV_1
10
#  define CONF_CLOCK_APBA_DIVIDER                 SYSTEM_MAIN_CLOCK_DIV_1
11
#  define CONF_CLOCK_APBB_DIVIDER                 SYSTEM_MAIN_CLOCK_DIV_1
12
13
14
/* SYSTEM_CLOCK_SOURCE_OSC8M configuration - Internal 8MHz oscillator */
15
#  define CONF_CLOCK_OSC8M_PRESCALER              SYSTEM_OSC8M_DIV_1
16
#  define CONF_CLOCK_OSC8M_ON_DEMAND              true
17
#  define CONF_CLOCK_OSC8M_RUN_IN_STANDBY         false
18
19
/* SYSTEM_CLOCK_SOURCE_XOSC configuration - External clock/oscillator */
20
#  define CONF_CLOCK_XOSC_ENABLE                  false
21
#  define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL        SYSTEM_CLOCK_EXTERNAL_CRYSTAL
22
#  define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY      12000000UL
23
#  define CONF_CLOCK_XOSC_STARTUP_TIME            SYSTEM_XOSC_STARTUP_32768
24
#  define CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL       true
25
#  define CONF_CLOCK_XOSC_ON_DEMAND               true
26
#  define CONF_CLOCK_XOSC_RUN_IN_STANDBY          false
27
28
/* SYSTEM_CLOCK_SOURCE_XOSC32K configuration - External 32KHz crystal/clock oscillator */
29
#  define CONF_CLOCK_XOSC32K_ENABLE               true
30
#  define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL     SYSTEM_CLOCK_EXTERNAL_CRYSTAL
31
#  define CONF_CLOCK_XOSC32K_STARTUP_TIME         SYSTEM_XOSC32K_STARTUP_65536
32
#  define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL  false
33
#  define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT    false
34
#  define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT  true
35
#  define CONF_CLOCK_XOSC32K_ON_DEMAND            true
36
#  define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY       false
37
38
/* SYSTEM_CLOCK_SOURCE_OSC32K configuration - Internal 32KHz oscillator */
39
#  define CONF_CLOCK_OSC32K_ENABLE                false
40
#  define CONF_CLOCK_OSC32K_STARTUP_TIME          SYSTEM_OSC32K_STARTUP_128
41
#  define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT    true
42
#  define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT   true
43
#  define CONF_CLOCK_OSC32K_ON_DEMAND             true
44
#  define CONF_CLOCK_OSC32K_RUN_IN_STANDBY        false
45
46
/* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */
47
#  define CONF_CLOCK_DFLL_ENABLE                  true
48
#  define CONF_CLOCK_DFLL_LOOP_MODE               SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
49
#  define CONF_CLOCK_DFLL_ON_DEMAND               false
50
#  define CONF_CLOCK_DFLL_RUN_IN_STANDBY          false
51
52
/* DFLL open loop mode configuration */
53
#  define CONF_CLOCK_DFLL_COARSE_VALUE            (0x1f / 4)
54
#  define CONF_CLOCK_DFLL_FINE_VALUE              (0xff / 4)
55
56
/* DFLL closed loop mode configuration */
57
#  define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR   GCLK_GENERATOR_0
58
#  define CONF_CLOCK_DFLL_MULTIPLY_FACTOR         2
59
#  define CONF_CLOCK_DFLL_QUICK_LOCK              true
60
#  define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK   true
61
#  define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP     true
62
#  define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE      true
63
#  define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE    (0x1f / 4)
64
#  define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE      (0xff / 4)
65
66
67
/* Set this to true to configure the GCLK when running clocks_init. If set to
68
 * false, none of the GCLK generators will be configured in clocks_init(). */
69
#  define CONF_CLOCK_CONFIGURE_GCLK               true
70
71
/* Configure GCLK generator 0 (Main Clock) */
72
#  define CONF_CLOCK_GCLK_0_ENABLE                true
73
#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        false
74
#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
75
#  define CONF_CLOCK_GCLK_0_PRESCALER             1
76
#  define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE         true
77
78
/* Configure GCLK generator 1 */
79
#  define CONF_CLOCK_GCLK_1_ENABLE                true
80
#  define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY        false
81
#  define CONF_CLOCK_GCLK_1_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DFLL
82
#  define CONF_CLOCK_GCLK_1_PRESCALER             1
83
#  define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE         true
84
85
/* Configure GCLK generator 2 (RTC) */
86
#  define CONF_CLOCK_GCLK_2_ENABLE                false
87
#  define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY        false
88
#  define CONF_CLOCK_GCLK_2_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC32K
89
#  define CONF_CLOCK_GCLK_2_PRESCALER             32
90
#  define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE         false
91
92
/* Configure GCLK generator 3 */
93
#  define CONF_CLOCK_GCLK_3_ENABLE                false
94
#  define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY        false
95
#  define CONF_CLOCK_GCLK_3_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
96
#  define CONF_CLOCK_GCLK_3_PRESCALER             1
97
#  define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE         false
98
99
/* Configure GCLK generator 4 */
100
#  define CONF_CLOCK_GCLK_4_ENABLE                false
101
#  define CONF_CLOCK_GCLK_4_RUN_IN_STANDBY        false
102
#  define CONF_CLOCK_GCLK_4_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
103
#  define CONF_CLOCK_GCLK_4_PRESCALER             1
104
#  define CONF_CLOCK_GCLK_4_OUTPUT_ENABLE         false
105
106
/* Configure GCLK generator 5 */
107
#  define CONF_CLOCK_GCLK_5_ENABLE                false
108
#  define CONF_CLOCK_GCLK_5_RUN_IN_STANDBY        false
109
#  define CONF_CLOCK_GCLK_5_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
110
#  define CONF_CLOCK_GCLK_5_PRESCALER             1
111
#  define CONF_CLOCK_GCLK_5_OUTPUT_ENABLE         false
112
113
/* Configure GCLK generator 6 */
114
#  define CONF_CLOCK_GCLK_6_ENABLE                false
115
#  define CONF_CLOCK_GCLK_6_RUN_IN_STANDBY        false
116
#  define CONF_CLOCK_GCLK_6_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
117
#  define CONF_CLOCK_GCLK_6_PRESCALER             1
118
#  define CONF_CLOCK_GCLK_6_OUTPUT_ENABLE         false
119
120
/* Configure GCLK generator 7 */
121
#  define CONF_CLOCK_GCLK_7_ENABLE                false
122
#  define CONF_CLOCK_GCLK_7_RUN_IN_STANDBY        false
123
#  define CONF_CLOCK_GCLK_7_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
124
#  define CONF_CLOCK_GCLK_7_PRESCALER             1
125
#  define CONF_CLOCK_GCLK_7_OUTPUT_ENABLE         false
126
127
#endif /* CONF_CLOCKS_H_INCLUDED */

Ich habe zwei Portpins des SAMD20 so konfiguriert, dass an einem der 
Pins der Takt von Generator0 ausgegeben wird, der andere Pin zeigt den 
Takt von Generator1 an.

Ich sehe am DSO, dass Generator0 8 MHz ausgibt - wie erwartet. Am 
Portpin von Generator1 werden aber nicht die erwarteten 32768 kHz * 2 
sondern ~31 MHz ausgegeben! Es ändert auch gar nicht was ich als 
Multiplikator in "CONF_CLOCK_DFLL_MULTIPLY_FACTOR" eintrage - es kommen 
das selbe raus.

Ich habe die passenden Register im IO-View des AtmelStudios angeschaut, 
dort sind die passende Werte reingeschrieben worden.

Hat jemand von Euch Erfahrungen mit dem SAMD20 generell und zu diesem 
Problem speziell gesammelt?


Viele Grüße
Stefan

von Daniel (Gast)


Lesenswert?

Im Datenblatt steht dass DFLL Clock source/Reference jest 32kHz, und aus 
Deinem Text lese ich heraus dass es das ist was du brauchst?

Jedenfalls, in deiner conf_clocks.h hast du

"CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR   GCLK_GENERATOR_0"
und
"CONF_CLOCK_GCLK_0_CLOCK_SOURCE   SYSTEM_CLOCK_SOURCE_OSC8M".

Das heißt du hast somit 8MHz als Clock reference.

Ich würd versuchen den Generator2 einzuschalten, und diesen als die DFLL 
Clock Source einstellen, dieser Generator scheint den 32KHz clock source 
zu haben.

So ins Detail hab ich mich noch nicht damit befasst, aber das was ich 
bisher gesehen habe schon ein sehr nützliche MCU

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Daniel,

danke für die Antwort! Leider verhält sich der MC nicht wie gewünscht.

Ich habe mein mini Testprogramm einmal als Dateianhang für das 
AtmelStudio 6.1 beigepackt.

Es wird ClockGenerator_0 als Quelle für die DFLL genutzt. Diese Quelle 
wird vom internen 8 MHz geclockt. Die DFLL hat einen Wert von 2 in 
seinem Multiplikations-Register -> somit sollten 16 MHz generiert 
werden. Die DFLL dient als Taktquelle für den ClockGenerator_1. Am 
Portpin sehe ich jetzt der erwarteten 16 MHz allerdings etwas zwischen 
31-32 MHz.

Es wäre sehr nett, wenn irgend jemand mit einem SAMD20 einmal kurz das 
Projekt kompilieren und bei sich prüfen könnte!

Das Projekt ist im ASF 3.12.1 verfasst. Ich bin aber auch über Code ohne 
ASF glücklich der eventuelle Fehler meiner Seite erklären würde.

Ich nutze das "SAMD20 XPLAINED" Board als Grundlage mit der Rev. B des 
Chips.


Vielen Danke und viele Grüße
Stefan

von Stefan (Gast)


Lesenswert?

Nutzt denn niemand einen SAMD20 hier?

von Daniel (Gast)


Lesenswert?

ich hab mir mal das datenblatt genauer angesehen übrigens gar nicht mal 
so schlechtes teil :) viel drin in dem controller, ungewöhnlich.
nun zu deinem problem, hab leider kein xplain pro board hier mit dem 
samd20 aber wenn ich das aus dem datenblatt entnehme dann ist das 
DFLL48M modul lediglich für die Generierung einer 48MHZ output Frequenz 
konzipiert. Normalerweise sind dann alle generierten Werte abseits von 
den 48MHz nicht garantiert oder nicht stabil. Damit du aus der DFLL 
16MHZ erzeugen kannst, müsstest du die DFLL also auf 48MHz einstellen 
und dann den Clock durch 3 teilen. Das würde dann folglich einen 
nicht-50% duty cycle clock ergeben der gut genug für interne Module sein 
sollte, aber wenn du diesen Clock dann auf einen IO pin ausgeben willst 
UND eine "fast"-50% duty cycle brauchst, dann müsste man das GENCTRL.IDC 
bit setzen was aber glaub ich dann auch zu höherer power consumption 
führen könnte.

Sowas wie DFLL braucht man normalerweise als clock generator für interne 
Module, z.b. USB oder andere IPs.

Hoff das hilft, ich werd mir auch mal so ein xplain kit zulegen, 
speziell der ADC, DAC und die vielen SERCOMs interessieren mich

von Stefan (Gast)


Lesenswert?

Hallo Daniel,

danke für die Antwort!
Asche auf mein Haupt, im Datenblatt steht unter den elektrischen 
Eigenschaften zu dem DFLL-Modul auch das es nur(!) für 48 MHz geeignet 
ist. (Ich habe mich wohl von der XMEGA-Reihe verleiten lassen, dass der 
DFLL auch andere Werte direkt generieren kann --> XMEGA RC32MHZ kann für 
USB auch 48 MHz (und mehr) erzeugen).

Interessant ist übrigens das Du mir eine Antwort im mehr oder weniger 
selben Wortlaut gegeben hast, wie ich sie von Atmel heute morgen per 
Email erhalten habe! :-)
1
Dear Stefan,
2
3
The DFLL48M module in the SAM D20 is designed for the generation of a
4
48MHz output frequency only; values deviating from the 48MHz nominal
5
output frequency are not guaranteed and will most likely be inaccurate
6
and/or unstable. To achieve 16MHz from the DFLL, run the DFLL at 48MHz and 
7
divide the clock in the Generic Clock Generator by a factor of 3. This
8
will give a non-50% duty cycle clock suitable for internal module use 
9
-- if you wish to output this to a I/O pin externally and need a near-50%
10
duty cycle, the GENCTRL.IDC (Generator Improved Duty Cycle) bit can be set
11
at the cost of a higher power consumption.
12
13
Best Regards,
14
Dean Camera
15
Atmel Technical Support Team

Viele Grüße
Stefan

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.