Timing Probleme durch Interrupts mit SD Karte

Gast #4602958
Lesenswert?

Hallo,

ich betreibe eine SD-Karte im SPI-Mode erfolgreich an einem 
STM32F101C8T6. Das funktioniert auch alles einwandfrei, solange nicht 
während des Lesens oder Schreibens ein Timer-Interrupt dazwischenfunkt 
und scheinbar die Kommunikation kurzfristig unterbricht, sodass ich 
teilweise nur noch Schrott-Antworten von der Karte bekomme (2GB Hama SD 
Karte).

Weiss jemand, ob es bestimmte Stellen im Kommunikationsablauf gibt, an 
denen ich keine kleine Pause in der Kommunikation mit der SD-Karte 
machen darf, damit die Karte noch mit sinnvollen Daten antwortet? Ich 
würde ungern während des gesamten Lese- oder Schreibvorgangs alle 
anderen Interrupts abschalten.

Vielen Dank.
Gast #4602963
Lesenswert?

>Weiss jemand, ob es bestimmte Stellen im Kommunikationsablauf gibt, an
>denen ich keine kleine Pause in der Kommunikation mit der SD-Karte
>machen darf,

Es ist der Karte egal wie lang die Pausen durch Interrupts sind.
Gast #4602969
Lesenswert?

hmm, das hatte ich mir schon so gedacht.

Dann verstehe ich nicht, wieso die Karte einwandfrei funktioniert, wenn 
ich den Timer-Interrupt abschalte, während ich einen Block lese. Ich 
werde das nochmal genauer analysieren, was in den Pausen passiert.

Danke für die Antwort schonmal.
Gast #4602976
Lesenswert?

Ich hab das jetzt nochmal getestet, um die Einfluss der Aktionen im 
Interrupt auszuschließen: Ich habe im Timer3 Interrupt (welcher mit 
720Hz) aufgerufen wird, mal nur eine Sinnlos-Schleife von 1 bis 1000 
eingebaut, um Zeit zu verbraten. Sobald dieser Interrupt aktiv ist, 
während die Karte gelesen wird, kommen oft Schrott antworten zurück. Das 
SD-Karte Lesen passiert im Main-Loop, d.h., es kann jederzeit 
unterbrochen werden. Scheinbar ist es der Karte doch nicht egal, wann 
sie während der Kommunikation unterbrochen wird?
Gast #4602991
Lesenswert?

Da musst du schon konkreter werden und dein Problem genauer schildern.

In diversen STM32F103-Systemen bei mir laufen etliche Interrupts. Die 
Kommunikation Controller <-> Karte wird dabei nie gestört.
Gast #4603002
Lesenswert?

Nur so ein Gedanke:
Der MOSI-Ausgang des Controllers bleibt auch während des Lesens auf 
festem Potential? Nicht das der zeitweise hochohmig ist und in längeren 
Pausen undefiniertes Potential annimmt!
Gast #4603016
Lesenswert?

Heiko schrieb:

> Scheinbar ist es der Karte doch nicht egal, wann
> sie während der Kommunikation unterbrochen wird?

Wenn es so wäre (was prinzipiell natürlich nicht ausgeschlossen werden 
kann), dann wäre sie schlicht und einfach kaputt.

Ich würde es aber doch für sehr viel wahrscheinlicher halten, dass du in 
deinem Code einen Bug hast, denn ein sich so wie beschrieben äussernder 
Defekt einer SD-Karte wäre sehr, sehr aussergewöhnlich.

Hmm, Moment... Auch denkbar: Nicht die Karte selber ist kaputt, sondern 
deine Hardware zu deren Anbindung. Eine Unterbrechung der Taktleitung 
z.B. könnte durchaus diesen Effekt bewirken.
#4603062
Lesenswert?

@ S. Landolt (Gast)

>Ich arbeite zwar nur mit AVR8, aber in den sieben Jahren, in denen ich
>SDCs per SPI dranhängen habe, konnte ich ein solches Verhalten noch nie
>beobachten.

Ich schon. Wenn man sich mit dem FIFO des UARTs im SPI-Modus ins Knie 
schießt!

Beitrag "Re: Problem mit Micro-SD-Karte"

Möglicherweise hat der OP ein ähnliches Problem. Die SD-Karte an sich 
arbeites sowohl auf Bytes- als auch Kommandoebene voll synchron und 
erwartet nur MINDEST-Wartezeiten zwischen bestimmten Befehlen, aber 
keine Mindest-Reaktionszeiten. Sprich, man kann die Kommunikation 
beliebig langsam machen.
#4603508
Lesenswert?

Heiko schrieb:
> Ich habe im Timer3 Interrupt (welcher mit
> 720Hz) aufgerufen wird, mal nur eine Sinnlos-Schleife von 1 bis 1000
> eingebaut, um Zeit zu verbraten.

Das ist ja kaum Zeit, wenn der Compiler es nicht sogar ganz 
wegoptimiert.
Ich vermute mal, da ist ein Bug in Deiner SPI-Lib, daß irgendeine 
Reihenfolge nicht eingehalten wird.
Es könnte auch sein, Deine Lib enthält knappe Timeouts, die bei der 
kleinsten Unterbrecheung überschritten werden.
Man könnte noch viel mehr spekulieren, da ja niemand Details kennt.
#4603639
Lesenswert?

Hmm ein Interrupt wird sich nicht auf die Spi Übertragung an sich 
auswirken. Da Spi ja Hardwareseitig realisiert ist. Das byte was im Tx 
Buffer liegt wird ohne Unterbrechung rausgeschoben.

Schon mal auf die Spi Flags geschaut?  Ewt. Ist deine Spi Routine auch 
fehlerhaft. Ohne Code wird das etwas schwierig.

Mögliche Fehler wären den Rx buffer nicht zu prüfen. Denn wenn der von 
der isr zurück kehrt ist der rx buffer voll.

Wie behebt sich denn das Problem? Muss die Karte wieder im spi Mode 
gebracht werden?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren