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?
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
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.