Forum: Mikrocontroller und Digitale Elektronik PIC16 SPI SD Card


von Osccon (Gast)


Lesenswert?

Hallo,
ich versuche gerade eine SD Karte über SPI an den PIC16F887 
anzuschließen.
Ich habe schon einiges im Netz dazu gefunden und ein paar Versuche 
gemacht, jedoch will es nicht funktionieren.
Ich bekomme bei der Initialisierung der SD Karte nie eine Antwort auf 
den CMD0 Befehl.
Deswegen würde ich gerne ein paar Fehler ausschließen.

Ich benutze dieses Speicherkartenmodul:
http://www.pollin.de/shop/dt/MDQ2OTgxOTk-/Bausaetze_Module/Entwicklerboards/SD_Speicherkartenmodul.html

So schließe ich den PIC an das Speicherkartenmodul an:
- SD  |  PIC -
--------------
SS    ->   VSS
GND   ->   VSS
3.3V  ->   VDD
MISO  ->   SDI
MOSI  ->   SDO
SCK   ->   SCK

Ich betreibe den PIC und die SD Karte vom PIC Kit 3 aus mit 3.125V.

Ich benutze diese SD Karte:
http://www.amazon.de/Kingston-Technology-SD-Card-2GB/dp/B000EOMXM0

Und so sieht mein Programm Ablauf aus:

01. Setze SDO Tris auf Output
02. Setze SDI Tris auf Input
03. Setze SCK Tris auf Output
04. Setze SSPCON auf B'00100010'
05. Setze SSPSTAT auf B'11000000'

06. 8 mal: 01. B'11111111' in SSPBUF schreiben
           02. 60ms warten

07. CMD0 schicken: 01. B'01000000' in SSPBUF schreiben
                   02. 60ms warten
                   03. B'00000000' in SSPBUF schreiben
                   04. 60ms warten
                   05. B'00000000' in SSPBUF schreiben
                   06. 60ms warten
                   07. B'00000000' in SSPBUF schreiben
                   08. 60ms warten
                   09. B'00000000' in SSPBUF schreiben
                   10. 60ms warten
                   11. B'10010101' in SSPBUF schreiben
                   12. 60ms warten

08. Auf Antwort warten: 01. B'11111111' in SSPBUF schreiben
                        02. 60ms warten
                        03. SSPBUF lesen
                        04. Gelesenen Wert testen nach B'00000001'
                        05. Test nicht erfolgreich auf Antwort warten

Wie oben schon erwähnt bekomme ich nie die Antwort B'00000001'.
Hat jemand eine Idee was schief laufen könnte?

von Jim M. (turboj)


Lesenswert?

Die SPI Clock Rate darf maximal 400 KHz sein, da SD Karten als "Open 
Drain" aus dem Power-up Reset kommen. Schau Dir mal die Spec genauer an.

Deine Bitzuweisungen sind extrem schlecht lesbar, und ich schaue jetzt 
nicht ins DB ob Du da entsprechende Teiler setzt. Dafür müsste man mich 
bezahlen ;-)

Ach ja: Wieso wartest Du 60 ms und nicht auf das entsprechende "SPI 
Busy" Bit?

Bei Punkt 8 und nicht erfolgter Antwort 0x01 würde ich zurück zum Punkt 
6 springen. Einige Karten brauchen zum "Hochfahren" etwas Zeit und sind 
erst danach ansprechbar.

Ich sehe keinen Hinweis auf SS. Der muss da auch korrekt geschaltet 
werden, siehe Spec (auf sdcard.org).

von Jim M. (turboj)


Lesenswert?

Wie Du leicht sehen kannst, ist die SD Karten Ansteuerung nicht ganz 
trivial. Schau Dir lieber mal Beispielcode im Internet an.

von Route_66 H. (route_66)


Lesenswert?

Jim M. schrieb:
> Ich sehe keinen Hinweis auf SS. Der muss da auch korrekt geschaltet
> werden, siehe Spec (auf sdcard.org).

Steht weiter oben:

Osccon schrieb:
> SS    ->   VSS

von Osccon (Gast)


Lesenswert?

Den Vorteiler setze ich auf 64 und den PIC betreibe ich bei 4 MHz 
internal Oscillator.
Ich habe es jetzt auch mal so gemacht, dass er wieder bei 6. Anfängt. 
Aber nach wie vor dasselbe.

von WehOhWeh (Gast)


Lesenswert?

Also, da gibts ein Beispiel dafür:
http://elm-chan.org/fsw/ff/00index_e.html

Das ist zwar für PIC24, aber der Unterschied ist gering.
Man findet die Low-Level IO-Geschichten in diesem Zip "FatFs sample 
projects for various platforms September 5, 2015".

Dabei interessant ist die "mmc..." irgendwas c-file, dieses enthält 
immer die Ansteuerung. Bei mir lief das auf Anhieb.

Das selber zu schreiben macht nur dann Sinn, wenn du spass dran hast, 
oder wenn du das verstehen möchtest.

von Jim M. (turboj)


Lesenswert?

Route 6. schrieb:
> Jim M. schrieb:
>> Ich sehe keinen Hinweis auf SS. Der muss da auch korrekt geschaltet
>> werden, siehe Spec (auf sdcard.org).
>
> Steht weiter oben:
>
> Osccon schrieb:
>> SS    ->   VSS

Das ist leider komplett falsch. SD Karten kommen im SD Modus hoch, da 
darf SS nicht auf VSS liegen. Die ersten 80 Dummy Bits sendest Du für 
einen SD Mode Reset, dabei muss SS High Pegel haben. Erst danach 
schaltest Du SS auf Low für das CMD0 Umschalten nach SPI Mode.

SS will man auch sonst geschaltet haben, denn mit dem Übergang High->Low 
wird der SPI Bitzähler zurück gesetzt. Damit kann man z.B. überzählige 
Clock Pulse bei Störungen (oder beim Einschalten) abfangen.

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.