Forum: Mikrocontroller und Digitale Elektronik Microchip AT SAML21: SPI Slave mit DMA - TX Trigger funktioniert nicht


von Thomas S. (schlot)



Lesenswert?

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
Noch kein Account? Hier anmelden.