Forum: Mikrocontroller und Digitale Elektronik DMA: Burst Size und Transfer Width Einstellungen


von Lars (Gast)


Lesenswert?

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

von Lars (Gast)


Lesenswert?

jmd ne idee oder ein Dokument in dem das ganze anschaulich erklärt wird?

von Falk B. (falk)


Lesenswert?

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

von Lars (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Lars (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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

von Lars (Gast)


Lesenswert?

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