Forum: Mikrocontroller und Digitale Elektronik SAM-D21-Einstieg ohne ASF?


von Alexxx (Gast)


Lesenswert?

Hallo ich habe schon jahrelang Xmegas programmiert und mir da für Takt
und die Peripheriemodule schlanke Setup-Routinen programmiert.
Jetzt ist die Entscheidung für den Wechsel auf SAM-D21 gefallen.
- Gibt es hier jemand, der den "zu Fuß" - ohne ASF etc. programmiert 
hat?
- Was, grob, habt ihr programmiert?
- Hat jemand schon für den/die Takte, Dfll48 und Fdll96 Setup-Routinen 
programmiert?
- Wie sind eure Erfahrungen mit ASF, etc. ?
- In einem Diagramm (Figure 27-7) Hardware Controlled SS ist zu sehen, 
dass die Master-Spi nicht lückenlos sendet,
sondern eine Lücke zwischen die Bytes setzt. Lässt sich das abstellen?
Ist das nur im "Hardware Controlled" Mode so?
Mit dem FIFO sollte doch lückenloses senden möglich sein?

von Alexxx (Gast)


Lesenswert?

Hallo?
Alle SamD21-Nutzer im Urlaub?
Gibt es wo anderes ein aktiveres Forum?

von Dr. Sommer (Gast)


Lesenswert?

Alexxx schrieb:
> Alle SamD21-Nutzer im Urlaub?

Davon gibt's hier nicht so viele... Hier sind mehr STM32 User. Auf den 
STM32 kommt man gut ohne Bibliotheken klar, bei den Atmel Teilen sollte 
das auch möglich sein.

von Rudolph R. (rudolph)


Lesenswert?

Ich habe hier gerade ein Board von mir mit einem ATSAMC21E18A liegen auf 
dem ich bis auf CMSIS keine fremden Libs benutze.
Das Board hat allerdings praktisch nur einen SPI Anschluss an dem gerade 
ein EVE2-50G Display hängt, sowie einen CAN-FD den ich gerade nicht 
benutzen kann.
Ich könnte noch per ADC und Spannungsteiler die Versorgung messen.

https://github.com/RudolphRiedel/SAMC21_one

Mit dem 16MHz Quarz da dran initialisiere ich den Takt da gerade so:
1
void init_clock(void)
2
{
3
  REG_NVMCTRL_CTRLB = NVMCTRL_CTRLB_RWS(2);  // Set the NVM Read Wait States to 2, Since the operating frequency will be 48 MHz
4
5
  REG_OSCCTRL_XOSCCTRL =  OSCCTRL_XOSCCTRL_STARTUP(6) |    // 1,953 ms
6
              OSCCTRL_XOSCCTRL_RUNSTDBY |
7
              OSCCTRL_XOSCCTRL_AMPGC |
8
              OSCCTRL_XOSCCTRL_GAIN(3) |
9
              OSCCTRL_XOSCCTRL_XTALEN |
10
              OSCCTRL_XOSCCTRL_ENABLE;
11
12
  while((REG_OSCCTRL_STATUS & OSCCTRL_STATUS_XOSCRDY) == 0);
13
14
  /* configure the PLL, source = XOSC, pre-scaler = 8, multiply by 24 -> 48MHz clock from 16MHz input */
15
  REG_OSCCTRL_DPLLCTRLB = OSCCTRL_DPLLCTRLB_DIV(3) | OSCCTRL_DPLLCTRLB_REFCLK(1); // setup PLL to use XOSC input
16
  REG_OSCCTRL_DPLLRATIO = OSCCTRL_DPLLRATIO_LDRFRAC(0x0) | OSCCTRL_DPLLRATIO_LDR(23);
17
  REG_OSCCTRL_DPLLCTRLA = OSCCTRL_DPLLCTRLA_RUNSTDBY | OSCCTRL_DPLLCTRLA_ENABLE;
18
  while((REG_OSCCTRL_DPLLSTATUS & OSCCTRL_DPLLSTATUS_CLKRDY) != 0); // wait for the pll to be ready
19
20
  REG_GCLK_GENCTRL0 = GCLK_GENCTRL_DIV(0) |
21
            GCLK_GENCTRL_RUNSTDBY |
22
            GCLK_GENCTRL_GENEN |
23
            //GCLK_GENCTRL_SRC_XOSC |
24
            GCLK_GENCTRL_SRC_DPLL96M |
25
            GCLK_GENCTRL_IDC ;
26
27
  while((REG_GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL0) != 0);  /* wait for the synchronization between clock domain to be complete */
28
29
  REG_OSCCTRL_OSC48MDIV = OSCCTRL_OSC48MDIV_DIV(0);  // set 48MHz Oscillator to 48MHz ouput
30
31
  REG_GCLK_GENCTRL1 = GCLK_GENCTRL_DIV(0) |
32
            GCLK_GENCTRL_RUNSTDBY |
33
            GCLK_GENCTRL_GENEN |
34
            GCLK_GENCTRL_SRC_OSC48M |
35
            //    GCLK_GENCTRL_SRC_DPLL96M |
36
            GCLK_GENCTRL_IDC ;
37
38
  while((REG_GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL1) != 0);  // wait for the synchronization between clock domains is complete
39
}

