Forum: Projekte & Code SourceCode MMC die Zweite


von Uli (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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

von Uli (Gast)


Lesenswert?

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

von MyMeisle (Gast)


Lesenswert?

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

von Volkmar (Gast)


Lesenswert?

@MyMeisle:
FAT16 geht bis 2GB. Du hast die Köpfe vergessen...

sie auch hier: http://home.teleport.com/~brainy/fat16.htm

Volkmar

von Uli (Gast)


Lesenswert?

Hallo,

Natürlich arbeitet FAT16 jenseits von 32MB // 512Bytes Blocksize* XX
Clustersize * max 65535 FAT Eintrag weit über 32MB :-)

Mfg Ulrich

von MyMeisle (Gast)


Lesenswert?

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

von Oliver Keller (Gast)


Lesenswert?

[X] subscribe...

von Norbert Pil (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nicole (Gast)


Lesenswert?

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

von Erika (Gast)


Lesenswert?

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

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Hier nochmal die letzte Version des Source Codes V2.3 (27.02.05)

Mfg Ulrich

von dave (Gast)


Lesenswert?

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

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

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

von PatrickHH (Gast)


Lesenswert?

Hast du dafür auch noch nen Schaltplan?

von ape (Gast)


Lesenswert?

@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));

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Danke an APE!!

Schon geändert!

Mfg Ulrich

von Sandra (Gast)


Lesenswert?

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.

von Falk Willberg (Gast)


Lesenswert?

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

von dave (Gast)


Lesenswert?

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

von Uli (Gast)


Lesenswert?

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

von Marcel Meyer (Gast)


Lesenswert?

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 :)

von Uli (Gast)


Lesenswert?

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

von Stefan Seegel (Gast)


Lesenswert?

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

von Rolf F. (Gast)


Lesenswert?

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.

von Nik Bamert (Gast)


Lesenswert?

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

von Stefan Seegel (Gast)


Lesenswert?

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

von Rolf F. (Gast)


Lesenswert?

@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.

von Stefan Seegel (Gast)


Lesenswert?

@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

von Rolf F. (Gast)


Lesenswert?

@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.

von Stefan Seegel (Gast)


Lesenswert?

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

von Rolf F. (Gast)


Lesenswert?

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).

von Alex (Gast)


Lesenswert?

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].

von Alex (Gast)


Lesenswert?

Na ok, CMD0 ist identisch, kann man als CRC senden was man möchte?

von Werner B. (wernerb)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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

von marcelKo (Gast)


Lesenswert?

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

von marcelKo (Gast)


Angehängte Dateien:

Lesenswert?

hier..

von Ulrich Radig (Gast)


Lesenswert?

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

von marcelKo (Gast)


Lesenswert?

ä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

von Rolf F. (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

Keiner eine Lösung für mein Problemchen? :-)

von Ulrich Radig (Gast)


Lesenswert?

Hallo,

Ich habe doch was geschrieben! Wenn kein Linux auf deinen Rechner hast
dann benutze doch Knoppix.

Mfg Ulrich

von Mike (Gast)


Lesenswert?

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.

von marcelKo (Gast)


Lesenswert?

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

von Rolf F. (Gast)


Lesenswert?

@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.

von marcelKo (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rolf F. (Gast)


Lesenswert?

Das ist ein MBR mit Partitionstabelle. Der "Bootloader" steht am
Anfang und die erste Fehlermeldung steht auch dort.

von marcelKo (Gast)


Lesenswert?

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

von marcelKo (Gast)


Lesenswert?

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

von Ulrich Radig (Gast)


Lesenswert?

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

von marcelKo (Gast)


Lesenswert?

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

von Fritz Praus (Gast)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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

von Ulrich Radig (Gast)


Lesenswert?

Hallo Dirk,

Benutze einen Mega32 :-)

Gruss
Ulrich

von dirk (Gast)


Lesenswert?

Warum ? Gehts nicht mit einen MEGA128?

