Hallo. Ich verwende einen STM32F765VIH6 und empfange über SPI als Slave einen "Stream" von 15 x 16Bit mit einer Baudrate von ca. 3MHz. Diese 15 Words werden alle 230us wiederholt. Die Words hole ich per Interrupt ab. Das Abholen des Words im Interrupts benötigt ca. 300ns. Leider gehen mir immer wieder mal einzelne Words verloren. Von 10Mio. Words gehen 10-15 Words verloren. Wenn ich es richtig sehe, wird dann das OVR Flag gesetzt. Dies würde zwar Erklären, dass die Hardware den Buffer verwirft. Allerdings verstehe ich nicht warum OVR auftritt. Der INT hat die höchste Priorität, hab die Baudrate von 5MHz bis auf 2.5MHz runtergesetzt und die Wartezeit zwischen den Words so angepasst, dass die Words (fast) gleichmäßig innerhalb der 230us verteilt sind. Hat alles nichts an der Häufigkeit des Fehlers geändert. Die Signale (MOSI,SCK,NSS) sehen per Oszi auch korrekt aus. Wenigstens in den Augenblicken, in denen ich messe. Auf Grund der geringen Fehlerhäufigkeit kann ich natürlich nicht sagen, ob dies auch im Fehlerfall so ist. Mir gehen gerade die Ideen aus, was es sein könnte. Kann mir jemand einen Tipp geben? Vielen Dank, Pepe.
Wie schnell wird der STM32F765VIH6 getaktet? Gibt es noch andere Interrupts auf Prio 0?
Takt ist 168MHz. Und hab sogar die System Interrupts der HAL testweise auf Prio 1 gelegt.
Ich kenne die ST32 nicht, aber aus dem Bauch heraus: überholen sich Interrupts ? Könnte hinter einem OverRun das Problem stecken, daß du eigentlich 2 davon hast. Paßt die Anzahl der ggf auch impliziten Disable Irq mit der Anzahl der Enable Irq überein. Muß man zu Beginn einer IRQ Prozedur die Flags sichern ? Kannst du genau ermitteln, wieviel Zeichen du verlierst und wieviel OVR du bekommst ? Müßte exakt übereinstimmen. Mario
Pepe schrieb: > Mir gehen gerade die Ideen aus, was es sein könnte. > > Kann mir jemand einen Tipp geben? Der Hardware Aufbau ist scheisse. Davon kommen Overruns, Underruns und ähnliche Schönheiten.
Natürlich könnten es auch die Signale sein. Nur kann ich bisher nichts sehen, was darauf hindeutet. Aber bei dieser Häufigkeit tue ich mich auch hart zum richtigen Augenblick was zu messen.
Pepe schrieb: > Aber bei dieser Häufigkeit tue ich mich > auch hart zum richtigen Augenblick was zu messen. warum? Setze einen GPIO auf High sobald Du das OVR-Flag siehst. Das Oszi dann mit diesem GPIO triggern. Den Triggerpunkt im Oszi ganz nach rechts setzen, dann siehst Du alles was vor dem Trigger auftritt. > Die Words hole ich per Interrupt ab. Was spricht gegen DMA? Dann bist Du von der IRQ-Geschwindigkeit und -Priorität unabhängig.
Gerd E. schrieb: >> Die Words hole ich per Interrupt ab. > > Was spricht gegen DMA? Dann bist Du von der IRQ-Geschwindigkeit und > -Priorität unabhängig. das ist bei diesen geschwindigkeiten das beste DMA interrupt nach 15 empfangenen werten reduziert deine ISR - Rate im System massiv
Pepe schrieb: > Wieso wird dadurch die ISR Rate reduziert? Weil Du jetzt nicht mehr bei jedem der 15 Words einen ISR bekommst, sondern nur noch einen, am Schluss wenn alle 15 Words vom DMA transferiert wurden.
@Gerd Hab Dich falsch verstanden. Sorry. Hatte es so verstanden, dass die Ausführung des DMA Interrupts nach 15 Werten langsamer wird. Und das hat für mich keinen Sinn ergeben ;-)
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.