Hallo, ich möchte mit einem SAM L21 (ATSAML21J19B) einen SPI Slave mit DMA aufbauen. DMA soll genutzt werden, um einen RAM-Puffer von einigen hundert Byte am SPI-Port zur Verfügung zu stellen. Dazu konfiguriere ich den SPI Slave Port, und einen DMA-Kanal, der als Trigger den TX Trigger des SERCOM SPI verwendet. Ich verwende Atmel ASF 3.48.0. Hintergrund meiner Applikation: Ich generiere ein Signal für WS2812B LEDs. Mit einem Timer generiere ich mit zwei Compare Matches die möglichen PWM-Duty Cycles für 1-bits und 0-bits. Mit dem SERCOM SPI serialisiere ich einen Framebuffer, wofür ich als SCK die 1-bits des Timers verwende. Dann nehme ich eine CCL LUT mit den drei Eingängen SPI:MISO und den zwei PWMs, um je nach MISO-Pegel entweder die 1-bits oder die 0-bits zu selektieren. Am Ausgang der CCL kommt also direkt ein WS2812-kompatibler Stream an und das ganze mit 0% MCU-Last. Der genannte Timer generiert beim Overflow ein Event (also jeweils eines pro Bit am WS2812). Diese Events zähle ich mit einem zweiten Timer und generiere mit einer PWM ein Envelope, um mit einer zweiten CCL das Paketende des WS2812 Streams, also eine kurze Pause nach der gewünschten Anzahl LEDs, zu generieren. Das Problem: Der DMA-Mechanismus triggert auf dem SAM L21 seine Beats nach keinem erkennbaren Muster. Dementsprechend wird eine Zeit lang immer dasselbe Byte ausgegeben, dann welchselt es gelegentlich mal. Das Kuriose: Der identische Code, compiliert für einen AT SAM C21 und auf einem "Sammy C21" (ATSAMC21G18A) geflasht, funktioniert einwandfrei und gibt mir genau mein gewünschtes Signal aus. So wie ich das Datenblatt lese, funktionieren die SERCOMs und DMA-Kanäle auf SAMC und SAML gleich, oder habe ich da etwas verpasst? ==> Bug im Silizium? Im entsprechenden Errata von Microchip zum SAM L21 habe ich nichts passendes gefunden. Testweise generiere ich mit dem DMA-Kanal Events bei jedem Beat und lasse mir das Event an einem Port ausgeben. Ergebnis: Auf dem SAM C21 kommt schön bei jedem Bit des SPI ein DMA-Beat. Der gleiche Code auf dem SAM L21 zeigt mir ein DMA-Beat nach den ersten ca. 15 bit im Paket (mal 10, mal 18) und dann mal so 1-2 Beats nach einem Block. Siehe Bilder im Anhang. Hat jemand eine Idee, was da kaputt ist? Ich kann gerne mein Beispielprojekt hochladen, falls jemand eine Idee hat und ein Codebeispiel sehen möchte. Danke für jegliche Hinweise & Gruß Thomas EDIT: Ich bin auf den Trichter gekommen, dass man beim SAM L21 das Register "receiver enable" vom SPI setzen muss, um einen TX DMA Trigger zu bekommen. Ist der Empfänger aus, kriegt man nur TX Trigger auf das Prefetch, also wenn man Slave Select hochzieht. Das sieht mir nicht nach geplantem Verhalten aus, beim C21 funktioniert es auch mit einem SPI-Kanal, bei dem nur der Transmitter an ist - den Receiver braucht man ja dazu nicht. Aber ich kann damit leben, frisst mir doch der Receiver kein Brot, wenn er an ist. Ist eine netzbetriebene Schaltung, bei der es mir auf die paar Mikroampere nicht ankommt.
:
Bearbeitet durch User
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.