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
>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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.