Hallo Ich habe folgendes Problem und zwar versuche ich schon seid tagen eine Kommunikation mit meiner 1GB-2GB SD-Karte über FAT zu bekommen. Erstmal: Verwendet ATMEGA32 bei 16MHz auf dem ATMEL Evaluations-Board Version 2.0 (gab’s bei Pollin) Sd-Karten: 1GB HAMA 2GB CnMemory SD-Kartenslot ist ne Mischung aus Pegelanpassung mit Widerständen und für den Datenrückkanal Levelshifting über 2 Transistoren "C549B". (Mischung aus Herrn Radig´s Optimal und Minimal Schaltung.) soviel zur Hardware. So es geht soweit das ich mit Kommandos init usw. CSD CID bekomme aber sobald ich anfange mit FAT (Karte FAT16 Formatiert Standard, 16k für eine Zuordnungseinheit "anders will Windows nicht") bekomme ich nichts mehr, bzw. Programm sitzt in einer Schleife fest. Habe die Programme von Herrn Radig und Herrn Klabunde probiert beides mit selben Ergebnis habe dann beim Herrn Klabundes Programm FATMulti41 so gut wie alle Kommentare reingenommen und auch zusätzlich welche eingefügt und somit rausgefunden das das Programm bei GETDriveInformation() beim Aufruf: by=ReadSector(0,dirbuf); und dort bei: Siehe unten beim <--- in der while schleife hängt. wenn ihr euch wundert welchen wert by annimmt, es ist 0 und 255 also 0x00 und 0xFF. Ich weiß echt nicht mehr weiter weil mir die Idee ausgeht. Sachen wie LowLevel Format der SD-Karten und sowas hab ich alles schon probiert. Danke schon mal an alle. Mfg Thomas
1 | U8 MMCReadSector(U32 sector, U16 *buf) |
2 | //######################################################
|
3 | {
|
4 | U16 i; |
5 | U8 by; |
6 | U8 tmpSPSR; |
7 | // U8 tmpSPCR;
|
8 | |
9 | #ifdef MMC_DEBUG_SECTORS
|
10 | printf("RS %lu 0x%08lX\n",sector,sector); |
11 | #endif
|
12 | |
13 | #ifdef CHECK_MAXSECTOR
|
14 | if(sector>=maxsect) return 1; //sectornumber too big |
15 | #endif
|
16 | printf("MMC_R_S_1\n"); |
17 | //tmpSPCR = SPI_CTRL_REGISTER;
|
18 | tmpSPSR = SPI_STATUS_REGISTER; //save old value |
19 | printf("MMC_R_S_2\n"); |
20 | SPI_STATUS_REGISTER = (1<<SPI2X); //give me double speed |
21 | |
22 | // MMC_CS_OFF(); // moved to MMCCommand()
|
23 | |
24 | //calculate startadress of the sector
|
25 | // startadr=sector; // this is the blockadress for SDHC
|
26 | |
27 | // if(card_capacity==STANDARD_CAPACITY) sector *= BYTE_PER_SEC; // SD/MMC This will work only up to 4GB
|
28 | printf("MMC_R_S_3\n"); |
29 | |
30 | if(card_capacity==STANDARD_CAPACITY) sector <<= 9; // SD/MMC This will work only up to 4GB |
31 | printf("MMC_R_S_4\n"); |
32 | |
33 | by=MMCCommand(MMC_READ_BLOCK,sector); |
34 | |
35 | while(by!=START_BLOCK_TOKEN) |
36 | {
|
37 | SPI_WRITE(DUMMY_WRITE); |
38 | SPI_WAIT(); |
39 | printf("MMC_R_S_4_1 - By = %d\n",by); <------ In dieser While Schleife |
40 | |
41 | by=SPI_DATA_REGISTER; // wait for card response |
42 | |
43 | #ifdef MMC_DEBUG_COMMANDS
|
44 | // no way to come out of this :( skip this sector !?
|
45 | if(by==0x01) // ERROR ! |
46 | {
|
47 | // One of my SD cards sends this error. My cardreader has also
|
48 | // problems to read (NOT write !) the card completely. Trash.
|
49 | printf("\nRead error 0x01 at sector %lu !\n",sector); |
50 | |
51 | MMC_CS_ON(); |
52 | |
53 | // SPI_CTRL_REGISTER = tmpSPCR; //restore old value
|
54 | SPI_STATUS_REGISTER = tmpSPSR; //restore old value |
55 | |
56 | // data buffer is not valid at this point !
|
57 | return 1; |
58 | }
|
59 | #endif
|
60 | }
|