Wobei ich GLCK1 nur für einen Timer benutze mit dem ich ein schlichtes 
Profiling mache.


Da ich noch ein Adafruit Trinket M0 irgendwo herumfliegen habe,
habe ich mal mit dem etwas herumgespielt:
Beitrag "Bare-Metal ATSAM"

Das Board hat nur keinen SWD, also habe ich im Arduino Framework 
angesetzt um per direktem Register-Zugriff den SPI zu benutzen, im 
zweiten Ansatz dann per DMA.

Hat nur irgendwie niemanden interessiert, auch wenn man Beispiele dazu 
praktisch nicht finden kann.


Jetzt habe ich nur gerade keinen LA hier, sonst würde ich mir mal den 
SPI am C21 im DMA ansehen wie es da mit Pausen zwischen den Bytes 
aussieht.
Allerdings, Hardware-Controlled Chip-Select benutze ich schon mal nicht, 
ich meine das geht gar nicht für eine größere Anzahl Bytes am Stück.
Und mit den Display könnte ich bis 4k am Stück schicken.

Mit dem E51 habe ich mich auch beschäftigt, benötigt habe ich den bisher 
aber nicht wirklich und so habe ich für den zum Beispiel DMA nicht 
implementiert.


Mit XMegas habe ich dabei keine Erfahrung, es gibt keine XMegas mit CAN.
Und da hier gerne sehr schnell und lautstark missioniert wird, es gibt 
auch keine Automotive STM32 mit CAN-FD.

von Marco H. (damarco)


Lesenswert?

Eben das hat auch seine Gründe, durch den NVM Controller und das dieser 
keinen ROM Bootloader besitzt enden die ersten Versuche meist im Frust.

Es sind einfach zu viele Stolperfallen eingebaut, so das keine Freude 
aufkommt.

z.Bsp ließe sich deine Clock Funktion nicht erfolgreich umsetzen wenn 
der watchdoog aktiv ist. Der Code hängt sich in der schleife auf :(...

"Das Board hat nur keinen SWD, also habe ich im Arduino Framework
angesetzt" und damit allerhand code hinzugefügt.

Hast du ein Clock das der SAMBA bootloader den NVM u. Clock wieder 
zurecht biegt. Denn du kannst beim SAMD ganz schnell eine Bruchlandung 
machen ;)

von Rudolph R. (rudolph)


Lesenswert?

Naja, der Watchdog ist ja erstmal nicht an, so ab Werk, und die 
Schleifen sind ja mehr so pro-forma, mehr als ein paar Takte kann die 
Synchronisierung nicht dauern. :-)

Die gleiche Initialisierung habe ich natürlich nicht mit dem Trinket-M0 
probiert, da hatte ich ja den Luxus, dass das der Arduino Core das schon 
macht und ich direkt und nur den SPI benutzen konnte.
Den Clock für die SERCOM habe ich mir aus GCLK0 geholt.
Wenn ich bei dem Ding einen Timer benutzen wollen würde, dann würde ich 
erstmal nachsehen, welcher Timer nicht für Arduino benutzt wird und 
hoffentlich benutzt der Core auch nur Systick.

Um mal eben was auszuprobieren oder wenn man keinen Bock hat Drähte an 
winzige Testpads zu löten...

von Rudolph R. (rudolph)


Angehängte Dateien:

Lesenswert?

Hallo,

hier noch mal ein paar Bilder zum SPI, von wegen nahtlos und so.

Das erste Bild ist eine Übertragung "von Hand", also die sechs Bytes 
nacheinander in das Daten-Register geworfen.

Die anderen Bilder sind wie die Namen schon sagen von einer SPI 
Übertragung per DMA.
Echte Pausen sind da nicht zwischen den Bytes.

Das ist jetzt mit dem CS unter Software-Controlle.

Die Abtastung ist nicht ganz sauber, das ist ein Original Logik 16, der 
kann nur bis 50MHz.
Der SPI läuft aber mit 12MHz, ich hatte nur keine Lust jetzt extra noch 
für die Bilder die Software anzupassen.

von Alexxx (Gast)


Lesenswert?

@ Rudolph R.
Vielen Dank für die Oszillogramme!
Warum aber bei DMA-Betrieb manche Clockpulse kürzer sind als die 
anderen???
Bei meiner Anwendung brauche ich einen absolut gleichbleibenden, 
"nahtlosen" Clock. Zur Not muss ich einen Clock ausgeben und die SPI im 
Slave-Modus betreiben.

Hat schon mal jemand die FDPLL96M des SamD21 benutzt?
Ich blicke da bei den Registern und vor Allem bei den IDs des 
GCLK-Moduls
noch nicht durch.
Ich möchte mit 16MHz reinfahren, durch 8 Teilen und mit der FDPLL96M
auf 48MHz hoch. Das soll dann auf GCLKGEN0 rauskommen...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Er hat doch geschrieben, dass er an der Auflösungsgrenze seines 
LogicAnalyzer ist. Dann sieht man solch krassen Jitter.

Die IDs sind die Peripheral IDs.
Bei den Beschreibungen dieser Peripherie im DB staht dann auch drinne 
welche ID die jeweilige besitzt.

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.