:-(

Werde ich mal ausprobieren, aber klar ist mir das nicht.

von Ulrich Radig (Gast)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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!

von Christoph (Gast)


Lesenswert?

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

von Tobias S. (tobias)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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?

von Elektrikser (Gast)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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?

von Stefan Seegel (Gast)


Lesenswert?

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

von dirk (Gast)


Angehängte Dateien:

Lesenswert?

@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

von dirk (Gast)


Lesenswert?

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.

von Stefan Seegel (Gast)


Lesenswert?

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

von dirk (Gast)


Lesenswert?

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?

von dirk (Gast)


Lesenswert?

Mit der Partion und 6MB - dort habe ich nur eine erstellt.

von Stefan Seegel (Gast)


Lesenswert?

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

von Günther (Gast)


Lesenswert?

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

von Uli (Gast)


Lesenswert?

Hallo,

Gehe mal auf meine Seite da sind weitere Infos und der neuste Source
Code.

Gruss
Ulrich

von Günther (Gast)


Lesenswert?

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

von Mehmet (Gast)


Lesenswert?

&#350;imdiki Sd kartlar&#305;n i&#351;letim sistemi ya fat yada fat16
olur çünkü bu dosya yönetim programlar&#305; basittir.

von Staiger Holger (Gast)


Lesenswert?

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

von Dennis Kleine-Beck (Gast)


Angehängte Dateien:

Lesenswert?

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 ;-)

von Bernd Scholl (Gast)


Lesenswert?

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

von Dennis Kleine-Beck (Gast)


Lesenswert?

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

von Elektrikser (Gast)


Lesenswert?

Ich habe eine Kingston 256 MB, die mit diesem Code funktioniert.

Gruß Elektrikser

von Bernd Scholl (Gast)


Lesenswert?

danke für die antworten

von wright (Gast)


Lesenswert?

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

von Matthias H. (matthias_hartmann)


Lesenswert?

[x] subscribe ...

von Jürgen (Gast)


Lesenswert?

[x] subscribe ...

von Peppe (Gast)


Lesenswert?

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

von Dennis Kleine-Beck (Gast)


Lesenswert?

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

von Peppe (Gast)


Lesenswert?

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

von Dennis Kleine-Beck (Gast)


Lesenswert?

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

von Dennis Kleine-Beck (Gast)


Lesenswert?

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

von Peppe (Gast)


Lesenswert?

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.

von i-mon (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?


von Marian (Gast)


Lesenswert?

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

von Marian (Gast)


Lesenswert?

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.

von Marian (Gast)


Lesenswert?

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 :)

von Sascha (Gast)


Lesenswert?

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!!!!!!!!!!!

von KAZERONI (Gast)


Angehängte Dateien:

Lesenswert?

SD1
SD2
SD3
SD4
SD4
SD6
SD7
SD(PIN)

von KAZERONI (Gast)


Angehängte Dateien:

Lesenswert?

SD8
SD9

von roboterheld (Gast)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?


von roboterheld (Gast)


Lesenswert?

geht das nur mit "printf ("System OK\n\n")" und einem lcd nicht 
einfacher?

wo bekomme ich dafür eien lösung?

mfg

von Irosenhagen (Gast)


Lesenswert?

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.

von Irosenhagen (Gast)


Lesenswert?

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?

von roboterheld (Gast)


Lesenswert?

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

von roboterheld (Gast)


Lesenswert?

alles klar, habe ich wiedergefunden.

mfg

von Irosenhagen (Gast)


Lesenswert?

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?

von bluebird (Gast)


Lesenswert?

Hallo,

hat schon jemand mal Ulis Code auf einem AVR Butterfly zum laufen 
bekommen?

VG

Ralf

von Ingmar R. (irosenhagen)


Lesenswert?

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?

von BeamMeUpScotti (Gast)


Lesenswert?

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?

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

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...

von Michael Z. (Gast)


Lesenswert?

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?

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Ulrichs HP...

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Angehängte Dateien:

Lesenswert?

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 
^^

von Lucifer (Gast)


Lesenswert?

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.

von JO (Gast)


Lesenswert?

hat sich was getan bezüglich cmd26 ???

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