Hallo zusammen
Ich hänge nun seit mehreren langen Tagen dabei eine Speicherkarte an
einem PIC zu betreiben. Dazu verwende ich die FATFs Lib von ElmChan.
Benutzt wird ein dsPIC33E. Von der ElmChan Seite habe ich "FatFs sample
projects for various platforms" das Beispielprogramm PIC24 benutzt und
dort in der diskio.h die SPI Funktionen ergänzt.
An den SPI Leitungen hängen jeweils ein 10k Pullup.
Problem ist: Speicherkarte reagiert nicht, es passiert nichts.
Micro Speicherkarte funktioniert, da ich diese bereits mit anderen
"fertigen" SD Modulen betrieben habe. (habe auch eine andere 2te
Speicherkarte, gleiches Szenario)
Habe mir per Oszi und Debug Codes mal das Programm angeschaut:
-so wie ich das sehe, kommt das Programm NICHT in den IDLE STATE Modus
in der Funktion DSTATUS disk_initialize() in der Datei diskio.c.
1 | if(send_cmd(CMD0, 0) ==1) {//enter Idle State}
|
schlägt immer fehl.
Schaue ich mir die send_cmd() funktion an:
Am Oszi erkenne ich die gesendeten Daten auf der MOSI Leitung welche
durch die send_cmd() funktion gesendet werden.(siehe bild2). Es kommt
jedoch keine Antwort seitens der Speicherkarte..
Bild1 zeigt die komplette Datenübertragung, Bild2 reingezoomt die Daten.
Benutzt wird folgender Beispiel Code:
1 |
|
2 | if (f_mount(&FatFs, "", 0) == FR_OK) { /* Mount SD */
|
3 | //"0:" bringt auch nichts
|
4 | writeLCD("MOUNTED ");//kommt hier rein.
|
5 |
|
6 | if (f_open(&Fil, "he2.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK) { /* Open or create a file */
|
7 | writeLCD("OPENED ");//wird NICHT ausgeführt.
|
8 | //if ((Fil.fsize != 0) && (f_lseek(&Fil, Fil.fsize) != FR_OK)) goto endSD; /* Jump to the end of the file */
|
9 |
|
10 | f_write(&Fil, "Hello world!\r\n", 14, &bw); /* Write data to the file */
|
11 |
|
12 | //endSD: f_close(&Fil); /* Close the file */
|
13 | f_close(&Fil);
|
14 | }
|
15 | }
|
Gebe ich mir jeweils in f_mount und f_open den return FRESULT res an, so
kommt immer die Meldung 3, welche also für "FR_NOT_READY" steht.
Aber warum?
Meine SPI Funktion sieht folgendermaßen aus:
1 |
|
2 | uint8_t ExchangeSPI(uint8_t wert){
|
3 | SPI1BUF=wert;
|
4 | while(!SPI1STATbits.SPIRBF)// warten bis Werte aus dem Schieberegister rausgeschoben sind
|
5 | ;
|
6 | return SPI1BUF;
|
7 | }
|
Was mache ich falsch bzw was kann ich noch testen/anders machen ?
Bitte um Hilfe..
Vielen Dank
-Matthias