mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann sollte man die Datenleitung aber auch auf tristate schalten.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.