Hallo, Hier Source Code2.1!! Getestet mit einer 256MB SD Karte von San Disk! Gibt es für 25 bei Saturn im Angebot! 256MB SD von San Disk 128MB SD von Transcend 128MB SD von Lexar. 128MB SD von Hama. 32MB MMC von ExtremMemory Mfg Ulrich
Hi, Wie siehts mit der Dateierstellung aus? - scheint mir etwas komplizierter als lesen. Hat jemand bereits Dateien mit dem Microcontroller erstellt (mit oder ohne FAT)? MfG Daniel
Hallo, Das schreiben ist auch ganz einfach! Nagut man sollte schon eine Datei mit dem PC erstellen sonnst ist es ein bisschen schwerer :-). Also man brauch nur die gleiche dann Routine wie beim lesen einer Datei benutzen, und anstelle block lesen umschreiben auf block write. Also ganz einfach ;-) Mfg Ulrich
Hallo Uli, ich habe da ein kleines Verständnisproblem. Du schreibst: >Hier Source Code2.1!! >Getestet mit einer 256MB SD Karte von San Disk! >Gibt es für 25 bei Saturn im Angebot! >256MB SD von San Disk >128MB SD von Transcend >128MB SD von Lexar. >128MB SD von Hama. >32MB MMC von ExtremMemory Der Source kann "nur" FAT16, d.h. bei einer BlockSize von 512 Byte können maximal 65535x512 = 32765,5 KB = ca.32MB verwaltet werden. D.h., dass bei einer 256MB-Card nur 32MB nutzbar sind? Oder gibt es die Möglichkeit mit verschiedenen Partitionen zu arbeiten? Nach meinen Kenntnissen, ist es mit einer BlockSize von 512Byte ab FAT32 möglich mehr als 32MB zu verwalten - oder? Grüße MyMeisle
@MyMeisle: FAT16 geht bis 2GB. Du hast die Köpfe vergessen... sie auch hier: http://home.teleport.com/~brainy/fat16.htm Volkmar
Hallo, Natürlich arbeitet FAT16 jenseits von 32MB // 512Bytes Blocksize* XX Clustersize * max 65535 FAT Eintrag weit über 32MB :-) Mfg Ulrich
Hallo, Danke für die Antworten. Naja manchmal hat man halt einen Tunnelblick - oder, als Antwort auf Volkmar's Beitrag, einfach ein Brett vor dem Kopf! Eigentlich bin ich zu alt für PISA, oder einfach nur jung geblieben... Gruß MyMeisle
Hallo Uli, I've adapted your source to a msp430 cpu and it works !!! On the PC i use a problem called DirectDisk to check the content but this program doesn't seem to read the MBR at sector 0 but the BootSector (maybe a windows thing). I've created a file as big as could fit on the the sd-card (64MB) and i'm trying to first read this file and later write in it. My question is, how would i read this entire file ? You're demo main.c gives me part of the file (i've filled the file on the PC with 1234567890). Thanks in advance, Norbert.
Hallo Leute, ich habe folgendes Problem ich habe versucht eine MMC Karte an einen ATMega16 zu hängen! Nun habe ich das ganze wie in der Anbindung Optimal von der Homepage von Ulrich gefertigt allerdings habe ich die BC847 gegen BC549 ersetzt! Leider kann die Karte nicht gefunden werden! Kann mir jemand sagen was ich falsch gemacht habe? Mfg Nicole
Hallo ich habe das gleiche Problem, Ich verwende einen AtMega16 habe 3 Karten zum testen von denen ich keine zum laufen bringe, Geregelte Spannung über Festspanungsregler 3V. Hier mal mein verwendeter Code und die Einstellungen die ich vorgenommen habe: Zunächst einmal habe ich in der Datei mmc.h folgendes eingebunden: #if defined (_AVR_ATmega16_) #define SPI_DI 5 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist #define SPI_DO 6 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist #define SPI_SS 4 //Nicht Benutz muß aber definiert werden #endif da ich ja einen AtMega16 benutz. SPI Mode hab ich Aktiviert. nun im main Programm hab ich folgendes. #include "lcd.h" #include "mmc.c" #if defined (_AVR_ATmega16_) # define USR UCSRA # define UCR UCSRB # define UBRR UBRRL # define EICR EICRB #endif int main(void) { lcd_init(LCD_DISP_ON); //LCD Display Inizalisieren lcd_clrscr(); //LCD Display löschen lcd_puts(" System Start "); mmc_init(); while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten { lcd_clrscr(); lcd_puts(" Keine SD-Karte "); } lcd_clrscr(); lcd_puts("System Gestartet"); for(;;) { } } Vielleicht kann mir ja jemand helfen wäre echt cool! Mfg Erika
Hallo, Hier nochmal die letzte Version des Source Codes V2.3 (27.02.05) Mfg Ulrich
Hi, ich habe mich ja schon vor längerem mal drangemacht das ganze auf das low-Level-Niveau von Assembler umzuschreiben :). Nachdem ich mich jetzt entschlossen habe, nen MP3-Player zu baschteln, hab ich das halt wieder rausgekramt, und mich meiner Ängste gestellt, die da waren: Init. Die einzige Möglichkeit, wie ich auf meinem Terminal "MMC initialisiert" draufbekomme ist: Resetleitung des M32 auf GND Karte ist ausgesteckt Reset "befreien" (AVR springt an und sagt "Hallo") Dann die MMC-Karte (32MB) reinschieben.. mit Glück. Ich würde gern wissen, ob du das Problem auch hattest und ob es einfach nur Timing Probleme sind, denn ich finde sonst keinen Unterschied der Codes. Achso: es springt bei mir der "Timeout" beim CMD0 an.. aus verzweiflung und auch einem Problem mit der Init im andren Thread hab ich mal Timeout auf 5.000 erhöht, ohne Erfolg. Ist der ASM einfach zu schnell :) So nebenbei: wenn er dann wirklich mal "initialisiert" anzeigt, dann liest er mir wie ihm befohlen Sektor 384 aus und zeigt mir 512Byte Text an, d.h. er ist dann doch richtig initialisiert. Und mit deinem C-Code geht es in fast allen möglichen Konstruktionen :( Ich werd mich dann wohl bald von nem Kühlkörper stürzen heul Schonmal ein Danke ;) dave
Hallo @dave Hier ein Assembler Programm aus alten Tagen für einen MP3 Player mit MMC und VS1001. Ist weder Dokumentiert noch sauber geschrieben (hat aber Funktioniert) Mfg Ulrich
@Uli mhmm hab da nen kleinen Fehler in deiner Lib gefunden. In der mmc_init() steht: > //SPI Bus auf max Geschwindigkeit > SPCR = SPCR|(0<<SPR0)|(0<<SPR1); > SPSR = SPSR|(1<<SPI2X); Um die SPR-Bits zu clearen müßte es aber heißen: SPCR &= ~((1<<SPR0) | (1<<SPR1));
Hallo Leute, ich versuche vergebens das Speichern und das Auslesen von MMC Karten. Ich möchte nur ein paar int werte speichern nix aufwendiges, möchte auch kein fat benutzen. nun hab ich dies über mmc_write_sector und mmc_read_sector versucht, aber ich scheine dort einfach nicht weiterzukommen. Ich versuch das jetzt schon 3 Tage ohne Erfolg, leider hab ich mir auch schon zwei Karten gehimmelt :-(. Ich bin noch etwas unerfahren in C Programmierung, deswegen stellen sich mir noch ein paar fragen zu den Befehlen ich hoffe ihr könnt mir diese beantworten oder einen beispiel code zu meinem Problem geben das ich das auch mal verstehe. In der Doko steht: char mmc_write_sector (unsigned long Block, char *Buffer) dafür könnte ich jetzt einsetzen unsigned long Block = 1; // bis 65536 da 32 MB-Speicherkarte unsigned char Buffer [512]; ich denke dies sollte so stimmen, nun habe ich in meinem Code folgendes stehen int faktor = 0; int faktorx = 0; jetzt möchte ich diese beiden werte gerne speichern und später wieder auslesen. meine frage nun wie bekomme ich meine werte an den Buffer? ???? mmc_write_sector (Block, Buffer); und mmc_read_sector (Block, Buffer); ???? Das wäre das erste, nun noch die Fragen da ich kein FAT benutzen, möchte wie sieht es mit der Karte selber aus muss die FAT formatiert sein oder wie kann ich sie so löschen das ich sie nutzen kann? Ich hoffe ihr helft mir! Vielen Dank Sandra @Erika Ich schätze mal das du die MMC DO und DI Leitungen vertauscht hast, sollte sonst einwandfrei funktionieren, ich habe getestet mit 128MB Hama, 64MB Lexar, 16MB Nokia und einer 32MB Nokia. Was auch noch sein könnte (war bei mir so und ich hab fast verzweifelt, wenn du den eingang vom Spannungsregler am STK500 hast mit 5V mess mal die Spannung an der MMC Karte, ich hatte da nur 2,2V hat bei mir nur mit der Hama Karte funktioniert die andern wollten nicht! Und wenn du ihn wie ich jetzt über ein externes Netzteil betreibst achte darauf das du die GND Leitungen auch brückst sonnst geht auch nix, war jedenfalls bei mir der Fall.
Sandra: > leider hab ich mir auch schon zwei > Karten gehimmelt :-(. Ich hatte auch eine "geröstet" - Bei ein paar dutzend mA wurde die sogar richtig warm. Nachdem ich beim großen C (atelCo) eine neue gekauft hatte, habe ich versehentlich die kaputte in den Kartenleser gelegt. Und siehe da: Die Daten waren da, alles war gut! Daß die Dinger einiges abkönnen, hatte ich mir gedacht, aber daß die sich "selbstheilen" können..... Ich habe auch vor, Daten direkt auf die Karte zu schreiben. Wie ich die unter (beliebigen) Unix auslesen kann, ist mir klar. Aber was macht Windows damit? Ich will Daten im "CSV" Format schreiben, damit die einfach in (Open)Office eingelesen werden können. Gruß, Falk
Tag, ich hab auch mal wieder 1 Frägchen... Warum ist bei "Read_Dir_Ent": unsigned char Entry_Count (also 8bit) unsigned int TMP_Entry_Count = 0 (also 16bit) und dann: if (TMP_Entry_Count == Entry_Count) Du vergleichst nen 16er mit nem 8er... find ich unlogisch. dave
Hallo, Simmt ist ein bischen unglücklich, entweder int oder char! Wer char wählt hat das Problem das ein Verzeichnis nicht mehr als 255 Einträge haben darf was selten der Fall ist ;-) Der SourceCode funktioniert auch so bei der nächsten Version werde ich es auf char ändern. Mfg Ulrich
Hallo, erstmal: schöner code, danke dafür :) jetzt habe ich jedoch ein kleines Problem, das ganze auf meinem Atmega16 zum laufen zu bekommen. Ich erhalte über UART folgenden Text: System OK Karte gefunden!! dann folgt scheinbar ein Reset und es geht von vorne los :( Ich vermute es hat etwas mit dem EEprom zu tun? Desweiteren konnte ich mit diesem Define nix anfangen, da ich weder im datenblatt das mega128 noch 32 etwas dazu gefunden habe: # define EICR EICRB Würde mich über tipps freuen :)
Hallo, EICR ist ExternalInterruptControlRegister beim Mega32 und Mega128 da ich in diesem SourceCode keine Interrupts benutze kann man dieses ersatzlos löschen. Ich nehme mal an, das der Mega16 ein bisschen wenig Speicher hat. Mfg Ulrich
Tach, bin grad dran meinen MP3 Player zu basteln (mit VS1011). Hab da irgendwie ein Verständnissproblem mit dem CS Pin der MMC: Ich sende der MMC Karte das Kommando 11 (READ), dann lese ich byte für byte aus der MMC aus. Soweit ok. Auch habe ich festgestellt, dass es der MMC nix ausmacht wenn man mal mittendrin den CS auf high zieht und wieder auf low drückt, es geht dann einfach da weiter wo man aufgehört hat. Allerdings scheint die MMC immer noch auf die Clock Leitung zu reagieren; wenn ich CS der MMC auf high ziehe und dem MP3 IC ein Kommando schicke (4 Bytes lang) und ich dann mit dem lesen von der MMC weitermachen will bin ich bereits 4 Bytes weiter, grummel... Gehört das so ??? Eigentlich sollte doch die MMC, oder allgemein ein SPI Slave, schlafen wenn dessen CS low ist ? Diese MMC hier scheint aber lediglich den Datenausgang hochohmig zu schalten. Wie ist das dann mit dem Kommando 12 (STOP) ? Habe versucht das der MMC mittendrin zu senden, ist ihr aber egal, die will erst ihre 512 Bytes losbekommen. (Sau). Im Datenblatt steht beim Kommando 11 (READ_DAT_UNTIL_STOP): Reads Datra stream from the card, [...] until a STOPTRANSMISSION (Kommando 12) follows. Häää ?? Check ich nicht. Innerhalb eines Blockes will die MMC kein Kommando annehmen, und nach 512 Bytes kommen nur noch 0xFFs raus, man muss also für jeden Sektor wieder das Kommando 11 schicken. Ob sich hier jemand findet der mir das eben ins Licht rücken kann ? Stefan
CS ist für mehrere Karten an einem Bus. So kann man einen großen Speicher aus mehreren kleinen Karten bauen. Das Lesen/Schreiben funktioniert generell nur in 512 Byte-Blöcken.
Hi, @uli Ich hab den Source mal versucht zu compilieren, allerdings scheint dies nicht zu klappen, da ich nicht die selbe gcc version benutze wie du. Ich hab schon zwei verschiedene Versionen ausprobiert und bei beiden kriege ich fehler, weil der gcc irgendwelche includes nicht finden kann. Desshalb; welche Version verwendest du? mfg Nik
Hallo, hab noch ein bischen was rausgefunden wegen der CS Sache: Während eines Lesevorgangs (Block-Lesen-Modus) wird mit dem CS Pin lediglich der Datenausgang hochohmig geschaltet. @Rolf: Lesen geht auch mit anderen Blockgrößen als 512 Bytes ! Ich hab in meinem MP3 Player die Karte auf 32 Bytes gestellt, da der VS1011 eben immer 32 Bytes anfordert. So kann ich pro Anforderung ein Lesekommando senden und die 32 Bytes rüberschieben und kann danach den SPI Bus wieder für was anderes verwenden. Möge das den MP3/MMC Bastlern eine Hilfe sein :-) Stefan
@Stefan: Einige Karten können auch andere Blockgrößen verarbeiten, aber der Standard schreibt nur 512 Byte-Blöcke vor. Damit mein Treiber mit allen Karten arbeiet, verwende ich nur 512 Byte-Blöcke.
@Rolf: Kannst du mal ausprobieren ob du eine Karte hast die NICHT andere Blockgrößen als 512 Bytes LESEN kann ? Laut Hitachi-Standard ist lesemäßig eine andere Blockgröße immer unterstützt (aber nicht über 512 Bytes-Grenzen hinweg). Schreibmäßig hingegen steht im Standard dass man nur 512er Blöcke schreiben kann, hier gibts aber einige die auch hier variable Blockgröße verarbeiten können. Stefan
@Stefan: Keine Lust und derzeit bin ich auf Arbeitsplatzsuche weil arbeitslos. Zudem nützt es wenig 20 Karten zu finden mit denen es geht; es gibt sicherlich einige mit denen es nicht geht. Schließlich halten sich die Karten nur ungefähr an den Standard, so daß ich da einiges ausprobieren mußte, damit der Treiber bei allen getesteten Karten funktioniert. Ein Kollege, der mal Tipps zu MMC/SDC von einem Kumpel in den Treiber (für MSP430) einbaute, hat damit sogar das Schreiben sabotiert; es wurde dadurch eine Woche lang nur Datenmüll geschrieben. Auch deshalb ist da mein Motto "Never change a running System." und nur Patches akzeptieren, die auch getestet wurden.
Ok, hmmm, werd mir vermutlich dann nen Workaround einfallen lassen müssen... Noch was anderes: Wie kann man eigentlich am PC die CSD/CID Register auslesen ?? Irgendwie muss dass ja gehen, Windows selbst tut das ja um zu wissen wie es die Karte formatieren muss. Aber wie ?? Stefan
Dafür brauchst Du die entsprechenden Bibliotheks-Funktionen (falls es die gibt) oder mußt die Ausgaben in den Treiber reinschreiben (sowas habe ich mal gemacht auf ARM9).
Warum sind eigentlich die Kommandos bei Stefan Seegel im Vergleich zu Ulrich Radigs Bibliothek verschieden? Sektor Lesen: Ulrich: unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; addr = addr << 9; //addr = addr * 512 CMD[1] = ((addr & 0xFF000000) >>24 ); CMD[2] = ((addr & 0x00FF0000) >>16 ); CMD[3] = ((addr & 0x0000FF00) >>8 ); Stefan: cmd[0] = 0x40 + MMC_READ_SINGLE_BLOCK; cmd[1] = (adr & 0xFF000000) >> 0x18; cmd[2] = (adr & 0x00FF0000) >> 0x10; cmd[3] = (adr & 0x0000FF00) >> 0x08; cmd[4] = (adr & 0x000000FF); cmd[5] = 0x95; Bei Stefan ist MMC_READ_SINGLE_BLOCK als 17 definiert ist. Es geht mir nicht um die Adressen, sondern um cmd[0] bzw. cmd[5].
Der CRC wird wird im SPI Modus der MMC/SD Karten nicht verwendet (außer beim allerersten Kommando nach dem Einschalten welches die Karte in den SPI Mode schaltet). Man CRC aber auch für den SPI Mode einschalten.
Woran sollte man drehen, wenn Schreibzugriffe nicht arbeiten? Es gibt zwar sowohl beim Lesen wie auch beim Schreiben keinen Fehler, allerdings lassen sich von der MMC nur Nullen lesen. Das Lesen von CSD und CID arbeitet ohne Probleme (somit auch die Initialisierung). CID: 01 00 00 20 31 32 38 4D 42 01 30 01 3E 8D 48 2D CSD: 8C 26 00 2A 17 59 81 E8 F6 DA FC E0 96 40 40 BD Schon mal danke für eure Hilfe. Mike
hallo, ich verstehe nicht ganz wie das mit der FAT funktioniert. anbei ein bild von der MBR, also sector 0 auf meiner SD card. die sieht mehr als seltsam aus. besonders das an der stelle 0x01C6, woe die VBR stehen sollte nur buchstaben stehen. mit der funktion FAT_ADDR() wird der wert 25933 zurück gegeben, aber im sector 25933 ist nix. grüsse
Hallo, Zum erstellen eines Dateisystem auf der MMC Karte empfehle ich Linux! Zuerst FDISK hier wird eine Partition eingerichtet Dateisystemtyp (6 FAT16). Danach wird diese mit MKDOSFS formatiert. Fertig!! Probleme mit meinen FAT System gibt es nur, wenn die MMC Karte nicht partitioniert wurde. Mfg Ulrich
ähm.. ich kann meine SD card garnicht partitionieren. unter datenträgerverwaltung kann man die SD card nur formatieren. und mit partionsmagic ist die auch nicht zu sehen. ich kann die nur formatieren. ich hatte mal die sectoren wahllos beschrieben mit irgendwas. kann es darum sein, das die nicht zu partitionieren ist ? grüsse
Die Speicherkarten sind Mass Storage Devices; aus Software-Sicht gibt's da keinen Unterschied zu IDE- oder SCSI-Festplatten. Das MS-Windoof hat damit aber einige Probleme: Wenn man formattiert, wird automatisch partitioniert und ungefragt alles plattgemacht, was außer der ersten Partition sonst noch auf der Karte ist! Außerdem kann MS-Windoof nicht auf das zugreifen, was hinter der ersten Partition liegt, auch wenn es nur primäre Partitionen mit FAT sind. Und das Superfloppy-Format bekommt MS-Windoof auch nicht hin. Deshalb ist Linux besser.
Hallo, Ich habe doch was geschrieben! Wenn kein Linux auf deinen Rechner hast dann benutze doch Knoppix. Mfg Ulrich
Achso, davon hatte ich mich nicht angesprochen gefühlt :) Ein Dateisystem möchte ich garnicht haben, wollte lediglich die Befehle read_sector (...) und write_sector (...) nutzen. Darauf bezog sich auch meine Frage.
hallo, soweit ich nun herausgefunden habe, hat eine MMC die mit windows FAT formatiert wurde keine MBR, sondern die volume bootrecord fängt im sector 0 an. demnach klappt der code von Ulrich doch nur, wenn ich die FAT mit linux mache, also so wie es auf eine HDD wäre, mit MBR und VBR. ist das richtig ? grüsse
@marcelKo: Du meinst das Superfloppy-Format, bei dem die ganze Karte als erste und einzige Partition verwendet wird, so wie auf einer Floppy. Da entfällt der MBR.
hi, ne, ich meine das ganz normale FAT ( FAT16 ), wenn ich die MMC mit windows formatiere. im anhang ein bild von dem sector 0 von meiner SD card. das sieht aus wie die VBR und nicht wie die MBR. grüsse
Das ist ein MBR mit Partitionstabelle. Der "Bootloader" steht am Anfang und die erste Fehlermeldung steht auch dort.
hi, das bedeutet also, ich muss zuerst mal schauen, ob an der VBR andresse was sinnvolles steht. fals da eine fehlermeldung steht, dann nehme ich VBR offset von 0x00 und fals da ein offset steht, nehme ich den offset ? froi ich hab nun endlich mal FAT vollständig verstanden. das war eine schwere geburt ;) grüsse
hallo, nun hab ich ein seltsames problem. ich hab nun auch eine nokia 32MB mmc getestet. das ist es so wie es sein sollte. der MBR steht im sector 0 mit dem offset auf den VBR, der in sector 64 ist. wieso ist das bei der SD card anderes ? da ist kein MBR vorhanden, sondern nur der VBR im sector 0. ich hatte anfangs wahllos die sectoren beschrieben bei den ersten tests mit der SD card, sodass die digitalcam die karte nicht mehr erkannt hat. auch nach windows formatierung hat die digicam die karte nicht erkannt. erst nachdem ich die karte mit dem avr formatiert hatte, indem ich alle sectoren mit 0 gefüllt hatte, hat die digicam die karte wieder erkannt. kann es sein, das bei den ersten test, wo ich die sectoren wahllos beschrieben habe, das ich da irgendwelche protect bits gesetzt habe ? grüsse
Hallo, Eine gekaufte MMC/SD Karte hat eine Partition, wird die Partitionstabelle beschadigt kann es vorkommen das Windows die MMC/SD karte Formatiert ohne eine Partitionstabelle anzulegen, also im Grunde wie eine Diskette behandelt. Um sicher zugehen fdisk und mkdosfs unter Linux benutzen. Mfg Ulrich
hallo, das problem mit dem MBR hat sich nun erledigt. es war tatsächlich ein write protect drauf. mit dem command MMC_CLR_WRITE_PROT sieht nun die karte aus wie normal. grüsse
Hallo! Ich habe die ARM bzw AVR Sourcen von Ulrich Radig auf einen 16Bit Fujitsu Microcontroller portiert. RAW MMC Zugriff mittels der Funktionen in mmc.c funktioniert gut. FAT Zugriff jedoch leider überhaupt nicht.(kein Directory Listing und keine index.htm) Zur Simulation des EEProm habe ich den selben Trick wie in den ARM Sourcen verwendet:
1 | #define EE_CLU_SIZE (&DUMMY_EEPROM[0])
|
2 | #define EE_CLU_OFFSET (&DUMMY_EEPROM[2])
|
3 | #define EE_VBRA (&DUMMY_EEPROM[4])
|
4 | #define EE_FAT_OFFSET (&DUMMY_EEPROM[6])
|
5 | |
6 | unsigned char DUMMY_EEPROM[10]; |
7 | |
8 | #define eeprom_read_byte(a) (unsigned char)*(a)
|
9 | #define eeprom_write_byte(a,b) *a = b
|
10 | |
11 | #define eeprom_read_word(a) (unsigned int)*(a)
|
12 | #define eeprom_write_word(a,b) *a = b
|
Die SD Karte habe ich folgendermassen partitioniert/formatiert: Disk /dev/sda: 2 heads, 60 sectors, 1009 cylinders Units = cylinders of 120 * 512 bytes Device Boot Start End Blocks Id System /dev/sda1 1 1009 60510 6 FAT16 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@edison mnt]# mkfs.msdos -F 16 -f 1 -R 1 -v -S 512 /dev/sda1 mkfs.msdos 2.8 (28 Feb 2001) /dev/sda1 has 2 heads and 60 sectors per track, logical sector size is 512, using 0xf8 media descriptor, with 121020 sectors; file system has 1 16-bit FAT and 4 sectors per cluster. FAT size is 119 sectors, and provides 30217 clusters. Root directory contains 512 slots. Volume ID is 42f0e634, no volume label. Inhalt nach Cluster_Data_Store sieht folgendermassen aus: Cluster info: 0x01 00 81 00 3C 00 01 00 00 00 Sector 0 der SD Karte sieht folgendermassen aus: Data at address 0: 0xEB3C906D6B646F7366730000020401000100020000F877003C000200000 0000000D9010000002954DFF042202020202020202020202046415431362020200E1FBE5 B7CAC22C 0740B56B40EBB0700CD105EEBF032E4CD16CD19EBFE54686973206973206E6F742061206 26F6F746 1626C65206469736B2E2020506C6561736520696E73657274206120626F6F7461626C652 0666C6F7 0707920616E640D0A707265737320616E79206B657920746F2074727920616761696E202 E2E2E200 D0A000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 000000000000000000000000000000000000101000601FCF03C000000BCD801000000000 00000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000 055AA und als String: ë<mkdosfsøw<Ù)TßðB FAT16 ¾[|¬"Àt V´»Í^ëð2äÍÍëþThis is n ot a bootable disk. Please insert a bootable floppy and press any key to try again ... üð<¼ØUª Hat jemand eine Idee was ich noch falsch machen könnte? (Sourcen habe bereits 2x verglichen) Ist die SD-Karte richtig formatiert? Vielen Dank für Eure Hilfe LG Fritz
Ich habe eine Index.htm und test.txt und ein Verzeichnis test auf der 16MB MMC. Mit Einer SD-Card 16MB passiert auch das gleiche. CPU: ATMEGA128L 8MHz 5V, Karte hat 3,3V. Mit dem Editor von XP erstellt. Mit der V2.4 von U. R. bekomme ich folgende Ausgabe über Hyperterm mit Baud 19200: System OK Karte gefunden!! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Directory Directory Ende FERTIG!! Ist das Richtig? Wie muß den die Ausgabe ausehen? Wenn es nicht richtig ist was ist falsch? Wieso sind soviele Nullen ? Und warum wird kein Verzeichnis angezeigt? mfg Dirk
Warum ? Gehts nicht mit einen MEGA128? :-( Werde ich mal ausprobieren, aber klar ist mir das nicht.
Hallo, Sorry, ich hatte was von mega16 im Kopf. Dann liegt es wohl daran das auf der MMC/SD Karte keine Partition vorhanden ist oder kein FAT16 Filesystem. (meistens keine Partition da mit Windows nur formatiert wurde, ich empfehle Linux fdisk und mkfsdos) Gruss Ulrich
Unter Koppix 3.9 Live CD komme ich nicht auf mein USB-Kartenlesegerät http://www.mikrocontroller.net/forum/read-7-260520.html#260933 Gibts da vielleicht eine andere Lösung ? Ich bin am verzweifeln!
Hallo zusammen, ich wollte eigentlich das SD Karten Modul "µMMC" von Rogue Robotics (=>www.roguerobotics.com) an meinen µC anbinden, um damit 7 - 9 Bytes an Daten alle 10ms abspeichern zu können. Nun musste ich leider feststellen, dass das nicht ganz so funktioniert, da mir das Modul erst nach einer Zeit von ca. 160ms das ok gibt, weitere Daten zu senden. Meine Frage ist nun: ist es überhaupt möglich mit einer derartigen Karte (64MB SD-Karte, FAT16 oder FAT32) eine Schreibgeschwindigkeit von ein paar ms für das Schreiben von 7 - 9 Bytes hinzubekommen oder ist das eher aussichtslos? Weil dann würde ich mich eben selbst an die Implementierung des Befehlssatzes für das Schreiben auf SD karten machen um bessere Zeiten zu erreichen. MFG und Danke schon mal für eure Beiträge! Christoph
Hi, mach doch einfach einen Puffer von etwa 160/10 * 10 Byte und schreib immer erst, wenn der Puffer voll ist. Je groeßer dieser Puffer wird, desto besser sollte auch der Schreibdurchsatz sein. Gruss Tobias
Frage habt dir alle die FAT16 mit Linux gemacht? Oder gibts auch ein Tool welches man unter XP benützen kann , welches auch für diesen MMC Anwendungfall klappen soll?
Bei mir funktioniert das Lesen der MMC auch mit Windows-FAT-16. Einfach ausprobieren. Kaputt gehen kann deswegen nix. ;-) Spendiert bitte der MMC einen 3,6V Spannungsregler. Mit den zwei Dioden klappte es bei mir überhaupt nicht. Gruß Elektrikser
So ich habe unter Winodow mit format LW: /fs:FAT /a:512 eine 16MB MMC und eine 16MB SDCard formatiert. Mit der Speicherbelegung wird 6,9 MB angezeigt -> MMC Bei der SD-Karte sind es 14,9 MB -> SD-Card. Bei beiden bekomme ich egal ob ich 3,3V oder 3,6V habe. " Keine Karte gefunden " Wenn ich die Karte mal rein und rausziehe, bekomme ich ab und zu als Meldung karte gefunden. dann kommt nichts, oder ab und zu Karte gefunden!! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Directory Directory Ende FERTIG!! Im Hex Editor wird MSDOS 5.0 bla,bla FAT16 angzeigt und als letztes auch "fehlermeldung weiter mit gedrückter Taste" Noch was einmal die Meldung - Karte nicht gefunden schneller oder mal langsamer auf dem Bildschirm. DO ist direkt am µC angeschlosen Pb.0 der Rest über Spannungteiler angeschlossen. Wenn ich keine Karte drinne habe , kommt auch Karte gefunden!! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Directory Directory Ende FERTIG!! oder nur "Karte gefunden" Die spannungstabi wurde mit R und Z-Diode gemacht - 3,62V und der Rest hat 3,6V oder sonst bei 3,3V - 3,3V. So wo könnte das Problem liegen?
Hallo, in den Thread http://www.mikrocontroller.net/forum/read-4-256520.html hab ich ein kleines Tool gestellt mit dem man einen Master Boot Record als Datei erzeugen kann. Selbigen kann man dann anschließend mit einem Disk-Hex-Editor auf die MMC Sektor 0 schreiben. @Dirk: Ist denn sichergestellt dass auf der Karte auch eine Partitionstabelle vorhanden ist und nicht nur der Volumebootrecord auf Sektor 0 ist ? @alle: Wie könnte man der FAT Implementierung beibringen zu unterscheiden ob in Sektor 0 ein VBR oder ein MBR ist ? Haben ja dummerweise beide den "Magic-Code" 0x55AA am Ende. Stefan
@seegel: Also FAT16 Type4 habe ich jetzt auf der 16MB MMC drauf gemacht und unter XP Formatiert. C:\DOKUME~1\DIRKM~1>format k: /fs:FAT /a:512 Legen Sie eine neue Diskette in Laufwerk K: ein, und drücken Sie die EINGABETASTE. Der Typ des Dateisystems ist FAT. Überprüfung von 6 MB Die Dateizuordnungstabelle (FAT) wird initialisiert... Volumebezeichnung (11 Zeichen, EINGABETASTE für keine)? Formatieren beendet. 7.245.824 Bytes Speicherplatz auf dem Datenträger insgesamt 7.245.824 Bytes auf dem Datenträger verfügbar 512 Bytes in jeder Zuordnungseinheit 14.152 Zuordnungseinheiten auf dem Datenträger verfügbar 16 Bits in jedem FAT-Datensatz. Volumenummer: A481-2714 Wenn ich jetzt die Karte einsetze bekomme ich folgende Meldung System OK ** Keine MMC/SD Karte gefunden!! ** Karte gefunden!! Da war es, sonst kommt nicht - habe nach 3min abgebrochen. Auf der Karte ist eine datei mit den Namen mmc.txt 21K gross Was müsste ich sehen - der Name der Datei? liegt das Problem jetzt an der MMC oder an der µC Hardware ? Anbei die FAT16 type 4
Nachtrag : System OK ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** ** Keine MMC/SD Karte gefunden!! ** Karte gefunden!! kommt auch wenn ich keine drin habe Wenn ich die Karte drin habe kommt meist: ** Keine MMC/SD Karte gefunden!! ** Verstehen tu ich es nicht.
Hmm, klingt mir irgendwie nach einem Hardwarefehler, dass z.B. irgendwas an den Pins floatet, aber auch das mit den 8MB kommt mir komisch vor, schließlich ist es ja eine 16MB Karte. Stell sicher dass du den MBR auch wirklich auf den physikalischen Sektor 0 der Karte schreibst, wenn man mit einem Diskeditor anstelle des physikalischen Laufwerkes nur die Partition öffnet ist im Diskeditor der Sektor 0 der erste Sektor der geöffneten Partition... Aber vermutlich hat der Fehler (noch) nichts mit der Partitionsgeschichte zu tun, der generelle Zugriff auf die MMC Karte hat offensichtlich schon nicht richtig hin. Was anderes fällt mir ansonsten auch nicht mehr ein. Stefan
OK - ich überarbeite die Hardware mal und melde mich dann. Frage : wie sieht denn deine Schaltung aus ist es die gleiche wie bei Ulrich R. auf der HP hat, oder sind die PINs direkt am µC? Muss noch bei DO ein Pullup oder Pulldown rein habe im Moment keinen drin. Kann der Spannungteiler die Ursache sein? Und wie sieht deine Karte aus ? bekommt du beim Formatieren die ~16MB raus und mit was und mit welchen einstellungen Formatierst du das ? Nach deiner Antwort werde ich mal - Experimentieren - Noch einer ein Tip?
Meine Schaltung: µC <-> MMC MISO <-> DO MOSI <-> DI über Spannungsteiler SS <-> CS (wichtig!) über Spannungsteiler CLK <-> CLK über Spannungsteiler Betriebsspannungserzeugung von 3.3 Volt mit LM317 16 MB MMC mit meinem Tool partitioniert (eine Partition, Typ 4 aus welcher dann Windows FAT12 gemacht hat) Stefan
Hi, ich hab mich jetzt auch mal an die SD-Card mit dem hier verwendeten Code rangewagt. Ich hab leider noch ein Problem mit den SD-Cards: Während der Initialisierung bekomme ich als Antwort auf CMD0 bei einer MMC Card wie erhofft sofort eine 0x01 zurück, jedoch bei einer SD-Card(SanDisk 64MB) beim mehreren Durchläufen erst eine 0x3F, und anschließend zyklisch 0x05 und 0xBF zurück. Hat jemand eine Ahnung, was hier abgeht? Hat jemand für mich eine Beschreibung aller CMDs? Die Links, die hierzu schon gegeben wurden, sind nicht zu erreichen. Danke Günther
Hallo, Gehe mal auf meine Seite da sind weitere Infos und der neuste Source Code. Gruss Ulrich
Hallo Ulli, danke für Deine prompte Hilfe. Ich benutze schon Deine aktuelle Version 2.4 (Mit Korrektur laut des Forums auf Deiner homepage). Das Hitachi datasheet hatte ich übersehen, jetzt weiss ich wenigstens über die CMDs bescheid. Ich habe aber immer noch das Problemchen mit der SD Card von SanDisk (eine zweite gleichen Typs reagiert genauso). Die Pegel sind alle sauber und sind auf 0V und 3,3V. Wie gesagt: mit einer Canon 16MB MMC Card funzt es, nur die SanDisk SD Card muckt rum und schickt eine andere response. Schöne Feiertage Günther
Şimdiki Sd kartların işletim sistemi ya fat yada fat16 olur çünkü bu dosya yönetim programları basittir.
Hallo, ich habe den Code von Ulrich Radig auf den MSP430 portiert. Ging am Anfang recht problemlos. Die Karte wird auch gefunden. CSD Register wird ausgelesen. Allerdings habe ich dann Probleme beim Auslesen des Rootdirectory. Der Code von Ulrich berechnet das ab Sector 576 das Rootdirectory liegen sollte. Es liegt aber ab Sector 551. Wenn ich die Berechnung deaktiviere und fix 551 reinschreibe, wird das Root Verzeichnis ausgelesen. Was kann an der Berechnung schief laufen? Hier noch ein paar Daten: Hinten angehängt immer die ausgelesenen Daten. volume_boot_record_addr 64 cluster_size 1 fat_offset 2 cluster_offset 592 CSD 8c, 26, 0, 2A, 0F, 59, 1, E9, F5, D9, 83, E3, 92, 40, 40, D3 U08 BS_jmpBoot[3]; U08 BS_OEMName[8]; U16 BPB_BytesPerSec; //2 bytes 00 02 U08 BPB_SecPerClus; 01 U16 BPB_RsvdSecCnt; //2 bytes 00 02 U08 BPB_NumFATs; 00 U16 BPB_RootEntCnt; //2 bytes 02 c0 U16 BPB_TotSec16; //2 bytes f4 f8 U08 BPB_Media; f3 U16 BPB_FATSz16; //2 bytes 00 3f U16 BPB_SecPerTrk; //2 bytes 00 ff U16 BPB_NumHeads; //2 bytes 00 40 U32 BPB_HiddSec; //4 bytes 0 0 0 0 U32 BPB_TotSec32; //4 bytes 0 0 0 0
Hallo, nachdem ich mit dem Partitionieren von MMC / SD-Cards unter XP bzw. Knoppix fast wahnsinnig geworden bin, war ich so frei, Ulrichs Code dahingehend zu ergänzen. Damit ist man unabhängiger von der Partitionierungs/Formatierungsart... Evtl. Kritik gerne an mich ;-) Viel Spass! Dennis (der jetzt den Grill anwirft ;-)
Hallo! Hat jemand erfahrungen mit einer Kingston 128MB SD-Card, bzw. funktioniert diese überhaupt mit diesem Code? Würde mir gerne so eine zur Verwendung mit diesem Code kaufen. gruß, Bernd
Hallo Bernd, wenn man ernsthaft den Code von Ulrich in ein eigenes Projekt integrieren möchte, sollte man das nicht unbeding davon abhängig machen, o der Code mit DISER speziellen Karte läuft, bzw. es gibt garantiert einige andere "Problemchen" bei der Umsetzung (SW und HW), die die eine Karte zum unwichtigsten Glied der Kette werden lassen... Ich habe inzwischen eine ganze Hand voll MMC und SD-Cards... Jedenfalls funktionieren diese bei mir alle ausnahmslos mit Ulrichs Code + Erweiterungen, wenn sie FAT16 formatiert sind (und die Hardware sauber aufgesetzt ist). Eine Kingston ist leider nicht dabei (16MB "Canon", jede Menge 32MB MMC Karten aus Handies, 256MB Toshiba, 512MB Toshiba). Gruß, Dennis
Ich habe eine Kingston 256 MB, die mit diesem Code funktioniert. Gruß Elektrikser
I have bought a 1Gb MMC for a nokia phone but it would not work in a normal card reader, the write protection message was there all the time. I have now put the card in my Nokia 9210i communicator and formatted it. With the cable and software that is provided with the communicator I can now download pictures and MP3 files to the MMC and use it in a different phone. Regards John Wright
Hallo, ich habe mal eine kurze Frage, Ich bin gerade dabei ein GPS tracker zu bauen. Das teil funktioniert auch schon soweit. Ich möchte nun die anfallenden Daten in eine TXT datei auf meiner mmc karte speichern. Wie kann ich den nun Char Datentypen in diese Datei schreiben,(die datei existiert schon auf der Karte, mit Xp auf fat16 formatiert). Ich wollte den Code von Uli benutzen. Ach ja ich benutze ein Atmega8, da ich Portb schon für das Display benutze würde ich gener Port c nehmen, geht das? Schon mal vielen Dank Gruß Peppe
Hallo, wenn sich nur und ausschließlich die TXT-Datei auf einer FAT16 formatierten Karte befindet, geht das recht einfach. Ulis Code bietet einmal die Möglichkeit, nach Dateinamen zu suchen. D.h. so kommt man über den Directory-Eintrag ganz fat-konform zum Startcluster der Datei. Da nur diese Datei enthalten ist und die Karte formatiert war, kann man anschließend Block für Block (512 byte) mit den gewünschten daten "hintereinander weg" schreiben. Anschließend kann man alles am PC auslesen. Für die Anbindung zum MEGA empfehle ich die Verwendung der SPI. Dieses liegt leider an Port B... Software SPI wird von Ulis code auch unterstützt, ich weiss aber nicht, wie zuverlässig das läuft. Viel Glück! Dennis
Danke für die Informtion, das bedeutet ich muß die lese routine drin lassen, wollte eigentlich drauf verzichten um Platz zu sparen, werde das mal mit der Soft spi ausprobieren, die platine ist schon geätzt und fast fertig bestückt, war mal wieder ein wenig voreilig... Wenn ich das richtig verstanden habe muß ich dann ersteinmal die datei suchen, mir den block ausgeben lassen und von da an alles hintereinnader egschreiben lassen, richtig? Gruß Peppe
Hallo,
Hmmm, ja, also Display, GPS und SD/MMC-Card könnte arg knapp werden,
mit nem MEGA8. Ich habe zusätzlich noch nen Beschleunigungssensor
auszuwerten und nen Lautsprecher für Pieptöne und damit nen MEGA16 zu
99% voll...
> mir den block ausgeben lassen und von da an alles
Ja, genau so ist es! Startcluster zurückgeben lassen, das übergeben an
die Schreibroutine und munter Block für Block (je 512 byte) schreiben,
wenn der Buffer voll ist.
Bis dahin ist es allerdings noch ein Stück des Weges... Schau erstmal,
dass die Initialisierung der Karte klappt (wie ist die
Spannungsversorgung? Alles 3,3V? Oder über "Pegelwandler"?)
Ciao,
Dennis
Nochmal eine Idee: Du kannst auch das Startcluster der Datei auf der Karte am Rechner ermitteln (z.B. mit Hex Workshop) und dann die Adresse fest in deinem µC Code angeben. Dann brauchst Du die Leseroutinen und die FAT-Routinen wirklich nicht, sondern nur die rel. kleine Schreibroutine (Write Block). Funktioniert dann aber nur mit dieser Karte (und der entsprechenden Formatierung). Sollte die Dateiposition am PC (unbeabsichtigt)manipuliert werden, geht nichts mehr. Dennis
Soetwas hatte ich mir auch schon überlegt, dass ich nur die write routine nehem, wusste nur nicht wie ich an die blocknummer komme, danke für den tip. ich werde es erstein mal mit der minimal beschaltung von Uli versuchen,wenn das nicht klappt dann werde ich ein 3,3V Stabi einsetzen. Sollte das richtig funktioniert, werde ich die Lcd routine wieder rausschmeissen und mich auf die mmc beschränken. Dann habe ich noch ein wenig platz für die Anbindung ans handy. Am ende möchte ich ein Gps - logger haben, mit dem ich meine Fahrstrecke und die Höchstgeschwindigkeit loggen kann und zusätzlich die Möglichkeit habe, via Sms die aktuell position abzufragen.Im Falle,dass mein Motorrad mal geklaut wird... Gruß Peppe Schon mal recht herzlichen Dank an Uli der seinen MMC code zur verfügung gestellt hat.
Ich hab gerade versucht, die aktuellste Version von Ulrichs MMC-Ansteuerung zu kompilieren. (Version 2.5) Leider kommen Fehlermeldungen :-( avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 main.c -o main.o main.c: In function 'main': main.c:65: warning: passing argument 1 of 'fdevopen' from incompatible pointer type main.c:65: error: too many arguments to function 'fdevopen' main.c:103: warning: pointer targets in passing argument 1 of 'printf' differ in signedness main.c:110: warning: pointer targets in passing argument 1 of 'fat_search_file' differ in signedness make.exe: *** [main.o] Error 1 Kann mir jemand sagen, was ich genau ändern muss?? Vielen Dank für eure Hilfe!!! Gruß, Werner
Hallo, ich habe mich jetzt ne Weile mit meiner 64 MB SD Karte und dem Code von Ullrich Radig beschäftigt und habe nun ein kleines Problem. Ich habe die SD Karte mit FAT in Win XP formatiert und eine Datei darauf erstellt. Diese Datei kann ich mit dem Code von Uli auch auslesen und mir über UART ausgeben. Nun wollte ich etwas in diese Datei hineinschreiben aber dabei hängt sich alles auf. Ich arbeite mir dem AVRstudio und einem Atmega32. Das ist mein Code, mit dem ich versuche etwas auf die SD Karte zu schreiben:
1 | if (fat_search_file((unsigned char*)"Daten.txt",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1) |
2 | for (int b = 0;b<1;b++) |
3 | {
|
4 | fat_write_file (Clustervar,Buffer,b); |
5 | }
|
Ich habe auch schon b bis 52 laufen lassen aber es bleibt immer hängen. Was habe ich vergessen? Gruß, Marian
Nochmal Hallo, ich muss mich etwas korrigieren. Wenn ich nur beschreiben will,arbeitet der Atemga den Schreibbefehl ab aber die Datei auf der SD-Karte bleibt trotzdem leer. Wenn ich beschreiben und danach auslesen will, kommt der µC nicht mehr zum auslesen, er bricht wohl irgendwie nach dem schreiben ab.
So Jungs, ihr könnt eure Glaskugeln wieder einpacken :). Das Problem war, dass man ja nach dem beschreiben die Clustervariable wieder 0 setzen muss um sie danach auslesen zu können. Trotzdem danke :)
Hallo, vielleicht kann mir hier jemand helfen. Ich hab es doch tatsächlich hingekriegt, dass ich auf meiner SD Karte das CSD Register umgeschrieben hab!!! Ich verzweifle bald! Gibt es ne Möglichkeit, das wieder in den Urzustand zurückzuversetzen, oder es durch einen Befehl oder ein kleines Programm zu verändern??? HILFE!!!!!!!!!!!
bekomme diese fehlermeldung mit winavr-c 22.01.2007 mmc-version 2.4 : main.c:65: error: too many arguments to function 'fdevopen' was muss hier geändert werden ?
1 | int main (void) |
2 | { |
3 | //Initzialisierung der seriellen Schnittstelle |
4 | IOInit(); |
5 | |
6 | //öffnet einen kanal für printf |
7 | fdevopen (uart_putchar, NULL, 0); |
8 | |
9 | //Initialisierung der MMC/SD-Karte |
10 | printf ("System OK\n\n"); |
11 | while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten |
12 | { |
13 | printf("** Keine MMC/SD Karte gefunden!! **\n"); |
14 | } |
15 | printf("Karte gefunden!!\n"); |
16 | |
17 | Cluster_Data_Store();//laden Cluster OFFSET und Size ins EEPROM |
18 | //Initialisierung der MMC/SD-Karte ENDE! |
19 | |
20 | unsigned char Buffer[512]; |
21 | unsigned int tmp; |
22 | |
23 | Read_CSD_MMC (Buffer); |
24 | |
25 | for (tmp = 0;tmp<16;tmp++) |
26 | { |
27 | printf("%x ",Buffer[tmp]); |
28 | }; |
29 | |
30 | |
31 | |
32 | |
33 | //Ausgabe des Root Directory |
34 | unsigned int Cluster; |
35 | unsigned char Dir_Attrib = 0; |
36 | unsigned long Size = 0; |
37 | printf("\nDirectory\n\n"); |
38 | for (char a = 1;a < 240;a++) |
39 | { |
40 | Cluster = Read_Dir_Ent(0,a,&Size,&Dir_Attrib,Buffer); |
41 | if (Cluster == 0xffff) |
42 | { |
43 | break; |
44 | } |
45 | tmp = (Size & 0x0000FFFF); |
46 | printf("Cluster = %4x DirA = %2x Size= %8d FileName = ",Cluster,Dir_Attrib,tmp); |
47 | printf(Buffer); |
48 | printf("\n"); |
49 | } |
50 | printf("\nDirectory Ende\n\n"); |
51 | |
52 | //Lade Cluster für das index.htm File in den Speicher |
53 | Cluster = 0;//suche im Root Verzeichnis |
54 | if (Search_File("index.htm",&Cluster,&Size,&Dir_Attrib,Buffer) == 1) |
55 | { |
56 | printf("\nFile Found!!\n\n"); |
57 | //Lese File und gibt es auf der seriellen Schnittstelle aus |
58 | for (int b = 0;b<52;b++) |
59 | { |
60 | Read_File (Cluster,Buffer,b); |
61 | for (int a = 0;a<512;a++) |
62 | { |
63 | printf ("%c",Buffer[a]); |
64 | } |
65 | } |
66 | } |
67 | |
68 | printf("FERTIG!!\n"); |
69 | //Hauptprogramm läuft ständig in einer schleife und macht nichts |
70 | while (1) |
71 | { |
72 | } |
73 | return (1); |
74 | } |
mfg
geht das nur mit "printf ("System OK\n\n")" und einem lcd nicht einfacher? wo bekomme ich dafür eien lösung? mfg
Ahoi, habe mal 2 Fragen zur Anbindung der MMC: Und zwar hab ich ne Beispiel-Schaltung und Code von VLSI mit der der DSP von der Karte mit Daten versorgt wird. Dazwischen hängt ein AT89C51ED2. Die haben die VCC der MMC über nen Transistor und Port geschaltet. So wird die vor jedem Init der MMC aus/an geschaltet und dann CMD1 gesendet. In meiner Schaltung ist das jetzt noch nicht drin, ist das unbedingt notwendig? Im PDF von Sandisk ist die Rede von 50ms Dauer nach PowerUp bis die Karte CMD1 verarbeitetn kann. Wenn wir erst LCD und DSP initialisieren, kriegt die Karte die ganzen Daten ja über die Bus-Leitung mit... Weiter steht in dem PDF, daß die Karte für die Dauer der Identifikation "nur" 400kHz Takt schafft. Also muß ich das Hardware-SPI für CMD1 und CID-Auslesen erst runtertakten? In dem Source von Ulrich ist das ja auch erst langsam geschaltet, bevor er auf volle Geschwindigkeit umstellt.
Andere Frage: Die Karte scheint jetzt auf die Commandos 0 und 1 zu antworten. Auf dem Logik-Analysator sind die Bytes auch zu erkennen. Nun haben wir das CID ausgelesen. Gibts irgendwo ne Übersicht, mit den Manufacturer IDs? Produktionsdatum könnte mit Dez/05 schon mal hinkommen. Manufacturer ID wäre 2C, wer verbirgt sich dahinter?
hallo, irgendwo hatte uli mal ein winavr-c programm, wo er zur demo nur den sector beschrieben hat und dann zur kontrolle wieder ausgelesen hat. finde es nicht mehr. wer kann hier helfen? danke. mfg
Ich stelle hier nochmal meine Frage aus einem anderen Thread. Also die Karte reagiert auf Kommandos zum CDS,CID auslesen und Blocklänge setzen funktionieren. Aus dem CSD haben wir die passende Kartengröße (256MB) und aus dem CID den Namen (MMC) sowie Produktionsdatum ausgelesen. Aber: Block Read und Block Write funktionieren nicht. Beim Block Read quittiert die Karte das Read Kommando mit 0x00, dann folgen aber nur noch 0xff. Es kommt kein Data Start 0xfe. Block Write verhält sich ähnlich. Das Kommando wird bestätigt mit 0x00, aber danach folgen nur 0xff. Jemand eine Idee?
Noch ne kleine Frage: Wie genau löst ihr das wenn Clustersize zB 4 Sektoren sind. Erstmal den ersten Block in nen Buffer einlesen, verarbeiten und ausgeben. Dann direkt Block2 nachlegen oder holt ihr direkt alle Blöcke und speichert die irgendwo ab?
Hi @all, probiere mich gerade an Ullis letzter (2.6) MMC Version. Habe zwei Testboards. 1. Board: ATMega32 14.74MHz und einfache Spannungsteilerbeschaltung! Funktioniert wunderbar. :) 2. Board: ATMega32L(!L!) (3,6V + Spannungsregler + 7,3728MHz) Spannungsteiler (1,8k Widerstände) entfernt, da die Pegel eh schon sehr niedrig waren! CS und DataIn kommen auch mit den entsprechenden Peglen ca. 3,4V an der Karte an, aber leider liefert die Karte kein Ausgangssignal! Ob mir da evt. jemand weiterhelfen könnte?
Auch wenn der Beitrag schon ein wenig alt ist... ich verwende Version 2.7 auf einem Mega8, ohne FAT... Es mag jetzt dämlich klingen, aber nicht mal die SPI Schnittstelle will was tun... /SS hab ich als Ausgang gesetzt... Beschaltung via SW SPI auf PortC gelegt... Verbunden sind die Pins mal noch gar nicht... ausser auf den Logikanalysator... nur irgendwie kommt da nix... Jetzt rätsel ich schon knappe 40 Kaffeeeinheiten...
Wo finden sich die aktuellen Versionen 2.6 und 2.7? Ich kann sie in diesem Thread leider nicht finden. Kann mir bitte jemand einen Tip geben?
Hallo allerseits... Ich hab Ulrichs Source Code Version 2.7 auf einen Mega8 portiert... Vllt nützts wem ^^ Warum genau diesen Source? Weil Ulrich einen schönen Programmierstil hat ^^
Hallo, ist es eigentlich möglich die CID einer MMC/SD-Karte zu ändern (CMD26!?)? Gibts eine Software, mit der man die CID via einem normalen CardReader auslesen kann? Liebe Grüsse.
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.