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?
Hallo? Alle SamD21-Nutzer im Urlaub? Gibt es wo anderes ein aktiveres Forum?
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.
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.
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 ;)
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...
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.
@ 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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.



