Hallo, ich benutze im dsPIC33 das ECAN-Modul mit DMA. Wenn eine CAN-Message empfangen wird, wird sie vom DMA-Controller automatisch in den Messagepuffer (im DMA-RAM) geschrieben. Wenn ich mit der CPU diesen Messagepuffer auslese, während gerade eine neue Message kommt, kann es passieren, daß ich inkonstistente Daten bekomme (einige Bytes der alten Message und einige Bytes der neuen Message). Bei einem interrupt-gesteuerten System wäre die Sache klar: Lesen nur unter Interruptsperre! Aber wie mach ich das hier mit dem DMA-Controller? Den DMA-Kanal kann ich nicht sperren/abschalten, weil dieser ja auch noch andere CAN-Messages empfangen können muß. Ideen? Danke!
Hi, das selbe Problem hatte ich im UART. Ich hab es folgendermaßen gelöst: Wenn der DMA-Interrupt kommt schreibe ich den empfangenen Inhalt des DMA-Buffers in einen UART-Receive-Buffer (Ringbuffer). Auf diesen habe ich wiederum einen Lese- und einen Schreibpointer, sodass ich immer ganz genau weiß, welche Daten ich quasi frisch empfangen habe und auch noch nicht bearbeitet habe. Die Länge der im DMA-Interrupt zu sicherndnen Dadten vom DMA-Buffer in den UART-RX-Buffer entspticht ja jeweils genau wieder dem DMAxCNT Register + 1. Ich hoffe es war einigermaßen verständlich. Kann dir auch Code zeigen wenn du willst.
Oder gleich den eingebauten DMA FIFO Buffer des ECAN-Moduls verwenden... Beste Grüße!
Hallo, hab gerade herausgefunden: beim ECAN ist die Lösung trivial: Wenn vom ECAN eine neue Message in einen Rx-Puffer geschrieben wird, wird das "Buffer Full"-Flag gesetzt. Solange dieses gesetzt ist, wird der Rx-Puffer nicht überschrieben (weitere Message werden verworfen, sofern nicht ein anderer Rx-Puffer für die gleiche CAN-ID konfiguriert ist). D.h. ich kann mit der CPU in aller Ruhe den Rx-Puffer lesen und muß dann das "Buffer Full"-Flag am Ende löschen. Grüße
Mal das Datenblatt vom DMA gelesen? Würde sagen der Ping-Pong-Mode wird dein Problem lösen können :) So ichs denn korrekt verstanden habe.
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.