Forum: Mikrocontroller und Digitale Elektronik MMC / SD mit SPI und PIC. MMC ja, SD nein.


von Walter (Gast)


Lesenswert?

Ich kann keine SD-Karten über SPI auslesen. Bei meinen MMC-Karten geht 
aber alles einwandfrei.
Als Controller mehme ich den PIC18F6680 Versorgungsspannung 5V.
Für die 3,3V der Karte habe ich sowohl Spannungsteiler mit Widerständen 
als auch Treiber schon erfolgreich getestet (mit MMC). Auch etwas 
längere Kabel von der SD zum PIC machen mir keine Probleme. Meine 
Taktfrequenz ist mittlerweile sehr klein, diese habe ich von zunächst 
400kHz auf etwa 6 KHz langsamer gemacht. Auch der ACMD41-Befehl wird 
anstandslos akzeptiert. Danach sende ich optional CMD1. Ich sende alles 
100-mal oder mehr, bis zum timeout. Wenn dann Fehler, nochmal von vorne. 
Alles OK. Auch bei einem timeout von 65000 bekomme ich am Ende nur 
falsche Werte. Mehrmals-Initialisierungen oder mehr als 80 clocks im 
disable-mode: alles umsonst. Die SD habe ich genauso angeschlossen wie 
die MMC, denn die 2 zusätzlichen Anschlüsse brauche ich nicht, obwohl 
ich schon mit pull-ups und pull-downs experimentiert habe.

Allerdings sieht die Pegelfolge vollkommen anders aus als bei einer MMC 
die funktioniert.

Vielleicht kann aber hier jemand etwas mit anfangen:
ich lese zunächst nur die 512 Bytes des Bootsektors und erhalte immer:
43 52 30 30 30 30 30 31 54 58 usw.
Richtig wäre aber:
EB 3C 90 4D 53 44 4F 53 35 2E usw.
Mit einer (einzigen) SanDisk funktioniert das sogar richtig, allerdings 
kann ich diese nicht beschreiben, macht nur Fehler !
Zum Lesen im PC benutze ich WinHex, mit dem ich die Karte im Cardreader 
auslese.
Einen logischen Zusammenhang kann ich hier oben nicht feststellen. Es 
werden weder Bits verschluckt noch vertauscht.
Bei einer anderen SD kann ich immer nur 00 00 00 00 usw. auslesen, 
warum?

Kommt das hier jemandem bekannt vor oder hat jemand eine Idee, warum die 
MMC-Karten über SPI gehen, die SD-Karten aber alle nicht?

von günny (Gast)


Lesenswert?

Wenn Du von der Karte etwas liest, welchen Pegel hast Du dann am 
MOSI-Pin anliegen?
Der muß nämlich immer 1 sein! Sonst funktioniert bei manchen Karten 
alles wunderbar und bei anderen läuft garnichts...

Ohne Quelltext zu sehen kann man Dir hier wohl kaum weiterhelfen. Da Du 
scheinbar ein systematisches Fehlersymptom hast, wird es wohl ein 
Problem in der Software sein.

von Bartholomäus S. (sam_vdp)


Lesenswert?

Also den Unterschied zwischen MMC und SD kann ich mir nicht erklären, 
allerdings scheinen einige Hexeditoren unter Windows (laut 
http://www.pjrc.com/tech/8051/ide/fat32.html auch Winhex) nicht mit dem 
Bootsektor der Karte, sondern mit dem Header der ersten Partition zu 
beginnen, hatte mich bei meinen ersten Gehversuchen auch verwirrt. Wenn 
allerdings mit der MMC Karte alles passt, kann's das eigentlich nicht 
sein, tut mir leid.

von Walter (Gast)


Lesenswert?

Zunächst mal danke für die prompten Antworten.
@ Bartholomäus
Habe ich auch schon gedacht aber nicht weiter verfolgt. Ich meinte den 
Sektor      Stelle 00, der auch in WinHex als Bootsektor benannt wird.

@ günny
Was meinst du mit MOSI-Pin?
Falls chip-select der SD-Karte: 5V vom PIC.
falls SD-out von der SD: 3,3V direkt am PIC-Eingang, bei der Schaltung 
mit Treiber sind es dann 5V.

Die mmc_init() hänge ich mal an.
Geschrieben in C mit Compiler von Reichmann.

von Walter (Gast)


Angehängte Dateien:

Lesenswert?

Ups, der Anhang hat wohl nicht geklappt. Hier nochmal

von holger (Gast)


Lesenswert?

Probier mal folgende SPI Einstellungen:

SSPSTAT=0b01000000; //Sample at middle of output,output at rising sck 
edge
SSPCON1=0b00100010;  //SPI Enable, FOSC/64,Master Mode,Clock Idle level 
= 0

Das hier solltest du bei SD Cards besser vor jedem Kommando machen

  mmc_disable;  //extra clock to allow mmc to finish
  SPI(0xFF);
  mmc_enable;

von Walter (Gast)


Lesenswert?

@ holger
Vielen Dank. Leider hat das aber nichts gebracht, denn der Controller 
macht jetzt nur noch Reset. Meines Erachtens muß die Karte ständig 
enabled bleiben. Ein Versuch war es aber wert.
Also: auf anderem Wege weiterversuchen.

von Walter (Gast)


Lesenswert?

Nächster Versuch.
Vielleicht hat hier jemand eine Antwort drauf:
Ich habe gerade bemerkt, daß mein response auch dann positiv beantwortet 
wird, wenn ich gar keine Karte im Slot habe. D.h. ich erhalte eine 
gültige Antwort via SDI, obwohl der Controller der SD-Karte nichts 
senden kann, weil er ja gar nicht vorhanden ist.
Natürlich habe ich schon mit pull-up und auch pull-down rumgespielt. 
Auch mit dem Richtungsregister und den Eingang vorher auf high oder low 
ziehen.
Wie gesagt: bei MMC klappts, da steigt er beim timeout aus (ohne ACMD41 
natürlich, dieser Befehl darf bei MMCs nicht verwendet werden!) ...

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.