Forum: Mikrocontroller und Digitale Elektronik Lesezugriff auf SD-Karte unterbrechen (über SPI)


von Matthias (Gast)


Lesenswert?

Hallo zusammen

Ich lese via (Hardware-)SPI Daten von einer SD-Karte. Das Lesen erfolgt 
im Hauptprogramm in einem ATmega32. Zusätzlich möchte ich jetzt in einer 
Interrupt-Routine Daten an ein anderes IC über den selben SPI senden.

Deshalb folgende Frage:

Ist es möglich, die Kommunikation mit der SD-Karte (durch ein HIGH-Pegel 
auf CS) zu einem beliebigen, nicht vorhersehbaren Zeitpunkt zu 
unterbrechen?
Kann der Lesevorgang nachher an der selben Stelle fortgesetzt werden?

Beim Schreiben scheint das offenbar nicht zu gehen, siehe:
Beitrag "SD-Karte: kann ich einen Schreibzugriff unterbrechen?"
aber wie ist's beim Lesen?

Ich verwende übrigens zur Ansteuerung die Lib von Ulrich Radig:
Beitrag "SourceCode MMC die Zweite"

Software-SPI ist aus Performance-Gründen keine Option.

Im Voraus Danke für alle Antworten.

von Benedikt K. (benedikt)


Lesenswert?

Sobald man CS\ der Karte deaktiviert, muss man nochmal von vorne mit dem 
Sektor anfangen.

Falls der Speicher nicht allzugroß sein muss, dann gibt es für diesen 
Zweck spezielle Flash EPROMs (z.B. M25Pxx) die einen Hold Eingang haben. 
Solange Hold aktiv ist, kann man zu einem beliebigen Zeitpunkt (sogar 
mitten in einem Byte) unterbrechen und etwas anderes über den Bus 
schicken.

von Matthias (Gast)


Lesenswert?

Danke für die klare Antwort:

>Sobald man CS\ der Karte deaktiviert, muss man nochmal von vorne mit dem
>Sektor anfangen.

Das ist leider nicht möglich, da die Datenrate sowieso schon ziemlich 
knapp ist.

Die Lösung mit diesem "Flash-Buffer" (falls man so sagen darf) tönt 
interessant. Gibt dazu irgendwo genauere Informationen?

von Benedikt K. (benedikt)


Lesenswert?

Matthias wrote:
> Die Lösung mit diesem "Flash-Buffer" (falls man so sagen darf) tönt
> interessant. Gibt dazu irgendwo genauere Informationen?

http://www.st.com/stonline/books/pdf/docs/7737.pdf

von Matthias (Gast)


Lesenswert?

Hab mir das Datenblatt mal kurz angesehen, wirklich gut dokumentiert. 
Allerdings zweifle ich daran, ob der Flash einen dauernden 
Schreibzugriff lange übersteht.

Gibt's vielleicht was vergleichbares mit SRAM statt Flash?

Ein anderer Ansatz:

Kann ich vielleicht an den AVR extern ein zweites SPI-Interface anbauen 
(AVR haben ja glaube ich alle nur eines)?
Gibts dazu spezielle Bausteine?
(Oder realisiert man sowas einfach mit einem PISO-Shift-Register?)

von Benedikt K. (benedikt)


Lesenswert?

- Du kannst SPI per Software machen.
- Einige neuere AVRs können den UART als SPI verwenden
- Du kannst auf die neuen ATxmega warten, die haben 4 SPI Interfaces 
(oder sogar noch mehr)

von Gast (Gast)


Lesenswert?

Den Takt der SD-Karte mit einem AND-Gatter unterbrechen ohne CS auf High 
zu setzen. Dann das andere Teil bedienen und danach wieder den Takt 
durch das AND-Gatter zur SD-Karte leiten.

von Benedikt K. (benedikt)


Lesenswert?

Dann sollte man die Datenleitung aber auch auf tristate schalten.

von Peter (Gast)


Lesenswert?

> Zusätzlich möchte ich jetzt in einer
> Interrupt-Routine Daten an ein anderes IC über den selben SPI senden.

grundsätzlich ist es kein problem den spi-bus zu sharen. allerdings 
sollte eine aktion immer erst abgeschlossen werden, bevor ein anderer 
spi-slave angesprochen wird. d.h. während du gerade einen sektor der 
sd-karte liest/schreibst, sollte kein anderer den bus benutzen. erst 
danach wieder.

von Benedikt K. (benedikt)


Lesenswert?

Das Problem ist nur, wenn z.B. ein DAC seine Daten mit 22kHz haben will. 
Es klingt ziemlich merkwürdig, wenn bei jedem gelesenen Sektor eine 
Pause von ein paar ms eingebaut wird...

von Matthias (Gast)


Lesenswert?

Der Vorschlag von "Gast" tönt nicht schlecht.

Ich frage mich aber, ob das tatsächlich zuverlässig funktioniert. Das 
Unterbrechen der Taktleitung bedeutet ja in einem gewissen Sinn den 
Wechsel dar Taktfrequenz von ein paar Megaherz auf null auf einen 
Schlag. Nicht jede Logik verkraftet das. (Bei den AVRs darf sich der 
Qurztakt z.B. nur um wenige Prozent innerhalb einer Periode ändern.)

