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
@ 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.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.