Forum: Mikrocontroller und Digitale Elektronik PIC 18F2520 SD-Karte antwortet nicht


von Simon R. (stalky13)


Lesenswert?

Hi Leute,

Ich versuch seit einiger zeit eine SD-Karte über SPI anzusprechen aber 
leider bekomme ich von der Karte überhaupt keine Antwort sondern immer 
nur 0xFF. Die Pegelwandlung von 5V auf 3.3V erfolgt über einen 74LVX125 
und die Pegelwandlung von 3.3V auf 5V über einen MAX232 auf dem 
Oszilloskop sieht mein DI Signal der Flash-Karte gut aus aber bei dem 
CLK Signal habe ich leichte Oberschwingungen. Auf dem DO Signal der 
Flash-Karte sehe ich einen Kurzen Low Impuls und dann einen etwa 10 mal 
so langen High Impuls ... aber wie gesagt ich bekomme immer nur Einsen 
obwohl die Karte im Idealfall mit 0x01 Antworten sollte. Es Wäre toll 
wenn sich mal Jemand der damit schon Erfahrung hat mal mein Programm (im 
Anhang) ansehen könnte ob ich alles Richtig gemacht habe. Ich 
Programmiere mit der IDE von MPLAB in C18.

MfG  Stalky

von holger (Gast)


Lesenswert?

>und die Pegelwandlung von 3.3V auf 5V über einen MAX232 auf dem

Sehr kreativ, aber wenig hilfreich ;)
Der MAX232 invertiert das Signal.
Dürfte auch nicht schnell genug sein.
Nimm stattdessen z.B. einen 74HCT125
oder was anderes aus der 74HCT Reihe.

von Simon R. (stalky13)


Lesenswert?

hi,

Ich habe den Ausgang vom MAX232 wieder Mit einem Eingang des MAX232 
gebrückt ... also aus den 3.3V mach er -8V (oder so) und daraus wieder 
5V ... das Endergebnis ist also nicht mehr invertiert und genau 5V groß.

Und der MAX232 ist für Pegelwandlungen von 5V auf 12V gedacht z.B. für 
RS232 Schnittstellen. Den hab ich schon erfolgreich mit 6 Stelligen 
Baudraten betrieben ... ich glaub nicht das er zu Langsam ist. Trotzdem 
danke für deinen Vorschlag ... werd ich mir auf jedenfall Merken.

MfG  Stalky

von Simon R. (stalky13)


Lesenswert?

Servus,

ich hab nun den Fehler gefunden ... es lag an der SPI Bus Konfiguration. 
Damit es Funktioniert muss diese (für einen PIC 18F2520) wie Folgt 
aussehen:
1
SSPSTATbits.SMP = 0;     //Input data sampled at middle of data output time
2
SSPSTATbits.CKE = 1;     //Transmit occurs on transition from active to Idle clock state
3
4
SSPCON1bits.SSPM3 = 0;   //SPI Master mode, clock = TMR2 output/2
5
SSPCON1bits.SSPM2 = 0;   //Timer 2 muss so konfiguriert werden dass der
6
SSPCON1bits.SSPM1 = 1;   //SPI Bus mit weniger als 400 kHz und mit mehr
7
SSPCON1bits.SSPM0 = 1;   //als 100 kHz getaktet wird
8
SSPCON1bits.CKP = 0;     //Idle state for clock is a low level
9
SSPCON1bits.SSPEN = 1;   //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
10
11
/* Timer 2 Konfiguration bei 40 MHz PIC Takt ***********/
12
T2CON = 0b00000100;      //kein Postscale; kein Prescale; Timer ein
13
PR2 = 20;                //Periodenregister auf 20

Der Timer 2 wird mit TOSC/4 getaktet (10 MHz) hat er bis 20 gezählt (PR2 
= 20) dann erfolgt ein Timer2 Output Impuls, ggf. ein Interrupt und ein 
Reset von Timer 2. Der Timer 2 Output wird nochmals durch 2 geteilt 
bevor damit der SPI Bus getaktet wird. Also: TOSC/4/20/2 = 250 kHz.

Nun habe ich aber noch das Problem dass ich immer auf das Senden von 
Kommando 1 die antwort 0x01 bekomme anstatt 0x00. Das Kommando sende ich 
200 mal bevor Timeout und immer mit einer ms verzögerung dazwischen. Ich 
wäre euch für eure Hilfe dankbar.

MfG Stlaky

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.