mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sd-Karte: CID und CSD: ja, Status und Read-Block: NEIN


Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche eine SD-Karte anzusteuern.
Hardware: Mega128L mit 3,3V über 2,2k Reihenwiderstände an Karte, keine 
Levelshifter, keine Pullups. Software SPI mit etwas weniger als 400khz.

Die CMD0, CMD1 Init funktioniert, ich kann CID und CSD mit CMD9 und 
CMD10 auslesen.
STATUS-Register und Read-Block funktionieren nicht. Hier wird das 
Read-Block-Commando (CMD17) bestätigt, aber die Karte sendet nie das 
begehrte 0xFE (Daten sind bereitgestellt).

--
Sonderbares:
Der SD-Mode (nicht der SPI-Mode) der Karte kann im Init-Zustand nur CMD9 
und CMD10 ausführen, aber CMD17 geht nur im Transfer-Mode nach 
vorherigem CMD7.
Will sagen, vielleicht ist meine Karte gar nicht richtig im SPI-Mode und 
führt daher nur CMD9 und 10 aus, aber nicht den Block-Read CMD17.
Das verstehe, wer will. Ich jedenfalls noch nicht.


Gibt es Vorschläge, warum das so ist und wo mein Problem liegt?

Autor: Torsten S. (tse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... über 2,2k Reihenwiderstände an Karte,

Warum das?

Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hatte Angst, dass ich wegen eines Programmierfehlers einen 
Kurzschluss mache. Deswegen die 2,2k. Die müssten 1,5mA oder so 
durchlassen.

--
Ich habe gerade die Init mit ACMD41 getestet (da CMD1 bei den dünnen 
SD-karten wohl nicht implementiert sei). Die neue Init geht, ich kann 
aber wieder nur CID und CSD auslesen, das 0xFE fehlt weiterhin nach 
Read-Block-Commando.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Widerstände sind superliquid. Wenn schon, dann 100...220 Ohm.

Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, die Widerstände hatte ich eben schon draußen. Das war nicht der 
Fehler.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das "0xFE" nicht kommt, dann clockst Du nicht lange genug oder 
sendest nicht das richtige Kommando.

Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Clocken ist wohl nicht das Problem. Es wird in einer while-Schleife 
immer gelesen und auf 0XFE gewartet. Ich verwende den Code von Ulrich 
Radig. Darin habe ich die Flanken in read write geändert, dann lief die 
Init. Der Rest aber nicht.

--
Jetzt gerade gehe ich zwei Wege:
1. eigenen Code schreiben
2. Hardware-SPI verwenden

zu 1:
Muss ich gleichzeitig schreiben und lesen (in einer routine) oder kann 
ich erst schreiben und danach die antwort lesen?

zu 2:
Ich habe den mega128L. Darin sind MISO und MOSI frei, aber SCK ist ja 
dauernd mit dem AVR-ISP-Brenner (Atmel 910) verbunden. Die beiden SCK 
muss ich trennen, sonst habe ich dauernd Kurzschlüsse.
Wie wird das normalerweilse gemacht?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Verwendung des Hardware-SPI ist nicht (unbedingt) erfordrlich - der 
Fehler liegt im Programm. Einen eigenen Code zu schreiben ist lehrreich 
und deckt den Fehler vielleicht auf. Ein DSO ist für solcherlei 
Experimente extrem hilfreich.

Autor: Gast59 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt selber ein Programm geschrieben (ist im Anhang).
Wieder geht die Init, ich kann CMD9 und 10 ausführen (CID, CSD 
auslesen).

Aber Read_Block geht wieder nicht. Commando17 wird mit 0 bestätigt, ich 
lese dann in einer while-Schleife, aber es kommt kein Data Start Token 
0XFE.

Könnt ihr euch mal mein Programm dazu ansehen?

Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe jetzt die Karte an die Hardware-SPI angeschlossen und SCK 
mit einem Schalter abgeschaltet beim Brennen.
Diesmal habe ich die Ulrich Radig Software gar nicht verändert. Und 
wieder dasselbe!
Wie sonst auch, kann ich nur Init, CID, CSD lesen.
Beim Read-Block lesen warte ich wieder nur auf 0xFE.

Das heißt für mich, die Hardware ist der Knackpunkt.
Ich habe den mega128L mit 8 Mhz. Einen teuren SD-karten-Halter, der mit 
20cm langen Kabeln an den Hardware-Spi-Port des mega128L angeschlossen 
ist.
Vor der SD-Karte sind 2,2k Ohm Reihenwiderstände zum Schutz.
Do der SD-Karte hat einen 90k Pullup.
Kein 100nF und auch kein Elko an der SD-Karte.

Vorschläge bzgl. der Hardware?

Autor: Gast59 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist ein 100nF bei der Sd-Karte, die Reihenwiderstände sind raus.
Keine Veränderung :-|

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.