mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 und SPI - DMA Handling


Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich betreibe einen STM32 mit 72Mhz. Dieser hat unter anderem die Aufgabe 
eine ADS1178 (16-Bit ADC) über SPI auszulesen. Dieser IC hat ein "Data 
Ready" Pin Ausgang, der eine fallende Flanke bei einen neuen Messwert 
ausgibt. In dem uC wird daraufhin ein Interrupt ausgelöst, der eine 
Rouitine ausführt, in der Berechnungen mit den Werten durchgeführt wird.
Außerdem gibt es noch einen Interrupt für den DMA, wo das SPI-Signal 
(ADC-Werte) in eine Struktur eingelesen werden.
Der Bus wird mit 9Mhz betrieben und der ADC hat eine Abtastrate von ca 
35KSPS.
Nun kommt es leider vor, dass scheinbar "zufällig" Werte verloren gehen 
oder "falsch" ausgelesen werden.
Das ganze System läuft zudem unter FreeRTOS, welches "nebenbei" noch 
andere Routinen ausführt, die aber geblockt werden, wenn dieser 
Interrupt für einen neuen Messwert ausgelöst wird.
Ich könnte auch denn Source mal reinstellen, um mehr Klarheit zu 
verschaffen :-)
Deswegen mein Anliegen an euch, hat jemand von Euch Erfahrung im 
Auslesen des SPI Buses mittels DMA.

Viele Grüße
Stephan

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der FW-Lib von STM (V3.2.0) gibt es ein Demo wie man SPI in das RAM 
bekommt mit dem DMA.

Siehe hier STM32.

Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus,

ich habe das "DMA1 Channel2 transfer complete flag" mit eingebaut und es 
ist scheinbar Besserung in Sicht! Am Montag werde ich es nochmal genauer 
unter die Lupe nehmen ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man mit SPI per DMA arbeitet, dann muss man darauf achten, dass der 
Transfer erst beendet ist, wenn das letzte Byte/Wort davon empfangen 
wurde. Wenn man CS deaktiviert sobald Tx-DMA durch ist, dann hat man 
verloren, weil noch Daten im SPI Puffer sein können.

NB: Das bedeutet, dass man auch dann, wenn nur Daten gesendet werden, 
mit Rx-DMA arbeiten sollte, weil man nur so einen sinnvollen 
Abschluss-Interrupt bekommt, um CS abzuschalten. Notfalls mit einem 
Dummy-Puffer ohne Adressinkrement.

PS: Deine Problembeschreibung suggeriert, dass du erst mit den 
ADC-Werten rechnest und sie danach einliest. Merkwürdige Reihenfolge 
;-). Eine etwas systematischere Beschreibung könnte helfen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was zu DMA allgemein: Wenn man DMA bzw. DMA-Steuerung und Zugriff 
auf das davon verwendete RAM sehr zeitnah oder gar gleichzeitig 
verwendet, dann sollte man sich vorsichtshalber mal die memory barrier 
Befehle ansehen.

Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo A.K.,
danke erstmal für deine Kommentare!

Es gibt 2 Interrupt-Routinen, die eine liest mittels DMA den SPI Buffer 
aus, in dem auch die ADC Werte eingelesen werden und die andere wird von 
einem externen Signal ausgelöst, wo die Werte in einen Ringpuffer 
geschrieben, aufsummiert und ausgewertet werden.
Ich denke die Reinfolge ist in Ordnung. Alles weitere kann ich nur am 
Montag wieder testen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Code oder präzise Schilderung bleibt mir das immer noch weitgehend 
unverständlich, denn die 99%, die in deinem Kopf aber nicht im Posting 
stehen, kennst nur du. Insofern können meine Kommentare nur allgemeines 
Gewäscht sein, nicht direkt auf das Problem bezogen.

Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Code nicht zur Hand, da ich im Studienpraxissemester bin
und das Teil einer Aufgabe in meinen Betrieb ist.
Schau doch bitte nochmal Montag ins Forum, dann poste ich den Code 
mal...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.