Hallo, ich möchte gern auf meinem LPC eine Verbindung zu meinem Dataflash herstellen, welches über SSP (SPI) angeschlossen ist. Hierfür möchte ich gerne die DMA (M2P und P2M) verwenden. Bei den Einstellungen des DMA-Channels gibt es eine Burst Size und eine Transfer Width für die Source als auch die Destination. Nach welchen Kriterien wählt man hier die richtigen Einstellungen aus? Bei SPI dachte ich an 8Bit Transfer-Width, weil das DataReg immer 8Bit Nachrichten beinhalten kann. Bei der Burst Size muss ich gestehen, weiß ich leider nicht so recht was ich auswählen soll. Das SSP Interface besitzt einen FIFO von 8 Frames (8 Bytes ?). In einem Beispiel hab ich gesehen, dass hier eine Burst Size von 4 verwendet worden ist, aber warum? Beim Memory könnte man 32bit Transfer Width nehmen und die DMA selbst hat einen Buffer von 4 Frames. Welche Burst Size sollte man hier auswählen? Sind die Burst Size Einstellungen auch davon abhängig wieviele Datenbytes man überträgt? Z.B. möchte ich gern das Status-Register vom Dataflash zu Beginn auslesen - 1Byte wird zum Dataflash gesendet und zwei Bytes sollen zurückkommen. Ansonsten sind die Befehle fürs Dataflash zwischen 4 und 8 Bytes lang + die dazugehörigen Datenbytes (wenn man etwas in das Flash schreiben möchte)... Kann mir jmd von euch ein bißchen mehr zum Thema Burst Size etc. erhälen? Danke Lars
jmd ne idee oder ein Dokument in dem das ganze anschaulich erklärt wird?
@ Lars (Gast) >Transfer Width für die Source als auch die Destination. Nach welchen >Kriterien wählt man hier die richtigen Einstellungen aus? Nach denen der Peripherie, hier also das SPI. >Bei SPI dachte ich an 8Bit Transfer-Width, weil das DataReg immer 8Bit >Nachrichten beinhalten kann. Ist OK. Einige uC skönnen auch 16 BIT SPI Transfers, dann kann man halt 16 Bit Transfers machen. > Bei der Burst Size muss ich gestehen, weiß >ich leider nicht so recht was ich auswählen soll. Ist Geschmackssache bzw. hängt von verschiedenen Dingen ab. Während eines Burst gehört der Speicher nahezu ausschließlich dem DMA-Cntroller, andere DMA-Kanäle müssen warten, teilweise auch die CPU. Wie das GENAU bei DEINEM uC ist, weiß ich nicht, es gibt auch ARMs, da können CPU und mehrere DMA-Kanäle gleichzeitig arbeiten, wenn das rein logisch möglich ist und die Bus-Matrix das erlaubt. >besitzt einen FIFO von 8 Frames (8 Bytes ?). Siehe oben. Das können je nach Controller auch 8x16Bit sein. >In einem Beispiel hab ich >gesehen, dass hier eine Burst Size von 4 verwendet worden ist, aber >warum? Klingt OK. >Beim Memory könnte man 32bit Transfer Width nehmen und die DMA selbst >hat einen Buffer von 4 Frames. Welche Burst Size sollte man hier >auswählen? Maximal 4. >Sind die Burst Size Einstellungen auch davon abhängig wieviele >Datenbytes man überträgt? Eher nicht. >Z.B. möchte ich gern das Status-Register vom >Dataflash zu Beginn auslesen - 1Byte wird zum Dataflash gesendet und >zwei Bytes sollen zurückkommen. Das macht man eher ohne DMA, denn hier lohnt sich das nicht. DMA bringt nur was bei großen Datenblöcken.
Falk Brunner schrieb: > Das macht man eher ohne DMA, denn hier lohnt sich das nicht. DMA > bringt nur was bei großen Datenblöcken. Das ist richtig, wollte lediglich mit einem einfachen Beispiel anfangen. Anschließend sollen entsprechend viele Bytes mittels DMA im Dataflash gespeichert werden. Vielen Dank für deine Antworten. Eine Frage hab ich noch: Der normale Ablauf beim Dataflash ist ja, dass man einen Command (z.B. Schreiben oder LEsen) hinschickt und anschließend entweder Daten ins Flash schreibt oder vom Flash erhält. Die DMA selbst transferiert die Daten nur zwischen Peripherie und Speicher. Ist z.B. der Transfer des Commands ("lesen") abgeschlossen erhalte ich einen DMA Interrupt. Allerdings bedeutet das ja noch nicht, dass auch alle Daten per SPI übertragen worden sind. Muss ich daher in der DMA Interrupt-Routine pollen bis der TRansfer vom SPI abgeschlossen worden ist und anschließend den FIFO vom SPI clearen, damit ich beim Receiven der DAten vom Flash nicht zuerst noch Daten aus dem FIFO vom Transmitten erhalte? Hab schon überlegt ob es nicht intelligenter ist, den Interrupt vom SSP Interface zu verwenden - allerdings besitzt das leider keinen "Transfer-Complete" Interrupt. Mein Prozessor ist der LPC1758 und ich verwende das SSP Interface.
@ Lars (Gast) >erhalte ich einen DMA Interrupt. Allerdings bedeutet das ja noch nicht, >dass auch alle Daten per SPI übertragen worden sind. Muss ich daher in >der DMA Interrupt-Routine pollen bis der TRansfer vom SPI abgeschlossen Kann sein, so genau weiß ich das nicht. GGF. gibt es aber einen "intelligenten" Interrupt, der anzeigt, dass der SPI wirklich alle Daten transferiert hat.
Das Zusammenspiel mit Dataflash und DMA scheint nicht zu funktionieren. Die DMA schickt zwar die Bytes richtig nacheinander raus, aber der Flash antwortet nicht entsprechend. Wenn ich die Kommunikation ohne DMA erstelle, dann sieht diese auch anders aus. Nach jedem Byte, welches übertragen worden ist, muss das Busy-Bit gepollt werden. -> die Clock ist nicht kontinuierlich sondern nach jeweils 8 Cycles hat man einen kurzen Break von 2µs oder so. Das wird bei der DMA nicht automatisch gemacht; hier läuft die Clock kontinuierlich ohne Unterbrechung durch. Hat jmd hierzu noch eine Idee wie ich das trotzdem mit der DMA installieren kann?
@ Lars (Gast) >Nach jedem Byte, welches übertragen worden ist, muss das Busy-Bit >gepollt werden. Das wäre mir neu. Normalerweise schreibt man den Schreibpuffer in einem Rutsch voll und startet dann den Schreibvorgang.
Falk Brunner schrieb: > Das wäre mir neu. Normalerweise schreibt man den Schreibpuffer in einem > Rutsch voll und startet dann den Schreibvorgang. hab es jetzt hinbekommen, lediglich im receive-dma-channel hab ich zu Beginn immer 0xFF Bytes stehen. Die Anzahl der 0xFF Bytes korrespondiert mit der Command-Länge, die man zum Auslesen eines Speicherbereichs an das Dataflash senden muss. Sprich, wenn ich 0xD7 (Read Status Register) per DMA an das Flash sende, erhalte ich 0xFF 0xBD 0x88 (die letzten beiden Bytes entsprechen dem Status Register). Das werde ich wahrscheinlich auch nicht wegbekommen, weil nur beim DMA-Channel M2P das SSP Interface Clocksignale erzeugt. Beim DMA-Channel P2M passiert nichts, es werden lediglich die Bytes vom SSP DataReg in den internen RAM Speicher vom Prozessor geschrieben.
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.