Unterdessen habt ihr offenbar auch mein Projekt erraten. Es geht darum 
WAVE-Files von der SD-Karte zu lesen und dann per SPI (als 
I2S-Emulation) an einen Audio-DAC zu senden.

von Peter (Gast)


Lesenswert?

> Das Problem ist nur, wenn z.B. ein DAC seine Daten mit 22kHz haben will.
> Es klingt ziemlich merkwürdig, wenn bei jedem gelesenen Sektor eine
> Pause von ein paar ms eingebaut wird...
wie lange braucht denn ein sector read/write bei dir? vielleicht ist es 
ja schnell genug, so dass du die den DAC noch ungebremst an gleichen bus 
mit 22kHz bedienen kannst. SD-karten lassen sich ja locker mit 20...25 
MHz SPI clock ansteuern bei der taktfrequenz dauert ein sector-R/W von 
512bytes nicht all zu lange.

von holger (Gast)


Lesenswert?

>SD-karten lassen sich ja locker mit 20...25
>MHz SPI clock ansteuern bei der taktfrequenz dauert ein sector-R/W von
>512bytes nicht all zu lange.

Man kann Daten mit einigen MHz in SD Karten reintakten oder
auslesen. Das blöde ist nur das man beim lesen und ganz
besonders beim schreiben erstmal warten muss bis die Karte
diese Daten auch liefert/annimmt. Wenn nur die SPI Frequenz
ausschlaggebend wäre, müssten ALLE SD Karten GLEICH
schnell sein. Sind sie aber nicht :(

von Benedikt K. (benedikt)


Lesenswert?

Peter wrote:
> wie lange braucht denn ein sector read/write bei dir? vielleicht ist es
> ja schnell genug, so dass du die den DAC noch ungebremst an gleichen bus
> mit 22kHz bedienen kannst. SD-karten lassen sich ja locker mit 20...25
> MHz SPI clock ansteuern bei der taktfrequenz dauert ein sector-R/W von
> 512bytes nicht all zu lange.

Rechnen wir mal: Maximal läuft ein mega32 mit 16MHz, macht 8MHz SPI 
Clock. Bestenfalls sind also 512µs drin. Falls der mega32 mit 3,3V 
läuft, sind nur 4MHz drin, also >1ms für einen Sektor.

Es ist aber auf jedenfall zuviel.

@ Matthias
Du könntest den mega324 nehmen. Der hat 2 UARTs, und denen man einen als 
SPI nutzen könnte. Damit hättest du 2 SPI Ports und alle Probleme wären 
gelöst.
Ich habe vor einiger zeit ähnliches gemacht: Ein Tastatur mit 32 Tasten, 
ein 2 Kanal DAC und ein M25P40 512kByte Flash Speicher. Auf Tastendruck 
wird die entsprechende Wave Datei abgespielt. Eigentlich wollte ich 
dafür eine SD Karte verwenden, aber eben genau wegen dem Problem habe 
ich den M25P mit dem Hold Eingang verwendet. Damals gabe es noch keine 
AVRs die den USART als SPI nutzen konnten. Heute würde ich einen 
mega48/88/168 nehmen.

von Peter (Gast)


Lesenswert?

> Wenn nur die SPI Frequenz ausschlaggebend wäre, müssten ALLE SD Karten
> GLEICH schnell sein. Sind sie aber nicht
das ist richtig. im schnitt schaffen sie aber alle an die 200...300 kB/s 
beim lesen, also etwa (grob geschätzt) 500 sector-read operationen pro 
sekunde. sollte das nicht ausreichen? ich würde es mal durchrechnen bzw. 
ausmessen, bevor ich irgendwelche verrenkungen anstelle, die vielleicht 
gar nicht nötig sind.

von Matthias (Gast)


Lesenswert?

Genau, ich werde wohl auf den mega324 oder mega644 migrieren.

Deren Hardware-Ausstattung tönt sehr verlockend: 2 USART und 1 SPI.
Ich kann also ein USART als SPI nutzen, sodass ich davon zwei habe, und 
das andere als RS232-Verbindung für Debugging etc. Super!

Wenn ich das Datenblatt des mega324 beim ersten Durchschauen richtig 
verstanden habe, ist die einzige Einschränkung bei der Verwendung des 
USART als SPI im Vergleich zum "richtigen" SPI, dass es nur im 
Master-Modus verwendet werden kann, was aber für meine Anwendung 
komplett egal ist.
Sonst ist nur die Ansteuerung (Registernamen etc.) etwas anders.
Stimmt das so, oder gibt es noch andere Unterschiede?

von Oliver (Gast)


Lesenswert?

Benedikt hat Recht mit den Tristates. Ich hatte genau das gleiche 
Problem und habe das hier gefunden:
http://www.shop.display3000.com/pi8/pi14/pd102.html
Dort gibt es eine fertiges Kartemodul mit Tristate Ausgängen. Habe ich 
mir selber vor einer Woche bestellt und gestern bekommen. Das ist meines 
Erachtens der einzige Weg um mehrere Geräte am SPI Bus zu betreiben denn 
sonst werden die sich immer gegenseitig stören.

Oli

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.