Hallo Leute, wir haben erfolgreich eine SD-Karte an unseren Atmega168 angeschlossen und bekommen positive Rückmeldung (CMD0 und CMD1 antworten richtig). Jetzt wollten wir eine 128MB SD-Karte auslesen, die sich unter Windows (laut Software) nur minimal mit einer Cluster Größe von 4096Byte FAT16 formatieren ließ. Im Beispielprogramm von Ulrich Radig kann man diese Block Size einstellen und das haben wir auch getan. Nun haben wir gemerkt, dass die 4096 Byte, die beim lesen des MBR beim Initialisieren viel zu groß für unseren Speicher des Atmega168 sind. Als Konsequenz davon hatten wir einen ständigen StackOverflow der den Chip resettet hat. Aber größere Chips wie der Atmega644 haben ja auch nur 4KB SRAM!?!?!? Nun ist die Frage - wie schafft man es, eine größere SD-Karte (deren Cluster Size ja anscheinend mit der Kapazität wächst) von einem Atmega auslesen zu lassen, der nur so wenig RAM hat ? (Oder überseh ich da was ? ) Vielen Dank für die Antwort. Gruß Benjamin
Der Trick ist das man nur einen Sektor (512 Byte) liest. Der Cluster wird dann einen Sektor nach dem anderen stückchenweise gelesen.
Soweit ich das im Code von Ullrich Radig sehe, hat er das aber nicht so implementiert, richtig ? Sollte ich jetzt eine andere Fat Library benutzen ? Wenn wir die Karte mit 4096 Cluster Size mit ner Clustersize von 512 versuchen zu lesen, bekommt er den MBR nicht richtig.
NACHTRAG: Hier unser Code zum Initialisieren: //###################################################################### ###### //Auslesen Cluster Size der MMC/SD Karte und Speichern der größe ins EEprom //Auslesen Cluster Offset der MMC/SD Karte und Speichern der größe ins EEprom void fat_init (void) //###################################################################### ###### { struct BootSec *bootp; //Zeiger auf Bootsektor Struktur unsigned char Buffer[BlockSize]; //volume_boot_record_addr = fat_addr (Buffer); mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record if (Buffer[510] == 0x55 && Buffer[511] == 0xAA) { message("MBR Signatur found!", 3000); } else { message("MBR Signatur not found!", 3000); while(1); } volume_boot_record_addr = Buffer[VBR_ADDR] + (Buffer[VBR_ADDR+1] << 8); mmc_read_sector (volume_boot_record_addr,Buffer); if (Buffer[510] == 0x55 && Buffer[511] == 0xAA) { stdmsg("VBR Signatur found!"); } else { stdmsg("VBR Signatur not found!"); volume_boot_record_addr = MASTER_BOOT_RECORD;//<- added by Hennie mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record } bootp=(struct BootSec *)Buffer; cluster_size = bootp->BPB_SecPerClus; fat_offset = bootp->BPB_RsvdSecCnt; cluster_offset = ((bootp->BPB_BytesPerSec * 32)/BlockSize); cluster_offset += fat_root_dir_addr(Buffer); } Das lustige ist nun, wenn ich BlockSize auf 4096 setze, erkennt er den MBR und den VBR. Wenn es auf 512 gesetzt ist, scheint er schon vor der "MBR Initialized" Nachricht zu crashen. Es kommt keine weitere Ausgabe. Wie kann das sein ????
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.