Forum: Mikrocontroller und Digitale Elektronik STM32 - DMA - Bei SPI lücken zwischen zwei Bytes


von Johannes N. (strangeman)


Lesenswert?

Hallo!

Ich habe hier ein Core32 Modul vom MIDIBOX-Projekt liegen. Auf dem Ding 
ist ein STM32F103xx@72MHz drauf und ich habe eine Frage zum DMA.

Folgender Hintergrund: Ich habe ein zweites Board mit einem ATmega48 
@20MHz drauf, der von 12 8-channel-ADCs Werte liest. Die Daten (144 
Bytes) soll er dann alle 1ms per SPI an den STM32 übermitteln. Der STM32 
ist dabei der Master. Um die 1ms refresh-rate einzuhalten bin ich auf 
Clock-raten um die 440ns festgelegt. Leider ist die ISR meines Megas mit 
ihren wenigen Takten immernoch zu lang, um rechtzeitig den Puffer 
aufzufüllen. Also müsste der STM32 irgendwie Lücken zwischen zwei Bytes 
machen, damit die ISR genug Zeit hat. Ich habe im Datenblatt gestöbert, 
aber ich kann nichts dergleichen finden. Das Problem tritt doch bei mir 
sicehr nicht zum ersten Mal auf, oder?!

Wie kann man sowas Lösen? Kann man den DMA irgendwie passend 
konfigurieren? Oder die ISR weiter beschleunigen?

Johannes Neumann

PS: Wenn ich im STM32 keinen DMA verwende, dann kann ich natürlich 
wartezeiten einbauen und die Bytes der Reihe nach auslesen. Aber Hilfe, 
dann hab ich fast keine Rechenzeit mehr für all das, was ich mit den 
Daten noch erledigen will!
von (prx) A. K. (prx)


Lesenswert?

Master/Slave Zuordnung umkehren. AVRs sind keine guten SPI-Slaves, als 
Master sind sie besser. Der STM32 hat dank DMA damit weniger Probleme.
von Johannes N. (strangeman)


Lesenswert?

Eigentlich eine gute Idee, ich frage mich, warum ich da nicht eher drauf 
gekommen bin...

danke, das geht natürlich.

Aber nur aus Interesse: Es stimmt also, dass solch eine Funktionalität 
nicht vorgesehen ist?
von (prx) A. K. (prx)


Lesenswert?

Johannes Neumann schrieb:

> Aber nur aus Interesse: Es stimmt also, dass solch eine Funktionalität
> nicht vorgesehen ist?

Ich kenne keinen Weg. SPI ist in erster Linie für zur Anbindung von 
Peripherie konzipiert, nicht für Multiprozessor-Kommunikation.
von Peter D. (peda)


Lesenswert?

Johannes Neumann schrieb:
> Das Problem tritt doch bei mir
> sicehr nicht zum ersten Mal auf, oder?!

Stimmt.
Die AVRs sind als SPI-Slave völlig unbrauchbar, da ungepuffert.


Peter
von Ulrich (Firma: DC3AX) (uprinz)


Lesenswert?

Der STM322 hat dazu keine Möglichkeit. Du könntest lediglich einen 1ms 
Timer aufziehen, der dann immer dasn nächste Byte aus einem Puffer 
sendet.
Der STM32 hat damit immer noch genug Rechenzeit übrig für alles andere.
Da man normalerweise den SysTick Timer mit 1ms fährt, kann man den SPI 
Master auch daran koppeln.

Aber es ist immer sinnvoll eine Kette auf ihr schwächstes Glied 
abzustimmen. Daher ist die Idee, den AVR zum Master zu machen sicherlich 
die sinnvollere.

Gruß
Ulrich
von Roland H. (batchman)


Lesenswert?

> Ich habe hier ein Core32 Modul vom MIDIBOX-Projekt liegen. Auf dem Ding
> ist ein STM32F103xx@72MHz drauf und ich habe eine Frage zum DMA.
>
> Folgender Hintergrund: Ich habe ein zweites Board mit einem ATmega48
> @20MHz

Könnte der stm32 nicht auch gleich das ADC selbst machen?

Falls nicht, warum dann nicht auf dem zweiten Board auch einen stm32f103 
mit 72 MHz? Wenn es jetzt schon eng in der ISR zugeht.
von Johannes N. (strangeman)


Lesenswert?

Roland H. schrieb:
> Könnte der stm32 nicht auch gleich das ADC selbst machen?
>
> Falls nicht, warum dann nicht auf dem zweiten Board auch einen stm32f103
> mit 72 MHz? Wenn es jetzt schon eng in der ISR zugeht.

Die PCBs waren schon da, jetzt nochmal neue herstellen zu lassen (geht 
nicht mehr zu hause, zu eng, zu viele vias) ist einfach zu teuer. 
Immerhin sind da 12 Wandler-ICs drauf.

Das Auslesen der ADCs vom STM32 zu machen, das geht von daher nicht, 
weil ich nicht genug Pins frei habe, um alle Wandler an einer Art 
"gemeinsamen, parallelen SPI" zu betreiben. Soll heißen MOSI, SCK und 
Enable gehen an alle ADC chips, aber die MISOs kommen getrennt zurück. 
So mache ich es jetzt mit dem AVR. Geht gut.
Daisy-Chaining ála Schieberegister geht bei den Wandlern leider nicht. 
Daher die Entscheidung mit dem Slave-Board.

Ich versuche mich jetzt erstmal an der AVR->Master Version. Das klingt 
vielversprechend und sollte mein Problem eigentlich perfekt lösen.

Johannes Neumann
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.