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!
Master/Slave Zuordnung umkehren. AVRs sind keine guten SPI-Slaves, als Master sind sie besser. Der STM32 hat dank DMA damit weniger Probleme.
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?
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.
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
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.