Hallo, Ich weiß das SPI Empfang auch das Senden eines oder mehrerer Bytes erforderlich macht um den CLK zu bewegen. Das ist normalerweise auch nicht das Problem. In einer anderen Anwendung möchte ich aber ein paar KiloBytes empfangen und das natürlich per DMA SPI. Ich muss aber auch die CLK bereitstellen da der Slave dumm ist. Gibt es einen Modus der bei DMA SPI Empfang auch die Clocksignale bedient? Sinnlos DMA SPI senden ist ja auch nicht die Lösung bei so vielen Bytes. Belastet ja den Hauptspeicher. Finde da nicht wirklich etwas passendes außer Clk mit Timer generieren. Ich verwende einen STM32F205
Klaus schrieb: > Sinnlos DMA SPI senden ist ja auch nicht die Lösung bei so vielen Bytes. > Belastet ja den Hauptspeicher. Belastet wird der nicht ernsthaft, SPI hat IIRC einen minimalen Teiler von 2, also ein Byte alle 16 Takte lesen + schreiben. Außerdem kann man IMO den Sende-Kanal so einstellen, das er die Adresse nicht hochzählt und so immer dasselbe Dummy Byte (oder Wort) versendet. Es könnte allerdings sein dass das in der Peripherial Lib nicht vorgesehen ist und man die DMA Register zu Fuß programmieren muss.
Ist zwar möglich aber eben nicht sehr sinnvoll. Wenn man aus der Assembler Ära kommt will man ja Ressourcen sparen wo es geht. Ich dachte es gibt eine Art Abholmodus. Auch immer das selbe Byte lesen heißt ja jedes man Speicherzugriff.
>Ist zwar möglich aber eben nicht sehr sinnvoll. Bahnhof? > Wenn man aus der Assembler Ära kommt will man ja Ressourcen sparen wo es geht. Ein Sende-DMA spart Resourcen. >Ich dachte es gibt eine Art Abholmodus. Den gibt es beim einfachen SPI auch nicht. >Auch immer das selbe Byte lesen heißt ja jedes man Speicherzugriff. Scheiß doch drauf. Jim hat dir die optimale Lösung gezeigt. Du erkennst es nur nicht.
__Scheiß doch drauf. Jim hat dir die optimale Lösung gezeigt. Du erkennst es nur nicht. Eine tolle Antwort. Hab seine und meine vorher erklärte Lösung auch nie angezweifelt, sondern nach einem fortschrittlichen Abholmodus gefragt.
...auf den EINEN Speicherzugriff pro Byte per DMA kommt es nun wirklich nicht an. Das ist Größenordnungen effizienter als alles was Du "zu Fuß" programmieren würdest. Die Lösung (wie schon angedeutet) dürfte sein, den DMA so zu programmieren, dass er kontinuierlich immer wieder das selbe Dummy-Byte von der gleichen Speicherstelle sendet (also das Hochzählen der Adresse im DMA deaktivieren). Effizienter geht es nun wirklich nicht mehr.
Umgekehrt ist das auch nicht anders. Zwar kann man eigentlich auf das Empfangs-DMA verzichten, wenn man nur sendet. Nur hat man dann keinen Interrupt am Ende der Übertragung, um CS abzuschalten. Der vom DMA-Sendekanal kommt dafür zu früh. Der vom DMA-Empfangskanal jedoch kommt passend.
Zunächst. Es geht!! Konfiguriert man den SPI als Master und den 2Lines RX only Modus, und dann eben noch den DMA passiert genau das was ich erfragt hatte. Es werden CLKs ausgegeben und alles an Miso eingelesen. Speicherplatz und Zugriffe extra gibt es nicht. Man muss lediglich im DMA Fertig Interrupt die SPI oder den Pin Abschalten wenn man synchronisieren will (muss). Geht super. Ich wollte NICHTS zu Fuss programmieren, die Frage war das Gegenteil, wie man es am elegantesten löst. SPI war mir schon bekannt. ________________ Allgemein: Ich finde es einerseits lustig anderseits erstaund es mich immer wieder hier bei Mikrocontroller.net als Vollidiot dargestellt zu werden und blöde Antworten zu bekommen. Natürlich ist hier nur einer damit gemeint. 10 Sekunden deines kostbaren Lebens zu opfern muss echt schlimm sein. Wenn man nicht Antworten will LÄSST man es. Habs ja jetzt selber herausgefunden, wäre aber schön gewesen das etwas früher haben zu können. Danke an alle anderen.
Beitrag #5647319 wurde von einem Moderator gelöscht.
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.