Forum: Projekte & Code MMC/SD ansteuern mit AVR


von uli (Gast)


Angehängte Dateien:

Lesenswert?

Habe nun auf meiner Homepage die Anschaltung einer MMC/SD als
Schaltplan, und den SourceCode mit WinAVR C zum Download
bereitgestellt.

Mfg Uli

von Ulrich (Gast)


Angehängte Dateien:

Lesenswert?

Nun neuer Download des SoureCode auf meiner Homepage der die MMC/SD
Karte mit dem Hardware SPI des Atmel AVR µC betreibt.

Mfg Uli

von nobody0 (Gast)


Lesenswert?

Aha, ist auch auch schon Dateisystem (FAT) mit bei?
Und wieviel RAM belegt es?
Interessant wäre, ob es auch auf MSP430 (2 kB RAM) laufen könnte.

von Ulrich (Gast)


Lesenswert?

Dieses Programm lauft bisher ohne FAT und benötigt bisher 512Bytes und
etwas Variablen Speicher. Den Zugriff auf den Speicher ermöglichen 3
Routinen Block_Read_MMC,Block_Write_MMC,Init_MMC
Für viele Anwendungen ist das ausreichend.

Mfg Uli

von nobody0 (Gast)


Lesenswert?

Ja, sowas habe ich auch gemacht, aber mit zwei 512 B Buffern, damit
1...512 Byte an jede beliebige Adresse geschrieben werden können.
Weil damit die Hälfte des RAMs belegt wird, habe ich FAT nicht
angefangen.

von Simon Lehmayr (Gast)


Lesenswert?

Ich suche nach den kompletten Kommando-Listen für MMC/SD-Cards und deren
Bitfolge und Beschreibung. Im Netz hab ich dazu nichts Ausreichendes
gefunden (z.B. SanDisk hat nur Blabla) ...

von nobody0 (Gast)


Lesenswert?

Hier ist etwas von mir: 

http://www.random.linux-site.net/files/unsorted/kartenleser_ti/mmc.h

In den Kernel-Sourcen von Linux u. a. findet man auch einiges.

von uli (Gast)


Lesenswert?

Auf meiner Homepage ist die Doku von Hitachi, mit allen Commandos.

Mfg Uli

von nobody0 (Gast)


Lesenswert?

Problematisch ist, dass die SD-Sachen nicht öffentlich sind und deshalb
nicht in offizellen Treibern im Sourcecode stehen dürfen.
Allerdings haben es einige geschafft den SD-Standard direkt
downzuloaden; es ist also ein offenes Geheimnis so wie DECSS oder wie
diese DVD-Codierung heißt.

Angeblich darf nicht einmal dargestellt werden, wie sich das
CID-Register bei MMCs u. SDCs unterscheidet, obwohl ohne das nicht
einmal die Karten-Größe bestimmt werden kann, aber das kann nur ein
Gerücht sein, auch weil man sowas ja per reverse-engineering
herausbekommt und so ja auch der ur-PC ganz legal geklont wurde.

von uli (Gast)


Lesenswert?

@nobody0

hallo
ich habe eine Ansteuerung für eine MMC-Karte geschrieben, für diese
liegen beispiele sowie Datasheets offen. Da aber eine SD-Karte
abwärtskompatibel zu einer MMC Karte ist wird diese halt wie eine MMC
Karte angesteuert. Somit greife ich auf die geheimgehaltenen Funktionen
gar nicht zu :-).

Mfg Uli

von nobod0 (Gast)


Lesenswert?

Ja, klar, im SPI-Modus gibt's keinen Unterschied.
Um aber sowas wie die Kapazität zu bestimmen braucht man es aber.
Das sollte man aber z. B. in den Sourcen zu Linux/FreeBSD usw. finden
können; auch deshalb ist die Geheimtuerei albern.

von Ulrich (Gast)


Lesenswert?

Noch nicht einmal um die Kapazität zu bestimmen dieses geschieht mit dem
kommando CID(4Ah) und ist für MMC karten somit auch für SD.
Aber Doku dazu gibt es auf meiner Homepage.

mfg uli

von nobody0 (Gast)


Lesenswert?

Also ich weiß von einem konkreten Treiber für Linux, der das
CID-Register ausliest und daraus die Daten nimmt: Bezeichnung,
Kapazität, ID usw..
Und wie man in den Standards nachlesen kann, ist das CID-Register bei
MMCs anders aufgebaut als bei SDCs; im Wesentlichen sind die Bits da
verschoben. Wenn man versucht eine SDC im MMC-Format auszulesen, dann
funktioniert das nicht; dasselbe gilt umgekehrt.
Also wirklich abwärts-kompatibel sind die SDCs nicht!

von john (Gast)


Lesenswert?

@nobody:
es gibt den mmc mode und den SD mode da ist es klar das die register
anders sind. das ganze interface ist dann anders und zwar 4 bit
deswegen pad 8&9. eine SD kann man als MMC ansprechen und auch über MMC
CID(4Ah) die grösse etc bestimmen
hier meine funktion:

00200 void MMC_get_volume_info(VOLUME_INFO* vinf){
00201         u08 data[16];
00202         // read the CSD register
00203         MMC_get_CSD(data);
00204         // get the C_SIZE value. bits [73:62] of data
00205         // [73:72] == data[6] && 0x03
00206         // [71:64] == data[7]
00207         // [63:62] == data[8] && 0xc0
00208         vinf->sector_count = data[6] & 0x03;
00209         vinf->sector_count <<= 8;
00210         vinf->sector_count += data[7];
00211         vinf->sector_count <<= 2;
00212         vinf->sector_count += (data[8] & 0xc0) >> 6;
00213
00214         // get the val for C_SIZE_MULT. bits [49:47] of data
00215         // [49:48] == data[5] && 0x03
00216         // [47]    == data[4] && 0x80
00217         vinf->sector_multiply = data[9] & 0x03;
00218         vinf->sector_multiply <<= 1;
00219         vinf->sector_multiply += (data[10] & 0x80) >> 7;
00220
00221         // work out the MBs
00222         // mega bytes in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
00223         vinf->size_MB = vinf->sector_count >>
(9-vinf->sector_multiply);
00224         // get the name of the card
00225         MMC_get_CID(data);
00226         vinf->name[0] = data[3];
00227         vinf->name[1] = data[4];
00228         vinf->name[2] = data[5];
00229         vinf->name[3] = data[6];
00230         vinf->name[4] = data[7];
00231         vinf->name[5] = '\0';
00232
00233 };

funtzt für MMC und SD

so und jetzt zeig mal deine zauber function ;)

john

von nobody0 (Gast)


Lesenswert?

Ich meine das CID-Register; das ist bei der SDC anders. Um bei beiden
Karten die Regeister richtig auszulesen muß man die Karten erstmal
unterscheiden.

von uli (Gast)


Lesenswert?

Das ist Richtig, das mit den unterschieden der MMC/SD Registern gestern
noch mal ausgelesen und verglichen.

Mfg Ulrich

von uli (Gast)


Angehängte Dateien:

Lesenswert?

Wer nun CID CSD Register auswerten will kann ja diese Funktion benutzen.
Ich sehe da keinen unterschied zur MMC Specifikation die ich von Hitachi
habe.
Kann ja jeder die Funktion von nobody0 benutzen die funktion zum lesen
des CID register lautet halt bei mir nun Read_CID_MMC und für das CSD
Register Read_CSD_MMC. Habe gerade daraufhin den Code auf meiner
Homepage erneuert. Ich hatte erst nicht vorgehabt CID/CSD Register
auszuwerten aber wer halt will. Da ich Speicherkapazität der Karte
sowieso später aus dem FAT16 herrauslese. Diese Funktionen folgen in
den nächsten Tagen. Lauft bei mir schon recht erfolgreich.

Mfg Ulrich Radig

von nobody0 (Gast)


Lesenswert?

Ok, beim CSD sehe ich keinen Unterschied, so dass man die Kapazität
immer gleich auslesen kann. Aber beim CID-Register ist es anders; da
ist z. B. die Seriennummer bei MMCs 47:16 während sie bei SDCs bei
55:24 ist.
Allerdings braucht man das CID nur wenn man Daten wie
Herstellungsdatum, Hersteller, Seriennummer usw. anzeigen will.
Die für den Betrieb wichtigen Sachen wie Ströme, Spannungen usw. stehen
ja im CSD.

Und wieviel RAM werden für Karte * FAT16 belegt?

von nobody0 (Gast)


Lesenswert?

Nachtrag: Die Kapazität steht nur im CSD; da hatt ich mich oben zuerst
einmal vertan.

von ulrich (Gast)


Lesenswert?

Zur Zeit komme ich mit 1KB + 512Bytes Daten aus, Mega mit 2KB reicht
aus.
Zurzeit gibt es den DIR Befehl, zum auslesen der Verzeichnisse.
Den Load befehl um  für 1File die FAT Tabelle sortiert
auszulesen(512Bytes) das bedeutet 1File darf max. 4MB groß sein bei
einer Clustergröße von 16KB (Das reicht meisten auch für einen
MP3Player).
und Read File um dieses File in 512 Byte schritten zu lesen.
Da ich die Fat Tabelle vorher für ein File lade kann ich noch mit
ausreichender Geschwindigkeit dieses File wiedergeben.

Mfg Ulrich

von nobody0 (Gast)


Lesenswert?

Bei 2 KB RAM wird es also ziemlich Eng; der Rest, also die Anwendungen,
brauchen ja auch noch Platz. Für ein Selbst-Update (von Karte) mit
einem im RAM arbeitenden RAM-Loader bleibt da sicherlich kein Platz

Kann deine Version denn auch schreiben?

von uli (Gast)


Lesenswert?

ich hoffe das ich das alles unter einen hut bekomme und das der
anwendung genug platz zur verfügung steht.

mfg uli

von Simon Lehmayr (Gast)


Angehängte Dateien:

Lesenswert?

@uli:
Ich habe versucht, eine Toshiba SD mit 16MB an einen ATmega8 mit 3,3V
zu hängen und dazu deinen MMC-SPI Code mit WinAVR compiliert.
Allerdings kommt dann nach lange warten "Keine MMC/SD-Karte
gefunden!!"
Im Anhang die auf mega8 4MHz portierten C-Files.

Hardware: ATmega8 3,3V @4MHz im STK500 von Atmel
Pinbelegung:
HW-SPI: PB2=SS (unused), PB3=MOSI, PB4=MISO, PB5=CLK
CS=PB1

Verdrahtung zur SD-Karte:
MCU mega8  - SD-Karten-Pin#
PB1 (CS)   - 1 (CS)
PB3 (MOSI) - 2 (DI)
PB4 (MISO) - 7 (DO)
PB5 (CLK)  - 5 (CLK)
VSS (GND)  - 3+6 (Vss)
VDD (3,3V) - 4 (Vdd)

Verdrahtung RS232:
STK500 RS232 Rxd, TxD - PD0, PD1

von Ulrich (Gast)


Lesenswert?

Ich habe nun einen neuen Source Code zur verfügung gestellt.

es kann probleme mit Timeout in der routine (MMC.c) Init_MMC geben
Timeout etwas großzügiger wählen.

Mfg Uli

von Simon Lehmayr (Gast)


Angehängte Dateien:

Lesenswert?

Ich krieg die Karte nicht zum Funzen! Im PC-cardreader geht sie
wunderbar... Ich hab ein Tool geschrieben, mit dem ich "von Hand" die
Clock, Enable und DO schalten kann und die Antwort der Karte angezeigt
kriege, aber die Karte antwortet immer mit High...

Ich habe die Karte wie folgt angesteuert:
Clockzyklus: MOSI setzen (0 oder 1, vom PC aus über RS232) - Clock auf
high - MISO lesen - Clock low - gelesenen MISO über RS232 an PC
schicken.
Commandzyklus: Enable low (SD aktiv) - Commando (6 Bytes, MSB first)
rausclocken - nochmal 8 Clocks und MISO dabei anschauen.

von Uli (Gast)


Lesenswert?

Hallo habe heute die letzte Version von mmc.c noch mal Online gestellt
habe noch einen Debug modus eingebaut um Fehler zu finden.
Der FAT Teil ist auch schon erweitert und wird laufe der Woche fertig.
Probleme kann es nur noch mit DI / DO geben, vertauscht man leicht
SPI DI = MMC DO und SPI DO = MMC DI von 5 getesteten SD karten liefen
alle bis auf eine die war vom hersteller Transcend.

Mfg Ulrich

von Martin (Gast)


Lesenswert?

Hallo,

ich will mal kurz ein feedback geben über die Source (neuste Version
vom 13.06.2004) für die MMC.
1.) Zuerst mal ein Anschlussproblem: ich habe einen connector für die
alten ISA Karten versucht: leider geht die MMC wohl zu weit rein und
hat dann keinen Kontakt mehr. Erst als ich die MMC etwas rausgezogen
habe klappte es (aha CMD0 und CMD1 :-) )
2.) ein 90S8535 geht nicht > zu wenig RAM
3.) ein mega163 geht zwar aber nach dem dir() ist Absturz angesagt >
denke mal es kommt zu einem Stack overflow > zu wenig RAM ?

Vielleicht kann man ja was an der blocksize ändern. Es müssen ja nicht
immer 512byte ausgelesen werden (meine da was gelesen zu haben das man
das einstellen kann). Das ist sicherlich für Anwendungen in denen der
uC später noch was anderes macht etwas zuviel RAM Verlust.


Martin

von Martin (Gast)


Lesenswert?

Hallo,

lohnt es sich eine Funktion für die Karten Nr usw zu machen CID und CSD
(je 6 byte gross)usw?


Martin

von Martin (Gast)


Lesenswert?

Hallo,

geht das so??

//Routine zum lesen der CID(16Byte) von der MMC/SD-Karte
char Read_CID_MMC (char *Buffer)
{
  char tmp;

  char CMD10[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; //CMD10 CID read

  //Sendet Commando CMD10 an MMC/SD-Karte (Read CID)
  tmp = Write_Command_MMC (CMD10);
  if (tmp != 0)
      {
      return(tmp);
      }

  //Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
  while (tmp != 0xfe)
  {
  tmp = Read_Byte_MMC();
  }

  //Lesen der CID (16Bytes) von MMC/SD-Karte
  for (int a=0;a<16;a++)
    {
    *Buffer++ = Read_Byte_MMC();
    }

  //CRC-Byte auslesen
  tmp = Read_Byte_MMC();//CRC - Byte wird nicht ausgewertet
  tmp = Read_Byte_MMC();


  return(0);
}

von nobody0 (Gast)


Lesenswert?

Die Blockgröße steht im CSD-Register; soweit ich weiß kann man die
dynamisch nur erhöhen. Praktisch wird aber immer 512 Byte verwendet -
wie bei Festplatten u. anderen Block devices.

Deshalb habe ich etwas Zeit gebraucht um mit zwei 512 B Buffern 1...512
B an jede beliebige Adresse lesen/schreiben zu können, denn die
Karten-Adresse muss immer aligned sein.

von Martin (Gast)


Lesenswert?

Hallo nobody,

welchen Atmel benutzt du denn?


Martin

von uli (Gast)


Lesenswert?

Habe nun noch eine kleine Fat16 Unterstützung hinzugefügt.

Mfg Ulrich Radig

von Uli (Gast)


Lesenswert?

Also meines erachtens sollte ein mega mit 2KB ausreichen, der absturtz
kann daher geführt haben da ich ja das FAT noch nicht richtig fretig
war und es auch noch nicht frei gegeben habe.

Mfg Uli

von Ulrich (Gast)


Lesenswert?

@Martin

Es wird ein Mega 323 Benötigt der mega163 hat nur 1KB Speicher, bei ein
Mega163 funzt es nur mit MMC.C und nicht mit FAT! mit Fat benötigt der
source Code um die 1,2KB Speicher für einen MP3 Player mit 2*512Bytes
Speicher wie ich ihn bauen will benötigt man einen atmel min. 323.

uli

von nobody0 (Gast)


Lesenswert?

Hallo Martin,

ich benutze einen MSP430F149 - das ist der bisher größte MSP430.

von nobody0 (Gast)


Lesenswert?

Mal eine Frage zu dem Schaltplan (auf http://www.ulrichradig.de/): Der
Standard schreibt doch Pullups von 10 bis 100 kOhm an dem Bus vor;
funktioniert die Schaltung wirklich mit Spannungsteilern und ohne einen
Pullup?

von uli (Gast)


Lesenswert?

ja die schaltung funktioniert wirklich!! allerdings könnte noch ein
pullup an die DO-Leitung der mmc (aber nur deshalb wenn keine mmc karte
vorhanden ist), muß aber nicht sein zumindest läuft die schaltung bei
mir einwandfrei und getestet habe ich wie schon gesagt 5 mmc karten

mfg uli

von uli (Gast)


Lesenswert?

ja die Schaltung funktioniert wirklich!! allerdings könnte noch ein
Pullup an die DO-Leitung der MMC (aber nur deshalb wenn keine MMC Karte
vorhanden ist), muß aber nicht sein zumindest läuft die Schaltung bei
mir einwandfrei und getestet habe ich wie schon gesagt 5 mmc karten.
Die anderen Anschlüsse haben aber einen pullup widerstand, der des
Spannungsteilers es muß nicht immer ein levelshifter sein ;-)

mfg uli

von uli (Gast)


Lesenswert?

sorry meinte natürlich pulldown :-)

mfg uli

von ulrich radig (Gast)


Lesenswert?

und wer mir nicht glaubt kann sich ja mal die application note:mp3
player von VLSI Solution (VS1001k) anschauen dort sind auch keine!!!
pullup oder pulldown widerstände.

Mfg Ulrich Radig

PS: alle schaltungen wurden von mir getestet !!!!

von nobody0 (Gast)


Lesenswert?

Aha. In den Standards Standard zu MMC und SDC stehen nur Pullups, aber
deren Hauptaufgabe soll wohl nur sein das Potential am Bus aus dem
verbotenen Bereich zu ziehen, also Floaten zu verhindern.
Naja, weil die Karten sich in einigen Punkten (Timing) ohnehin nicht an
den Standard halten und in den Standards einige Zeiten nicht limitiert
sind, sind letztlich nur Experimente entscheidend.

Von Prozessoren wie dem s3c2410 (Samsung) kenne ich die Application
Notes nur mit externen 10 kOhm-Widerständen, wobei interne 100
kOhm-Widerstände vorhanden sind, die aber defaultmäßig abgeschaltet
sind.

von Ulrich (Gast)


Lesenswert?

@nobody

das Eigenartige bei der MMC Karte was ich bemerkt habe, wenn ich einen
pullup Widerstand am Port Data Out der MMC Karte anschließe
Funktioniert diese nicht mehr. Sofern ich aber einen pulldown
Widerstand anschließe läuft diese ohne Probleme. Ein pulldown
Widerstand ist nur nötig wenn keine MMC - Karte vorhanden ist und der
Eingang des µC offen ist. Alle anderen Anschlüsse der MMC Karte sind
immer definiert (Low oder High). Auf jeden fall funktioniert die
Schaltung auf meiner Homepage so wie sie ist. Wie gesagt evt nur noch
ein pulldown Widerstand nach (GND) für die Fälle wenn keine MMC Karte
angeschlossen ist.

mfg uli

von nobody0 (Gast)


Lesenswert?

Merkwürdig, denn ich verwende 82 kOhm Pullups an jeder der Leitungen und
es funktioniert mit einem MSP430.
Hast Du mal mit SD Cards getestet?

von uli (Gast)


Lesenswert?

ja habe ich ist aber das gleiche

mfg uli

von nobody0 (Gast)


Lesenswert?

Hm, bei zumind. einem Widerstand ist (nach dem Standard) der Sinn ein
Floaten zu verhindern; dabei ist egal ob pullup oder pulldown und der
Wert sollte auch 100 kOhm betragen können. Wenn ich mal nachrechne,
komme ich nämlich bei 10 kOhm auf ungefähr
tau = 10 kOhm * 100 pF = 1E-6 s
und das würde, mit open collector, für nicht einmal ein Zehntel der
zulässigen 25 MHz reichen, so dass die Widerstände eigentlich nur das
Floaten beeinflussen können.
Beim s3c2410 werde ich das mal ausprobieren, nachdem ein Kollege die
externen Pullups aus dem Schaltplan geworfen hat ...

von Nik Bamert (Gast)


Lesenswert?

Hi Ulrich

Ich hab mal eine Frage zu der Routine. Evtl. bau ich nen Mp3 Player mit
einer Sd Karte..Wie schnell kann man denn die Sektoeren der Karte
auslesen? Hardware Spi und Software Spi? Zusätzlich hab ich noch ne
Frage zu deinem Avr Basekit. Ich find es genial und möchte es gerne
nachbauen. Dann hab ich mir mal das Eagle Layout heruntergeladen. Doch
dabei hab ich bemerkt, dass die Masse Flächen fehlen..hast du die extra
nicht eingezeichnet, oder finde ich die einfach nicht? Beim drucken sehe
jedoch keine. Wenn ich dann ein Eagle 3d Bild mache, sehe ich ebenfalls
keine Masse Flächen. Auf deinem Bild sind diese jedoch vorhanden.


MFG Nik

von nobody0 (Gast)


Lesenswert?

Mit 4 MHz SPI Takt komme ich auf rund 30 kB/s beim Lesen mit einem
MSP430.

von Nik Bamert (Gast)


Lesenswert?

Ok, danke das würde mir reichen. ( ca. 8 * 30 kbyte = ca. 240kbit)
Die meisten meiner Mp3's sind 192 kbit oder aber auch 240er...wird
also knapp. Meint ihr mit Ulrich's Routine und Atmega162@16 mhz ginge
das schneller?


MFg Nik

von ulrich (Gast)


Lesenswert?

Nach dem Herrunterladen und dem laden mit EAGLE muß man RATS eingeben
damit die Polygone berechnet werden ist aber ganz normal.
Danach werden die Masseflächen gezeichnet.
Ich komme bei mir mit der Fat Unterstützung auf rund 70kByte/s das
macht etwa 560 Kbit/s.

mfg ulrich radig

von Nik Bamert (Gast)


Lesenswert?

Hi ulrich,

vielen Dank für die Antwort.

>Nach dem Herrunterladen und dem laden mit EAGLE muß man RATS
>eingeben

Sorry, ich kenne Eagle noch nicht bis ins Detail, wo mus ich RATS denn
eingeben? Ich kanns gerade nicht testen->bin in der Schule.

>Ich komme bei mir mit der Fat Unterstützung auf rund 70kByte/s das
>macht etwa 560 Kbit/s.
Boah, das ist gut zu höhren :) Ich mach mir mein eigenes Dateisystem,
da die Files dann sowiso über Ethernet reinkommen....
Und ich hab keine Lust Dateien in Fat zu schreiben..

MFG Nik

von uli (Gast)


Angehängte Dateien:

Lesenswert?

in der eingabezeile oben schaue auf mein photo :-)

mfg uli

von Nik Bamert (Gast)


Lesenswert?

hehe, vielen Dank, funzt perfekt...werd mir mal das Ätzzeug bestellen...

von nobody0 (Gast)


Lesenswert?

Also bei dem Samsung s3c2410 reichen die internen Pullups mit 100 kOhm
und ich  erreiche damit gut 500 kByte/s.
Allerdings verwendet der Prozessor nur eine Daten-Ader und 25 MHz Takt
für die Übertragung.

von Nik Bamert (Gast)


Lesenswert?

hi, ich hab nochmal ne Frage.
Ich hab ne Sd Karte. Leider finde ich dazu keine Anschlussbelegung. Im
Gegensatz zur MMC gibts ja noch zwei Pins mehr. Irgendeinen in der
'angeschnittenen' Ecke und sonst noch einer. Ich nehme an, dass die
Belegung recht ähnlich ist, aber wie gesagt, leider finde ich nichts im
Hitachi Datenblatt auf Ulrich's Homepage oder sonst wo im Internet..Hat
jemand einen Tipp für mich?

Gruss
Nik

von nobody0 (Gast)


Lesenswert?

google SD Interface oder SD Specification.

von Nik Bamert (Gast)


Lesenswert?

Danke für die Tipps...leider hab ich doch nicht wirklich etwas gefunden.
Doch schliesslich hab ich dann was auf der Sandisk Homepge gefunden. Für
Interessierte :
http://www.sandisk.com/pdf/oem/SD_Physical_specsv101.pdf
Seite 16

MFG Nik

von uli (Gast)


Lesenswert?

ich benutze nur die pins die deckungsgleich mit der mmc karte sind alle
anderen pinne werden nicht angeschlossen

mfg ulrich

von Nik Bamert (Gast)


Lesenswert?

achso...ok :) auch ne lösung. Ich dachte für die übrigen brauchts
pullups oder pulldowns...naja lass ich die eben auch mal frei :)

von nobody0 (Gast)


Lesenswert?

Also ich habe an allen Pullups (von 82 kOhm bzw. interne 100 k) und
damit geht's.
Die bei der SDC zusätzlichen sollten auch ohne funktionieren, weil die
in (uralten) MMC-Slots in der Luft hängen.

von uli (Gast)


Lesenswert?

So ist es :-) die anderen pinne brauchen bei einer SD karte nicht
angeschlossen werden. und wer mag und will kann auch bei den atmel die
internen widerstände ja auch aktivieren oder deaktivieren nach
belieben

mfg uli

von Marcel Meyer (Gast)


Lesenswert?

Hallo,

habe mir deine seite mit interesse angeschaut, feine seite!

Aber hat evtl. schon jemand den code für codevision umgeschrieben?

Mfg
Marcel

von Arry Wu (Gast)


Lesenswert?

I succeed in reading MMC when I use avr_mmc_sd_spi.zip,but fail to read
SD card.
Why?

Thanks,

Arry Wu

von Ulrich Radig (Gast)


Angehängte Dateien:

Lesenswert?

Hier das neue File, welches hier zum Download steht ist schon lange
veraltet. Unterstützt MMC Karten am SPI BUS und an einen IO Port sowie
das lesen von Fat16.

Mfg Ulrich

von Stefan Seegel (Gast)


Lesenswert?

Hallo MMC Bastler,

ich möchste im Folgenden mal meine MMC Erfahrungen kurz schildern.
Zunächst aber vielen Dank an Ulrich Radig für den C-Code !

Mein Programm das in einem Mega 16 läuft ist wie folgt aufgebaut:

- Init_MMC() öfters in einer schleife aufrufen, der Schleifenzähler
wird auf einem Display ausgegeben
- Wenn erfolgreich einen Sektor auslesen und auf dem Display anzeigen

Schaltung wurde die von Ulrichs Homepage verwendet, also zwei Dioden
für die Versorgung der MMC und Spannungsteiler für die Datenpins. An
DataOut der MMC zunächst kein Pullup/Pulldown.

1. Nokia MMC 32 MB Type: DTS-32. Kein Pullup/Pulldown

- Nach dem Anlegung der Versorgungsspannung wird MMC_Init ausgeführt,
jedoch benötigt ein Aufruf ca. 5s bis er zurückkehrt. Nach 2-3 maligem
aufruf ist die Karte Korrekt erkannt und Daten können gelesen werden.

- Nun wird ein Reset ausgeführt (am AVR):
MMC_Init wird ausgeführt, diesesmal aber benötigt MMC_Init nur noch ca.
100ms. Nach 1-2 maligem Aufruf ist wieder alles Dufte!

- Karte aus- und wieder einstecken, AVR Reset:
Karte wird wieder nur langsam initialisiert. Dann wieder alles dufte..

- Karte aus- und wieder einstecken, zunächst ein paar Leseversuche mit
ReadBlock_MMC (natürlich erfolglos, da Karte noch nicht initialisiert),
dann AVR Reset:
Karte wird SCHNELL initialisiert, wieder alles dufte

- Karte raus, AVR Reset oder Betriebsspannung weg & wieder dran:
MMC_Init wird langsam ausgeführt, dann natürlich TimeOut

- Betriebsspannung bei nicht gesteckter Karte dran: Init_MMC läuft
langsam in Timeout. Dann Karte dran & AVR Reset: Init_MMC läuft
langsam, Karte wird erkannt...


2. Nokia MMC wie oben, oder mit PullDown 10k an DO der Karte gegen GND

- Spannung anlegen: MMC_Init wird schnell ausgeführt, aber Karte wird
nicht gefunden!!!

- dann AVR Reset: MMC_Init wird schnell ausgeführt, Karte wird gleich
gefunden und wieder alles dufte.

- Karte raus, Karte wieder rein, AVR Reset: MMC_Init wird schnell
ausgeführt, Karte wird nicht erkannt! Nochmal Karte raus und rein,
wieder AVR Reset: MMC_Init wird schnell ausgeführt und Karte diesmal
erkannt.

- Betriebsspannung anlegen oder Reset ohne Karte: MMC_Init wird SCHNELL
ausgeführt (ohne Pullup ging diese Konstellation langsam?!)

3. 16MB MMC Karte NoName ohne Pullup/Pulldown

- Betriebsspannung anlegen, Karte gleich angeschlossen oder später:
Init_MMC wird langsam ausgeführt, Karte wird nicht gefunden...

- Alle Kombinationen: Karte wird nicht gefunden!!!

4. 16MB MMC Karte NoName mit Pulldown

- Init wird immer schnell ausgeführt, Karte auch niemals gefunden


Von diesen NoName Karten hab ich mir nen 10er Packen bei eBay geholt,
alle funktionieren am PC, aber am AVR will keine einzige, liegt also
warscheinlich nicht an Typenstreuung. Gibt es da etwa irgendwie
unterscheidliche Protokolle oder sowas, dass die Karten reagieren ?
Wer will kann sich gerne mal so eine Karte von mir ausleihen...

Was soll das ganze Geschwaffel nun ?
Nun, vielleicht hat jemand mehr Erfahrungen mit dem Ansprechen von MMC
Karten und diese Zusammenhänge kommen jemandem bekannt vor. Ich
versteh's jedenfalls nicht...

Wär schön wenn die 16MB Karte zum arbeiten gebracht werden könnte,
sonst hab ich mir den 10er Packen umsonst gekauft :-(

Gruß

Stefan

P.S. Da fällt mir noch ein: Mist man am Vcc Pin der Karte, so sieht man
dort eine "Restrechteckigkeit", und zwar dann wenn gerade Daten
ausgetauscht werden. Wie kann das sein ? Liefert die
"Diodenstromquelle" nicht genug Strom so dass selbiger etwas
einbricht wenn über die Datenleitungen Strom weggeht ?!

von uli (Gast)


Lesenswert?

Ich habe mir inzwischen einen Cardslot besorgt. Dieser besitzt ein
schalter der überprüft ob eine karte eingeschoben wurde. Danach wird
erst die Betriebsspannung über einen Transistor geschaltet. Ist halt
besser und alles läuft stabiler. Kostet aber einen Cardslot!
Das mit dem Pullup habe ich auch schon bemerkt

"- Betriebsspannung anlegen oder Reset ohne Karte: MMC_Init wird
SCHNELL
ausgeführt (ohne Pullup ging diese Konstellation langsam?!)"

liegt daran das der Port Werte einstreut, da ein undefinierter Pegel
anliegt, also besser Pullup anschließen.

Mfg Uli

von Stefan Seegel (Gast)


Lesenswert?

Tach Uli!

Ja, in das Gerät das ich mir basteln möchte kommt später eh ein
Cardslot rein, dann sollte ich vielleicht auf der Platine einen
"Versorgungsspannungsschalter" vorsehen... Einfach nen NPN nehmen,
Kollekor auf 3.3 Volt und Emitter an die Karte legen ? Reicht das ?

Dann: Kann es sein dass es Karten gibt die "keinen Bock" auf den SPI
Modus haben ? Vielleicht geht mein 10er Packen deswegen nicht ? Nu
besorg ich mir erst mal einen 3.3V Festspannungsregler, damit ich
saubere 3.3V habe. Dann noch eventuell den passiven
"Widerstand-Spannungswandler" in was aktives umbauen, vielleicht
bringts das. Werde dann berichten.

MfG
Stefan

P.S.
@ Uli: Wegen Pullup: Ich nehme mal an dass ich den gegen 3.3V klemmen
muss, richtg ? Wie groß darf der maximal sein ? Ich möchte nicht
unbedingt 10k nehmen, wenn ich meine ganzen Pullups in den anderen
Teilen der Schaltung zusammenzähle geht da schon ganz schön Strom drauf
für ein Batteriegerät.

von uli (Gast)


Lesenswert?

Hallo,

Hallo ich würde einen um die 100KOhm nehmen. Desweiteren den Transistor
halt vor dem Spannungsregler, weil sonst nicht mehr 3,3V an der Karte
ankommen. Ich nehme auch mal an das nicht jede Karte den SPI Mode
unterstützt. Bei mir läuft die Schaltung mit einer LEXAR 128MB SD Karte
ohne Probleme. Desweiteren sollte man noch einen Kondensator an die 3,3V
anschließen.

Mfg Uli

von Dariusz Zolna (Gast)


Lesenswert?

Hello,

However I don't understad Deutsch, I could understood that you are
having problems with signal levels conversion. Don't use just simple
resistor bridges, but a chip designed for this kind of purposes, which
is 74LS07. Just put 1.8k pullup resistors on the 5V pins (3x input, 1x
output). It works perfect.
Uli - thanks for your code, however FAT part doesn't work well, it
locks in FAT_Addr() called from Root_Dir_Addr() ->
Read_Root_Dir_Ent().
Do you have any idea what it may be?

Greetings,
Darek

von nobody0 (Gast)


Lesenswert?

Beim S3C2410 habe ich die Widerstände nach der application note von
Samsung angelötet und es funktioniert:

http://www.samsung.com/Products/Semiconductor/SystemLSI/MobileSolutions/MobileASSP/MobileComputing/S3C2410X/an_s3c2410x_rev10.zip

von uli (Gast)


Lesenswert?

Hello Darek,

The FAT part work with my SD card very well. I format the SD Card with
windows XP (FAT16). I don´t know why doese the Code work. I have no
idea.

great
Ulrich Radig

von Dariusz Zolna (Gast)


Lesenswert?

Hi Uli,

I modified the code a little bit, so that the FAT_Addr() is called only
once, and the address is stored in memory. However because I need to
write to the card, not only read, I will use different code.
But the base MMC code is still useful. Thanks again.

Darek

von Norbert Pil (Gast)


Lesenswert?

Hello Dariusz,

I see you're going to write to a MMC/SD card. I'm trying the same.
Could you share bits of code ?

I would be a very happy AVR user !

Thanks,
Norbert

von Volkmar (Gast)


Lesenswert?

Just a short hint. There is another FAT implementation available which
seems to support writing to the device. I didn't used it until now,
but maybe it helps. Unfortunately (especially for Darek), it is in
german only. But some of the comments in the source are in english.

http://home.t-online.de/home/holger.klabunde/avr/avrboard.htm#cf

Volkmar

von Simon Lehmayr (Gast)


Lesenswert?

Holgers Version "MiniFAT" habe ich mal für einen mega16 compiliert,
das Teil ist genial!
Es funktioniert auch ohne Pullups oder Spannungsteiler (3,3V
Boardspannung!) oder gar Glue-Logik mit meiner 16MB Toshiba Karte.
Jetzt habe ich einen mega32 geordert, dann kann ich auch die
"Voll"-FAT testen!

von Stefan Seegel (Gast)


Angehängte Dateien:

Lesenswert?

Tach!

Anbei meine Version einer Routine zur Ansteuerung von MMC Karten. Als
Vorbild dienten die Routine von Ulrich Radig und jede Menge
Datenblätter. Mit Ulrichs Code gan's leider bei mir Probleme mit
einigen NoName MMC Karten, hiermit gehts nun aus irgendwelchen Gründen.
Mit meiner Routine geht allerdings NUR die Ansteuerung mit SPI, aber der
ist ja eh auf allen Interessanten AVRs drauf.
Ein paar Worte noch zum Hardware Interface: Die
Versorgungsspannungserzeugung für die MMC mit 2 Dioden ist nicht zu
empfehlen, da selbige dabei ziemlich unstabil ist. Am besten einen
LM317 im TO92 Gehäuse nehmen und mit 2 Widerständen die 3.3 Volt
einstellen, dann ist's ne saubere Sache.
Dagegen ist die Pegelanpassung der IO Pins besser mit Spannungsteilern
zu bewerkstelligen, von diversen Transistor-Ansteuerschaltung sollte
man die Finger lassen. Benötigt man ordentlich Datendurchsatz machen
Durchschnittstransistoren schnell schlapp, weil da doch einige MHz auf
der Clock-Leitung zusammenkommen.

Würde mich über Erfahrungsberichte der Angehängten lib freuen.
Wie gesagt: NUR SPI, und die CS Leitung für die MMC muss am gleichen
Port wie die SPI Pins hängen (beim Mega16 z.B. PortB, üblicherweise
nimmt man den Pin SS, der ja bei SPI Master implementierung frei ist).

MfG
Stefan

von Norbert Pil (Gast)


Lesenswert?

Hello Group,

Thanks for all the answers. I'm going to dive into Holgers code and
will keep the things said here in mind. It looks very promising.

Greetings,
Norbert

von Simon Lehmayr (Gast)


Angehängte Dateien:

Lesenswert?

Stefan Seegels mmc_lib macht einen sehr guten Eindruck auf mich. Alles
drin was ich gesucht habe!
Allerdings habe ich die SPI Geschwindigkeit im INIT_MMC verringern
müssen (Vorteiler auf 128); am Ende vom INIT (vor return(0)) dann
wieder auf Maximum gestellt. Damit hats dann geklappt. Als Anhang die
verbesserte Version (wenns erwünscht ist), müsste jetzt auch mit
No-Name Karten klappen!

von Stefan Seegel (Gast)


Lesenswert?

Hallo Simon!

Hab ich das richtig verstanden dass du die Clockrate beim
Initialisieren runter setzt und dann wieder hoch ? Klasse Idee ! Werd
ich beim nächsten "Release" mit rein machen, hab auch noch nen
anderen kleinen Bug gefunden.

Noch was: Ich habe festgestellt dass das Flag "SPR2X" (SPI double
clockrate) keine Auswirkung hat, egal ob's an oder aus ist ist die
Taktrate gleich. Kann mir jemand erklären warum ?

MfG
Stefan Seegel

von Marcel Meyer (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei die Zeilen von Uli an den Codevision Compiler
anzupassen... jedoch weiß ich bei diesen 2 zeilen nicht so recht
weiter:

if (bit_is_set(MMC_Read,SPI_DI) > 0) //Lesen des Pegels von MMC_DI

und

if (bit_is_set(Byte,(a-1))>0)  //Ist Bit a in Byte gesetzt

bit_is_set scheint ein makro zu sein, cvr unterstützt dies aber nicht,
und ich stehe aufm schlauch, da ich nicht weiß wie ich dies kurz
zusammenfassen soll.

Mfg

von Stefan Seegel (Gast)


Lesenswert?

Hallo Marcel,

tip: lass das "nicht SPI-zeugs" weg, dann brauchste die pin-abfragen
nicht. überlies dann einfach die teile für "ifndef spi_mode" oder
schau Dir meinen Code an, da ist nur spi drin. das spart doch einiges
an code und funktioniert einfacher...

Stefan

von Marcel Meyer (Gast)


Lesenswert?

Hallo Stefan,

da ich aber möglichst ungebunden sein möchte, wollte ich den gesamten
Code von Uli "übersetzen", das ist mir bis zu diesem Punkt auch recht
gut gelungen, denke ich ;)

Mfg

von Simon Lehmayr (Gast)


Lesenswert?

Ja, in der Spec für SD-Karten stand irgendwas von Initialisierung im SPI
Modus mit <=400kHz. Jedenfalls mag meine Toshiba SD nur wenn man das
auch so macht.

Zitat SD Spec:
"..if the design needs to support the MultiMediaCard, the clock should
be lowered to 400 kHz
or less during initialization. When the initialization process is
complete, the host can raise the clock speed to the
card’s maximum."

Ich hab das MMC_lib auch nach Assembler portiert. Da geht das auch und
es hat ca. 300 Words :-)

von uli (Gast)


Lesenswert?

Hallo,

Sehr guter Input habe ich woll irgendwie überlesen mit den 400Khz werde
ich mal sofort mit in meinen Code einbinden.

Mfg Uli

von uli (Gast)


Angehängte Dateien:

Lesenswert?

hallo,

habe das mit den 400Khz beherzigt und den SPI Takt um 128 bei der
Initzialisierung geteilt. Sowie nun mmc.h für Define und Prototypes
hinzugefügt sieht besser damit aus :-).

Mfg Uli

von nobody0 (Gast)


Lesenswert?

Ich verwende die Karten im SPI-Modus mit konstant 4 MHz ohne Probleme.
Zumindest beim MSP430 funktioniert das problemlos.

von uli (Gast)


Lesenswert?

Hallo @nobody0,

Bei mir funktioniert er mit meinen Karten auch ohne Probleme! Aber je
mehr Personen sich beteiligen desto sicherer wird er. Ich glaube wenn
dein Code mit 1000 Karten getestet wird werden auch einige Karten dabei
sein die nicht Funktionieren. (Murphy)

Mfg Ulrich

von Simon Lehmayr (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Stefan, das mit der SPI-Taktrate hab ich ausprobiert, allerdings
in Assembler.
Da mein ATmega16 mit 1 MHz läuft, hat SPI-Clock 500kHz bei SPI2X=1 und
250kHz bei SPI2X=0.

von Stefan Seegel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Simon!

Hat sich erledigt....ich hab aufgrund meines Gashirns immer versucht
SPI2X in das SPCR Register anstatt in das SPSR Register zu
schreiben....da kanns natürlich nicht funzen.

Im Anhang nochmal eine überarbeitete Versionen, Änderungen sind im
Header-File dokumentiert, läuft hier nun alles sehr ausgezeichnet.
Vielleicht kann das der ein oder andere mal "gegentesten" ?

MfG
Stefan

von Stefan Seegel (Gast)


Lesenswert?

Simon: Was ist das für ne Software/Hardware womit man solche Messungen
machen kann ? Sieht äußerst praktisch aus, auch haben will!

Stefan

von Simon Lehmayr (Gast)


Lesenswert?

Das Messgerät und die Software ist eine Eigenentwicklung basierend auf
einer Elektorschaltung "20/40MHz Logikanalyzer", die ich zusätzlich
zum Oszilloskop erweitert habe. Für meine Entwicklungen mit
Mikrocontrollern völlig ausreichend.
Schaltplan und Software kann ich ja mal veröffentlichen :-)

von Simon Lehmayr (Gast)


Lesenswert?

Basierend auf Stefans mmc_lib habe ich meinen MIDI Rekorder jetzt mit
SD/MMC-Karte gebaut, dazu gibts jetzt einen eigenen Thread.

von nobody0 (Gast)


Lesenswert?

@Uli:
Der Code werkelt seit einem Jahr in einigen tausenden dieser Geräte:

http://www.ergobike.de/de/zube05.html

und auch mit dutzenden getester Karten (MMC/SDC, klein/groß,
schwarz/blau/...) problemlos. Das ist zuverlässiger als die meisten
Kartenleser für PCs, denn bisher hatten wir in der Firma immer eine
Kombination Karte-Kartenleser-PC, die an einem PC nicht funktioniert,
aber an einem Nachbar-PC sehr wohl.

Allerdings arbeietet der Code auf dem MSP430 ohne explizites
Dateisystem, d. h. mit einer Datei, die in ein Dateisystem eingebettet
ist (u. dieses komplett ausfüllt).

Von einem anderen embedded Systemen und PCs weiß ich, dass es Karten
gibt, die man sowohl im Superfloppy-Format als auch als erste Partition
mounten kann, weil es im MBR Bitmuster gibt, die beides erlauben. Damit
ich den MSP430 nicht mit solchen Karten belasten muß, adressiere ich
die Karten mit dem IC nur linear und ansonsten ist die Reihenfolge
immer 1. Partition (/dev/sda1 o. Ä.) und wenn das fehlschlägt
Superfloppy (/dev/sda o. Ä.).

von Dariusz Zolna (Gast)


Lesenswert?

Hello all,

Norbert - I've used Uli's code, butI've changed my mind and will not
use any file system in the current project, but maybe in the future :-)
Volkmar - thanks for the info, I already know this code.

Darek

von Simon Lehmayr (Gast)


Lesenswert?

Wo gibts denn einigermaßen günstig Cardslots für MMC/SD zu kaufen?
Meinen habe ich aus einem defekten Reader ausgelötet... brauche aber
mehr!

von Oliver Keller (Gast)


Lesenswert?

Hi,

ich habe erst kürzlich den Siemens USB MP3 Player für Handys zum
ausschlachten entdeckt. (der war für die alten, bis S45, Modelle
gedacht)
Bei Ebay kriegt man den jetzt neu für 3EUR Sofort-Kauf!
(jaja, plus Versandgebühr...)

Obwohl das Teil nur MMC Cards frisst (benutzt wohl leider nicht den SPI
Modus), hat es einen vollwertigen 9 Pin SD-Card solt. Einschaltkontakt
gibts zwar nicht und entlöten muss man ja auch, aber dafür kann man
noch einen STA015T MP3 Decoder, nen DAC dazu und eine uC mit USB von ST
ausschlachten. Für letzeren habe ich allerdings noch keine Software
gefunden. Ist wohl ein spezieller, wenig verbreiteter, uC.
Falls es noch jemanden interessiert: Der Player hat 5 Tasten
(Abspielsteuerung und Laustärke) plus eine um Gespräche anzunehmen
("Headset Funktion"). LCD gibts nicht, Titel-Daten zeigt einfach das
Handy per RS232 an. Da das Handy nur "passiv" ist, geht der Player
auch ohne Handy mit lediglich einer Spannungsversorgung (~ 3 Volt am
Handy Stecker).
Insgesammt ein schönes und gerade sehr preiswertes Spielzeug.

Viel Spass am Gerät.... ;-)
Oli

von Norbert Pil (Gast)


Lesenswert?

Hello Stefan,

I'm trying to port your code to the msp430 cpu, I think i've got the
mmc_init() working but i have some questions:

- What could be the best way to check if the card works like it should
, mmc_init returns 0 but i'm not sure if the init worked.

- Can i use a SD card without filesystem, just start writing sectors
until it's full and is it possible to read the card under let's say
XP with special diskedit software (i used norton diskedit long time
ago) ?

Thanks,
Norbert.

von Stefan Seegel (Gast)


Lesenswert?

Hi Norbert!

If the mmc_init() function returns 0, the card should be initialized
and work fine, otherwise it would return a value different to 0.

Further, you could generate a sector of random bytes, write them to the
card and then read back and verify.

It's no problem to use the card without a filesystem, or in other
words, using your own file system. But remind that you have to read and
write the card in complete sectors, each of 512 bytes. Also it's
absolutly no problem to read the data from the card back at the PC
using a disk-hex-editor. That's exatly the way I'm using my MMC: I'm
writing on it using the microcontroller (MEGA16), then I'm putting the
MMC into my USB-Cardreader and reading back the data with
"hex-workshop".

Greetings from Franconia (South Germany),

Stefan

von ape (Gast)


Lesenswert?

so hab die Lib von Stefan Seegel auchmal ausprobiert. Funktioniert
wunderbar. Ich hab eine 64MB MMC von Hama und steuere sie mit einem
mega128 an. Der AVR läuft mit 18,432MHz und das SPI auf maximaler
geschwindigkeit (also 9,126MHz)
Zur geschwindigkeitsmessung lese ich einfach 5 sekunden lang sektoren
ein und gucke hinterher wieviele er gelesen hat. Dateisystem wird nicht
beachtet. Ich bin auf respektable 4081 Sektoren bzw. 408,1kb/s
gekommen.
Ich hab übrigens 60kb/s rausgeholt, in dem ich mmc_send_byte() als
inline deklariert habe
und noch einmal 30kb/s, in dem ich bei mmc_read_block() den datentyp
von count von unsigned long (32bit) auf uint16_t (16bit) verkleinert
habe.
und wenn ich mir so die pausen zwischen den einzelnen bytes angucke
(oszilloskop an der clock leitung) müsste noch fast doppelt so viel
drin sein

mfg
ape

von ape (Gast)


Angehängte Dateien:

Lesenswert?

so hier mal meine Version der Lib das Headerfile hat sich nicht
geändert.
schaffe jetzt lesend über 500kb/s
schreiben hab ich nichts weiter geändert.

ape

von nobody0 (Gast)


Lesenswert?

Mit MSP430, 8 MHz (4 MHz spi) u. SPI-Mode erreiche ich 30 kB/s, das ist
rund Faktor 15 langsamer.
Da der MSP430F149 auch HW-Multiplikator u. SPI in Hardware hat, sollte
der Unterschied nicht so groß sein, meine ich.

Funktioniert dein Code wirklich mit dutzenden verschiedener Karten ohne
Fehler?
Ich mußte nämlich lange rumprobieren, bis die Wartezeite für alle
Karten ausreichten, denn einige sind im Standard nicht spezifiziert.

von Simon Lehmayr (Gast)


Lesenswert?

Wo musstest du überall die Zeiten anpassen und auf welche Werte?

von nobody0 (Gast)


Lesenswert?

Einige Wartezeiten; man kann ja nicht ohne Wartezeite die Kommandos
pausenlos schicken u. dann pausenlos Daten empfangen.
Welche Zeiten es genau waren, müsste ich nachsehen.

von uli (Gast)


Lesenswert?

Hallo,

hier der neue Source Code von mir, zur Auswahl stehen Simon Lehmayrs
mmc library (plus änderung von APE) und meiner(MMC unterstützung auch
ohne SPI) aber halt beide nun auch mit FAT16 lese Unterstützung.

Mfg Ulrich Radig

von uli (Gast)


Lesenswert?

Sorry meinte die Library von Stefan Seegel

Mfg Uli

von ape (Gast)


Lesenswert?

> Funktioniert dein Code wirklich mit dutzenden verschiedener
> Karten ohne Fehler?

du kannst mir gerne ein dutzend verschiedene Karten zu schicken dann
probier ichs aus, aber ansonsten kann ich nur sagen das der kram mit
meiner funktioniert :)

von ape (Gast)


Lesenswert?

achja und zur geschwindigkeit
wie gesagt ich mache im moment mit den daten noch gar nichts. ein
sektor wird in den buffer geladen. dann der buffer mit dem nächsten
sektor geladen usw.
30kb/s klingt mir eher nach lesen mit fat oder so

von nobody0 (Gast)


Lesenswert?

Nene, mit FAT ist da nix; da wird einfach nur low-level
gelesen/geschrieben (SDS, simple data storage), so wie in einer
billigen Digital-Kamera.
Als Einbettung ist eine FAT-Datei da, die die Karte komplett ausfüllt,
aber davon sieht der MSP430 nix, so dass es für den PC FAT ist und für
den MSP SDS.
An den 30 kB/s konnnte auch mit etwas Tuning und mspgcc statt iar nicht
viel geändert werden.

Mit FAT mache ich da nix, denn gibt's ja auch Probleme wie dass einige
Karten sowohl im Superfloppy-Format als auch als erste Partition
gemountet werden können; davon habe ich zwei.
Windoof-kompatibel testet deshalb der Treiber für S3C2410 zuerst die
erste Partition und erst dann die Superfloppy.

von Samy (Gast)


Lesenswert?

Hallo miteinander!

Hat jemand von euch evtl. das ganze Programm in Assembler?!
Verstehe leider nicht viel von C...
Kennt jemand gute Links zu Assemblerprogrammen für Compact Flash oder
MMC Routinen?!
Jaja, Ihr lacht mich bestimmt aus weil ich kein C beherrsche :-)
Aber dauert noch ein 3/4 Jahr bis wir in der Schule C++ lernen werden
:-(

von Simon Lehmayr (Gast)


Angehängte Dateien:

Lesenswert?

Die Assemblerdatei MMC.ASM ist eine Portierung von Stefans mmc_lib nach
Assembler. Das MidiMMCm8.asm file ist aus einem meiner Projekte, da
kannst du studieren, wie die Routinen aus mmc.asm verwendet werden.

von Samy (Gast)


Lesenswert?

Vielen Dank!
Hoffe mal ich bringe das Ganze hin!
Mir macht die Geschwindigkeit Sorgen da ich 80 KB/s lesen oder
schreiben will und hoffe dass ich das ohne FAT hinkriege!
Was meint Ihr dazu?
Oder soll ich doch lieber ne CF verwenden damit ich die 80KB/s
hinkriege?!

von Dariusz Zolna (Gast)


Lesenswert?

Hi guys,

Recently I've found a strange problem with Panasonic SD card. Sector
numbers accessed from Atmega are not equal to sector numbers accessed
using a PC card reader! Sector 0 on PC is sector 39 on AVR, sector 1 on
PC is 40 on AVR and so on. It means that sector 0-38 are not accessible
on PC. What is the purpose of this area? How can I check how big is it?
64MB SanDisk didn't have this.

Darek

von nobody0 (Gast)


Lesenswert?

Which error messages?
Try it with dd (reading/writing), e. g. after booting from a
Knoppix-CD/DVD.

von Eva Hafenstein (Gast)


Lesenswert?

@Marcel

Ich weiß nicht, ob Du es inzwischen schon herausgefunden hast:

  loop_until_bit_is_set       =>    while(!(REGISTER&(1<<BIT))){}

  loop_until_bit_is_clear     =>    while(REGISTER&(1<<BIT)){}

Du musst nur darauf achten, dass Du das verwendete BIT oben im Programm
mit #define definierst, weil in der mega128.h keine Bitdefinitionen
enthalten sind.

Weil Du auch den CodeVisionAVR benutzt habe ich auch noch eine Frage:
In einem Tutorial für den WinAVR habe ich ein Beispielprogramm für den
AD-Wandler gefunden. Darin wird die Funktion  SIGNAL()  aufgerufen, die
der CodeVisionAVR nicht kennt. Weißt Du, was der CodeVisionAVR statt
dessen haben möchte?

Eva

von rschaefer (Gast)


Lesenswert?

Hat jemand das Projekt von Uli (mmc incl. fat)
mit einem atmega16 bzw. atmega32 zum Arbeiten bekommen??
Kann es sein, daß durch die großen Arrays
zum Lesen der Blöcke größere Atmegas (evtl. sogar atmega128)
notwendig machen??
Die mmc Geschichte habe ich hinbekommen, doch wenn ich die fat
Funktionalität ausprobiere, spielen meine µC verrückt.

mfg

René

von uli (Gast)


Lesenswert?

Hallo,

Für Fat16 braucht du min. einen Mega32.

Mfg Ulrich

von Alexander Höller (Gast)


Lesenswert?

Hallo,

mir ist da etwas unklar mit den Sektoren:
Sind diese Sektoren tatsächlich hardwaremäßig auch "getrennt", so
dass die Größe fix ist? Oder kann man die Größe eines solchen Sektors
einstellen? (OHNE FAT.. einfach nur die MMC Byte für Byte
beschreiben/auslesen)

----

Was ich bis jetzt verstanden haben:

Um einen ganzen Sektor zu LESEN muss ich...

1.) CMD16 zu MMC schicken, wobei die 4 inneren Bytes die Adresse des
Startbytes sind (heißt das, man kann an jeder Stelle beginnen einen
Sektor auszulesen?) -> Antwort muss 0x0x sein!

2.) Warten bis die MMC das StartByte (0xFE) schickt
Nur wie kann ich der MMC sagen, wie groß der Sektor ist, den ich
schreiben will?

3.) Sektorgröße * 1 Byte einlesen (das sind die Daten, die ich
eigentlich aben will)

4.) 2 Byte (CRC) einlesen und verwerfen


Um einen ganzen Sektor zu SCHREIBEN muss ich...

1.) CMD24 zu MMC schicken, wobei die 4 inneren Bytes die Adresse des
Startbytes sind -> Antwort muss 0x00 sein.

2.) jetzt kommt ein Punkt, den ich nicht verstehe:
//Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte
  for (int a=0;a<100;a++)
  {
  tmp = Read_Byte_MMC();
  }

3.) Startbyte (0xFE) an die MMC schicken

4.) die Daten (Sektorgröße * 1 Byte) an die MMC schicken

5.) 2x 0xFF schicken (CRC - im SPI Mode nicht benutzt?)

6.) Warten bis die MMC 0xFF senden - WARUM ?

hab ich das soweit richtig verstanden?? - was bringt der Pkt. 2 beim
Schreiben? warum muss ich bei Pkt. 6 auf ein 0xFF der MMC warten?

---

Nur wie/wo kann ich die Sektorgröße einstellen? Ich kann ja nicht
einfach weniger Daten einlesen/schreiben als die MMC erwartet, oder?

Falls man die Sektorgröße ändern kann, kann man sie auch nach dem
Beschreiben ändern um mehr Daten auf einmal auslesen zu können?
Sinn:
Ich will im Abstand meherer Sekudnen div. Messdaten (die immer die
gleiche Länge haben - weiß aber noch nicht genau wie lang) auf die MMC
schreiben ... später dann alle Daten auf einmal, möglicht schnell
auslesen und via USB an den PC schicken!


mfG,
aleX

von Stefan Seegel (Gast)


Lesenswert?

Hallo Alex !

zu Punkt 2:
hier wird einfach einige Zeit "gewartet", bis die Karte sich darauf
vorbereitet hat die Daten anzunehmen.

zu Punkt 6:
auch hier wird gewartet, bis die Karte die zu schreibenden Block auf
dem Flash abgespeichert hat. Der Controller in der Karte zeigt das,
indem er ein 0xff ausgibt.

In dem Datenblatt von der MMC die ich habe steht drin dass die
Blockgröße fest auf 512 Byte eingestellt ist. Es gibt zwar ein
Commando, mit dem man die Blocklänge umkonfigurieren kann, dieses
Kommando ist aber (zumindest bei meiner Karte) unwirksam.
Da du Messwerte hast die vielleicht pro "Block" nur ein paar Byte
brauchen kannst du (bzw musst du) Dir ja im µC nen block von 512 bytes
reservieren, und den mit Deinen Daten vollschreiben. Wenn selbiger voll
ist, wird der Block an die MMC gesendet...

Stefan

von Alexander Höller (Gast)


Lesenswert?

Hallo,

danke erstmal für die nächtliche Antwort ;)

Pkt. 6 hab ich verstanden ... warum werden bei Pkt. 2 aber Daten
eingelesen (also Clock Leitung "gepulst", auch wenn die Daten eh
verworfen werden) wenn nur gewartet werden soll?

Wenn man die Blockgröße nicht ändern kann, muss ich es wohl so machen,
dass ich einen Block von 512 Byte möglicht gut fülle... was aber doch
recht unsauber ist:
.) benötige ich unnötig Speicher am µController
.) wird ziemlich sicher Speicher unbenützt bleiben - angenommen pro
Messung muss ich 70 Byte speichern (Größenordnugn stimmt in etwa) -
dann kann ich pro Block 7 Messungen = 7 * 70 Byte = 490 Byte
abspeichern -> pro Block bleiben 22 Byte unebenützt.

Könntest du mir ev. sagen, wie man die Blockgröße ändern könnte (wenn
es die Karte unterstützen sollte)?

Eine andere Idee:
Die Zeit, die ich zum Speichern der Daten brauche ist absolut nicht
kritisch - deswegen könnte ich nach jeder Messung die Daten auf die MMC
speichern. Angenommen die Messdaten haben pro Messung 70 Byte - dann
Speicher ich pro Messung immer diese 70Byte + 442byte 0xFF ... beim
nächsten Speichern erhöhre ich die Startadresse eben um 70Byte!
Gut, am Ende der Karten würde fast ein Block unbenützt bleiben, aber
der Verlust ist bestimtm vernachlässigbar.

Dafür müsste ich aber wissen, ob die Startadresse wirklich die Byte-Nr.
angibt, ab welchem der Block geschrieben werden soll - bei einer solch
langen Adresse ist das ja anzunehmen:
4 Byte Adresse = max. 4294967295 adressierbare Byte = ~4GB (gibt ja
noch nicht mal Karten mit so viel Kapazität)

mfG,
aleX

von Norbert Pil (Gast)


Lesenswert?

Hello group,

Things seem to be working, i've used much of the info on
http://www.ulrichradig.de/ and the tips from other here, thanks. I have
some questions, i see when using FAT the whole cluster thing comes up.
Can i do without it and just write sectors with the CMD24 command ?
I'm making a logging device which is going to sample at a rate of
10Hz. Can the MMC/SD card handle this speed without holding up the
measurement ?

Norbert.

von Oliver Keller (Gast)


Lesenswert?

Also euer Coder und Veröffentlichungs Wesen in aller ehren, aber ich
verstehe nich ganz wieso es jetzt Ulrich Radigs und Stefan Seegels code
jeweils mit Fat16 Ünterstützung in einem "release" gibt
(SourceCode1_2.zip).
Welchen Vorteile haben die jeweiligen SPI-Mode code Teile?
Aus einem älteren Beitrag konnte ich nur entnehmen, dass Stefans code
evtl. bei mehr Karten funktioniert und daher universeller ist.

Ich bin bereits an der Portierung eines AVRGCC MMC/FAT codes von
www.phrozen.org bzw. von hier, aus der Codesammlung:
http://www.mikrocontroller.net/forum/read-4-98187.html
nach MSPGCC gescheitert. Viel zu ändern gabs zwar nicht aber im
Endeffekt war die Hardware zu unterschiedlich, so dass ich irgendwann
nicht mehr durchgestiegen bin (MMC und VS1001 waren teilweise an
einem SPI Bus). Und auf die white papers von M$ hatte ich dann
irgendwie keine Lust...

Jetzt würde ich gern nochmal anfangen und "so wenig frust wie
möglich" erleben ;-)

Danke und Gruss,
oli

von uli (Gast)


Lesenswert?

Hallo @oliver

der Vorteil an meinen Code liegt daran das dieser auch MMC - Karten an
irgend einen Port des AVR´s unterstützt. Gehe her streiche die
Portunterstützung heraus verbessere den Code und du hast den Code nun
von Stefan Seegel, da mir der stark verbesserte Code sehr gut gefallen
hat habe ich ihn halt mit aufgenommen. Inzwischen habe ich auch meinen
Code weiter verbessert gehabt.

Mfg Ulrich

von Alexander Höller (Gast)


Lesenswert?

Hallo,

@ Uli:
Hab in deinem Source paar Kommentare gefunden, die - vermutlich durch
Copy & Paste - nicht ganz stimmen ;) :

bei den Fkt. "Read_CSD_MMC" und "Read_CID_MMC" steht im Kommentar
immer, dass CMD16 geschickt wird... allerdings wird CMD 9 bzw. CMD10
gesendet!

Soll keine Kritik sein (find den Code nämlich echt spitze ;) ), nur ein
Hinweis, dass es - falls weitere Versionen rauskommen - eben berichtigt
wird ...

mfG,
aleX

von Dariusz Zolna (Gast)


Lesenswert?

Hello Norbert,

I am storing data on SD card ad 1Hz (mega32 @ 16MHz), but
reading/writing 4 or 5 sectors at a time, so if you write only one
sector @10Hz, it should work.

Darek

von Alexander Höller (Gast)


Lesenswert?

Hallo,

hab jetzt endlich mal nen Prototypen aufgebaut und wollt versuchen auf
meine SanDisk 128MB SD KArte zuzugreifen... leider ohne Erfolg - etwas
Merkwüdiges ist mir dabei allerdings aufgefallen:

wenn keine MMC/SD Karte drinen ist, dauert es etwa 3 Sekunden bis die
200 Init Versuche vorbei sind und ein TimeOut kommt .... mit Karte
dauert das ganze etwa 1/3 Sekunde - warum ist das so ??


Da ich den ATMega64 verwendet, musste ich die Pin/Port-Defins
anpassen:
#define MMC_PORT PORTB
#define MMC_DDR DDRB

#define SPI_MISO  PB3    //DataOut of MMC
#define SPI_MOSI  PB2    //DataIn of  MMC
#define SPI_CLK    PB1    //Clock of MMC
#define MMC_CS    PB0    //ChipSelect of MMC

So "funktioniert" es auch ... also es wird ein TimeOut erkannt! - Nur
wenn ich MMC_CS auf einen anderen Pin des Port B lege, dann kommt nicht
mal mehr ein TimeOut ... ? - Ich bin echt schon am verzweifeln, weil
das och SEHR merkwürdige Fehler sind ;(

Aja, ich verwende die mmc_lib 1.1!


mit freundichen Grüßen,
aleX

von Uli (Gast)


Lesenswert?

Hallo,

Ich würde mal den SPI_SS pin definieren aber nicht belegen!
Bei mehreren Mega128 ist es bei mir vorgekommen das die Karte nicht
erkannt (oder nur teilweise)wurde da dieser Pin nicht definiert wurde.
Kannst ja auch im meinen Code nachschauen (habe ihn immer def.).

Mfg Ulrich

von Tobias Schneider (Gast)


Lesenswert?

@Uli
Einige Anmerkungen zu deinem Code:
Mit meiner extrememory 128mb karte von reichelt hat deine lib im
uersprungszustand nicht funktioniert. Mit der lib von Stefan lief
jedoch alles auf anhieb. Nach kurzem Vergliech bin ich dan darauf
gekommen, dass Stefan immer wenn er bei CS high Pulse an die Karte
geschickt hat, 0xFF aufs SPI geschrieben hat. Nach dem ich dies in
deinem Code ebenfalls veraendert habe funktioniert auch deine lib.

In dem Kommentar zu initialisierung des hardware SPI schreibst du, dass
SCK idle high ist. Du initialisierst das SPI jeeoch mit idle low, was ja
auch richtig ist. Hier sollte also der Kommentar geaendert werden.
In diesem Zusammenhang sollte wohl auch das soft ISP angepasst werden,
das davon ausgeht, das clock idle high ist.

Gruß Tobias

von Tobias Schneider (Gast)


Lesenswert?

@Uli

Ich arbeite gerade an einer minimalen Fat32 implementierung.
Unterumstaenden ist das was ich hier schreibe bezogena uf Fat16
quatsch, aber ich glaube in diesem Punkt unterscheiden Fat16 und Fat32
nicht:

Folgendes findet sich ein deiner lib in fat.c in Read_Root_Dir_Ent():

if ((TMP_Buffer[a] != 0x42) & (TMP_Buffer[a] > 0x20) & (TMP_Buffer[a]
!= 0xE5)) //Prüfen ob es ein 8.3 Eintrag ist

Damit verhinderst du effektiv, dass Dateien, die mit 'B' anfangen
angezeigt werden. Soweit ich das bisher beuerteilen kann fangen
Eintraege fuer LFN's mit einem B an. Anstatt dem ersten Buchstaben
solltest du besser ueberpruefen, ob das Attrib Byte auf 0x0F ist und
den Eintrag damit filtern.

Gruß Tobias

von Stefan Seegel (Gast)


Lesenswert?

Hallo!

Hab gerade festgestellt das bei einigen 16 MB MMC Karten sich bei
meinen ersten MMC-Gehnversuchen einige Sektoren "eingebrannt" haben,
und zwar genau die, die ich mit dem AVR beschrieben habe. Ist es
prinzipiell möglich dass sich Sektoren einer Karte z.B. durch
Überspannung oder zu lautes Fluchen etc. "einbrennen" ?
Lesen kann ich die Sektoren noch, aber weder am AVR noch am PC via Disk
Hex Editor überschreiben. Oder gibt es einfach einen Sektor des als
"Writeprotects" für die Sektoren definiert ist ???

Gruß
Stefan

P.S. Werde demnächst mal eine aktuelle Version meiner mmc_lib
einspielen. Hab darin noch einige Verbesserungen und Ideen die sich
hier so im laufe der Zeit ergeben haben integriert. Falls noch jemandem
was seit dem letzten Release aufgefallen/eingefallen sein sollte bitte
hier kurz noch eine Nachricht in den Thread schreiben!

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Also noch mal Fehler beseitigt

Mfg Ulrich Radig

von Sascha (Gast)


Lesenswert?

Hi,
hab heute, nachdem alles zusammengelötet ist, Uli's source
ausprobiert. Karte wird auch gefunden. Aber bei
"Ausgabe des Root Directory", macht der ATmega 32 nen Reset.

Hat jemand ne Idee?

Mfg Sascha

von Sascha (Gast)


Lesenswert?

Hmm, nachdem ich die Geschicht mit FAT erst mal weglasse, um überhaupt
so von der Karte zu lesen, habe ich arge Problem, das Der Mega32 die
Karte überhaupt erkennt.

Mfg Sascha

von Sascha (Gast)


Lesenswert?

Habe festgestellt, der Code V1.02 funktioniert bei mir, aber der V1.03
nicht.

Mfg sascha

von Uli (Gast)


Lesenswert?

Hallo @Sascha

Bist du dir sicher das bei dir die Version 1.3 benutzt hast, mit der
libary von mir oder Stefan?? In der Version 1.3 hat sich nur ein Byte
wert verändert. Der aber bei Stefans Version schon seit Anfang an dabei
ist. Bei Inizialisieren müssen 74 Clock Impulse an die MMC gesendet
werden ich hatte dabei 0x0f stehen hin gehörte aber 0xff das ist die
einzige Änderung.

Mfg Ulrich Radig

von Sascha (Gast)


Lesenswert?

Ja, ich nehme deinen Code. Tausche ich die Datei mmc.c V1.02 gegen 1.03,
findet er die Karte nicht mehr. Ist eine nokia 32MB

Mfg Sascha

von Tobias Schneider (Gast)


Lesenswert?

Hi,
@Uli:
in
unsigned char Write_Command_MMC (unsigned char *CMD)

findet sich das selbe nochmal.

@Sascha:
Aender in der
unsigned char Write_Command_MMC (unsigned char *CMD)
Methode von Ulis 1.03 Code mal folgende Zeile:
write(0x00);
in die hier um:
write(0xFF);
Vll. hilft es ja was ...

Gruß Tobias

von Sascha (Gast)


Lesenswert?

Hi,

nachdem ich es mit Software-SPI gelassen habe und Hardware-SPI nehme,
geht es. Einzige Problem ist jetzt noch, das Der ATmega32 bei der
Ausgabe des Root Directory nen Reset macht.


Mfg Sascha

von rschaefer (Gast)


Lesenswert?

@Sascha

ich habe ebenfalls dieses Problem und vermute, dass
es an dem "wenigen" RAM des Atmega32 liegt.
Schließlich werden für die FAT Geschichte
mehrere Arrays a 512 Byte genutzt.

mfg

René

von Sascha (Gast)


Lesenswert?

@rschaefer

Hast du mittlerweile schon ne möglichkeit gefunden?

Mfg Sascha

von Fiffi (Gast)


Lesenswert?

Hallo Uli,

ich habe heute die Version 1.3 deiner mmc.c und mmc.h mit einer 64MB
Transcend MMC Karte getestet.

Funktioniert prima !
Vielen Dank für die Lib !!!


Auf der Rückseite der Karte steht folgendes:
093977 0134
6330 1A 64MB


Gibt es irgendwelche MMC Karten / Hersteller die mit deiner Lib nicht
funktionieren ?


Gruß

Fiffi

von Tobias Schneider (Gast)


Lesenswert?

hi,
@stefan:
Ich kann deine beobachtung mit den eingebrannten Sektoren jezt leider
bestaetigen. Bei meiner 128MB reichelt karte hat sich das selbe
ergeben. Weder per MC noch unter win oder lin laesst sich die karte
noch formatieren oder manche dateien aendern. auslesen funktioniert
jedoch noch immer bestens.

Nuja da laesst sich wohl nix mehr machen.

Gruß Tobias

von Fiffi (Gast)


Lesenswert?

Hallo,

@Tobias und Stefan:

Mit welcher Spannung habt Ihr die MMC Karte während dem schreiben
betrieben ?

Sind die Sektoren "defekt" wenn Du sie einmal per AVR beschrieben
hast ?


Gruß

Fiffi

von Tobias Schneider (Gast)


Lesenswert?

Hi,
ich hab das ding an geregelten 3,3V betrieben. Ich hab glaub so 2-3mal
was schreiben koennen, aber jezt geht nichts mehr mit der karte

von Stefan Seegel (Gast)


Lesenswert?

Tach,

ich hatte die Karte mit 2 Dioden in Reihe an 5 Volt, also rechnerisch 5
- 0.6 - 0.6 = 3.8 Volt. Aber an Überspannung scheints nicht zu liegen,
Tobias sagt er hat geregelte 3.3 Volt verwendet ?!

@Tobias
Wie hast du die Spannung geregelt ? LM317 ?

Muss man zunächst die CSD Register auslesen um rauszufinden welche
Spannung man genau nehmen darf/soll ?! Wär natürlich nicht ganz so
praktikabel erst für jede Karte die Spannung einstellen zu müssen...

MfG
Stefan

von Tobias Schneider (Gast)


Lesenswert?

Hi,
nein kein LM317 sindern ein 3,3V Low Drop Regler(CM1086-3,3 oder so(hab
den genauen Typ grad nicht im Kopf)) der seinen saft aum USB hatte. Ich
denke aber weniger, dass man die Spannung erst noch aus den Registern
auslesen muss. Das waere ja sont ne schweine Arbeit fuer das
Hardwaredesign.

Ich werde es jezt noch mit einer billigen SD-Card von e-Bay versuchen.

Gruß Tobias

von Fiffi (Gast)


Lesenswert?

Hallo,

ich habe mich vertan.

Meine MMC Karte funktioniert nicht mit Uli's lib, sondern mit
Stefan's lib.


Wenn ich Uli's lib benutze, bekomme ich keinerlei Daten/Antworten von
der Karte.


Gruß

Fiffi

von Fiffi (Gast)


Lesenswert?

Hallo,

mit welchem SPI Takt betreibt Ihr die MMC Karten ?

Ich komme nicht über 1 MHz mit der Schaltung von Holger (74LVX04 +
74HCT125). Ich habe eine kleine Adapterplatine über 15cm Flachbandkabel
am STK500.

Ich komme auf 104,5 KBytes/sec lesen, und 62,1 kBytes/sec schreiben
(ohne Dateisystem).


Wie sind eure Erfahrungen ?


Gruß

Fiffi

von Norbert Pil (Gast)


Lesenswert?

Hello All,

Things are working very well, thanks to all here.

I'm not using a FAT and write my data in raw sectors. I calculate
which is the first datasector and start writing there, this because
i'm reading the data from the card with a windows machine and it's
trying to be smart, if i start writing from sector 0 it tells me the
card is not formatted.

A strange thing is, my code calculates a number which is the first
datasector. I write my data but if i read the same sector on the PC i
get the 32th sector. So to read the first sector on the PC i have to go
back 32 sectors.

Does anyone know why the cards gets written 32 sectors of ?

Greetings,
Norbert.

von Tobias Schneider (Gast)


Lesenswert?

Hi,
if i remember right, the Volume ID starts 20h(32d) Sectors after the
MBR. Is there a possibility that windows starts sector counting at the
VID and the MC at the MBR? This would explain the 20h sectors
difference between them.

Greetings Tobias

(Sorry for the probably bad english)

von Norbert Pil (Gast)


Lesenswert?

Hello Tobias,

On both devices i do exectly the same, read sector 0 and calculate the
first datasector. On both machines i get the same number, for example
sector 279 for a 64mb mmc card, only the embedded device seems to write
32 sectors back while saying.

Greetings,
Norbert

von NikiXXL (Gast)


Lesenswert?

Hallo Leute,

ich habe hier noch eine die in einem Siemens SL45 war. Irgendwie
bekomme ich die nicht initialisiert.

Unterstützen eigentlich alle MMCs von Sandisk den SPI modus?

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo @all,

Hier der neue Source Code, Problem war es das dieser nicht mit einen
Mega32(FAT) lief. Habe es mal mit einen Mega32 getestet und den
speicher weiter Optimiert. Somit läuft es nun auch mit einen Mega32.

Mfg Ulrich

von KoF (Gast)


Lesenswert?

@NikiXXL
prinzipiell ja, wenn sie sich mmc nennt ;-)
denn dann muß sie ja die spec's einhalten :-P

mfg KoF

von BernhardT (Gast)


Lesenswert?

@Stefan und Tobias
wenn ich Sandisk richtig verstehe gibt es nur einen permanenten Schutz
für die ganze Karte,
wird  PERM_WRITE_PROTECT [13:13] im CSD auch nur einmal gesetzt ist die
gesammte Karte entgültig schreibgeschützt !

1.5.8.9 Write Protection
The MultiMediaCard erase groups are grouped
into write protection groups. Commands ar e
provided for limiting and enabling write and
erase privileges for each group individually. The
current write protect map can be read using t h e
SEND_WRITE_PROT command.
In addition two, permanent and temporary, card
level write protection options are available. Both
can be set using the PROGRAM_CSD command
(see below). The permanent write protect bit, once
set, cannot be cleared. This feature is implemented
in the MultiMediaCard controller firmware and
not with a physical OTP cell.

• Write Protect Management
Card data may be protected against either erase
or write by the write protection features. The
entire card may be permanently write protected by
the manufacturer or content provider by setting
the permanent or temporary write protect bits in
the CSD. Portions of the data may also be
protected (in units of WP_GRP_SIZE sectors as
specified in the CSD). The SET_WRITE_PROT
command sets the write protection of t he
addressed write-protect group, and the
CLR_WRITE_PROT command clears the write
protection of the addressed write-protect group.

Wenn nur einige Sektoren schreibgeschützt sind und andere nicht  finde
ich in den Dateblättern nur eine Erklärung: die write protect groups.

Jede WP_group kann ein eigenes Schreibschutzbit haben (Hitachi S.23)

Hitachi S.31:
SET_WRITE_PROT = CMD28 mit  Argument [31:0]data adress.
Hat aber auch einen gegenpart:
CLR _WRITE_PROT = CMD29 mit  Argument [31:0]data adress.

Note: 1. 32 write protection bits (representing 32 write protect groups
starting at the specified address)
followed by 16 CRC bits are transferred in a payload format via the
data line. The last (least
significant) bit of the protection bits corresponds to the first
addressed group. If the addresses of
the last groups are outside the valid range, then the corresponding
write protection bits shall be
set to zero.

Wenn ich das nicht falsch verstehe ist der Schutz daher nicht
permanent. Mit SEND_WRITE_PROT = CMD28 mit  Argument [31:0]data adress
sollte man eigentlich rausbekommen ob Schreibschutzbits gesetzt
sind.Vielleicht können ja die PC-Kartenleser mit diesen (wohl
optionalem)Schutzbits nicht umgehen.

Gruß BernhardT

von Marius Affolter (Gast)


Lesenswert?

hallo

wäre es möglich die fertige FAT, sagen wir eine 16MB-Textdatei, per
Mikrocontroller auf der mm-karte zu erstellen und dann per uC direkt in
die (bekannten) sektoren und somit in die datei zu schreiben? ich denke
an die anwendung für datenlogger.
Dann bräuchte man gar keinen "FAT-Treiber" und somit würde der grosse
RAM Bedarf ~1.2KB wegfallen.

ist das realistisch?

grüsse, marius

von Norbert Pil (Gast)


Lesenswert?

Hello group,

I was thinking about doing the same and also interested if it is
doable. I don't know how the textfile is being written if the card is
completely  empty, if all the sectors are in sequence because that's
the way you're going to write them with the microcontroller.

Greetings,
Norbert.

ps. If this works, how about big card (512MB and bigger) does it work
with those cards too ?

von Uli (Gast)


Lesenswert?

Hallo @all,

Auf meiner HP gibt es einen neuen MMC/SD Treiber und mit nur noch 1
Buffer a 512Bytes. Das Filesystem kann auch fragmentierte Dateien
lesen.

Mfg Ulrich

von nobody0 (Gast)


Lesenswert?

@Marius Affolter:
Ja, das ist der übliche Weg, außer SDS (simple data storage, die Karte
wird direkt, z. B. zum Speichern eines Structs benutzt).
Dafür muß die erste Partition oder Superfloppy-Format und FAT genommen
werden, weil MS-Win nur dort lesen kann.
Meist wird eine Kennung an den Dateianfang gesetzt und die Daten
relativ zu dieser Adresse abgelegt.

von Volkmar (Gast)


Lesenswert?

Hallo Ulrich,

welche Auswirkungen hat den die Reduktion auf 1 Buffer? Wie sieht das
insbesondere mit der Schreibgeschwindigkeit und der Anzahl der
Schreibvorgänge auf den FAT-Sektoren aus?

Volkmar

von Uli (Gast)


Lesenswert?

Hallo @Volkmar

durch die Veränderung auf nur 1Buffer mit 512Bytes wird natürlich das
Filesystem langsamer da die FAT immer neu geladen werden muß.
Allerdings kann man ohne weiteres auch 2 Buffer a 512Bytes benutzen.
Ein Buffer für FAT der andere Buffer für Daten.

Mfg Ulrich

von nobody0 (Gast)


Lesenswert?

Dann darf man aber nur an durch 512 teilbaren Adressen Lesen/Schreiben;
ansonsten braucht man noch einen Buffer von i. Allg. 512 Byte.

von Uli (Gast)


Lesenswert?

@nobody0

Wieso den das ??
ich kann von jeder Adresse lesen und schreiben!

von Uli (Gast)


Lesenswert?

@nobody0

Mit Search_File suche ich mir den StartCluster des Files heraus.
Mit Read_File (Start Cluster,Workingbuffer,BlockCount) lese ich das
File in 512 Bytes schritten aus.

Mfg Ulrich

von nobody0 (Gast)


Lesenswert?

@Uli:
Du kannst auf der Karte selbst, also direkt, nur in Blöcken Lesen oder
Schreiben und im Allgemeinen nur in 512 Byte Blöcken.
Man kann natürlich zwei 512 Byte Buffer nehmen und das Lesen/Schreiben
mit diesen Buffern an jeder Adresse vornehmen (sowas habe ich gemacht),
aber low-level beginnt es immer an Adressen, die durch 512 teilbar
sind.

Übrigens fällt mir bei Uli immer unsigned long int ein, das ich z. B.
für uli_counter1 benutze; wollte ich nur mal loswerden ... ;-)

von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Hier Source Code2.0!!
Getestet mit einer 256MB SD Karte von San Disk!
Gibt es für 25€ bei Saturn im Angebot!
128 MB SD von Lexar.
128 MB SD von Hama.
32MB MMC von ExtremMemory

Mfg Ulrich

von nobody0 (Gast)


Lesenswert?

Hm, also ich habe meinen Code für MSP430 in der Firma mit mind. 15
Karten von 8 bis 512 MB getestet und zwar mehrere MMCs u. SDCs. Mit 3
Karten konnte ich nämlich nur für diese Karten brauchbarn Code machen;
die dann eingesetzten Billigst-Karten waren zunächst zu weit weg vom
Standard.
Du solltest Dir bei Ebay ein Dutzend verschiedene MMCs u. SDCs billig
kaufen, wenn der Code mit praktisch jeder Karte funktionieren soll.

von Uli (Gast)


Lesenswert?

Hallo @nobody0

Wenn du mir die Karten sponsorst habe ich kein Problem damit ;-)

Mfg Ulrich

von Tobias Schneider (Gast)


Lesenswert?

hi,
@Uli:
in der SanDisk MMC Doku lese ich:

After the last SPI bus transaction, the host is required to provide
eight clock cycles for the
card to complete the operation before shutting down the clock. The
state of the CS signal is
irrelevant throughout this eight-clock period. The signal can be
asserted or de-asserted.
Various SPI bus transactions are listed below.
&#8722; Command/response sequence; occurs eight clocks after the card
response end
bit. The CS signal can be asserted or de-asserted during the eight
clocks.
&#8722; Read data transaction; occurs eight clocks after the end bit of
the last data block.
&#8722; Write data transaction; occurs eight clocks after the CRC
status token.

In deinem Code werden diese 8 Clocks jedoch VOR jedem command
ausgegeben. Der Doku entnehme ich aber, dass die NACH dem command
ausgegeben werde sollen.

Hab ich das richtig verstanden oder ist dein Code nicht ganz stnadart
konform?

Gruss Tobias

von Rolf (Gast)


Lesenswert?

Wenn es funktioniert stimmt es. Bisher habe ich noch keine Karte
gesehenn, die sich an den Standard hält; ich mußte auch mit
Speicheroszilloskop wochenlang rumprobieren, obwohl einige Leute bei TI
meinen Treiber für MSP430 gut brauchbar gemacht haben (aber nur mit 3
Karten).
Außerdem sind einige Wartzeiten im Standard nicht spezifiziert; da muß
man irgendeinen "geeigneten" Wert einsetzen.

von Stefan Seegel (Gast)


Lesenswert?

Mal so ne zwischenfrage: Ist es eigentlich erlaubt die CHIPSELECT
Leitung der MMC mitten während der Übertragung (z.B. Sektor lesen) mal
eben auf high zu setzten, ein anderes Gerät über den SPI anzusprechen
und dann wieder weiterzulesen ?

MfG
Stefan

von nobody0 (Gast)


Lesenswert?

Nein, denn das CS ist für den Bus-Betrieb, bei dem mehrere Karten
parallel am Bus hängen. Während einer Transaktion darf nicht etwas
anderes auf dem Bus laufen.
Im Standard ist das beschrieben.

von Daniel (Gast)


Lesenswert?

Hi,
Habe Uli Code mit 2 16MB SD Cards getestet (Version 2.1)Demo main.c auf
einem ATMEGA32  - funktioniert super.
Da hast du einigen Bastlern einige Arbeit abgenommen.
- Besten Dank  Tolle Arbeit !!!!

Mich würde allerdings mehr interessieren wie ich Dateien mit dem Atmel
auf der Karte anlegen kann - bzw wie man mit Verzeichnissen arbeitet.
Gibts dafür auch schon kleine Beispielprogramme (will ja das Rad nicht
neu erfinden)
Bzw. is des so vorgesehen, dass man am PC eine Datei mit der
gewünschten Größe erstellt und deren Inhalt mit dem uC überschreibt!?

Grüße Daniel

von Ulrich (Gast)


Lesenswert?

Hallo,

Bei meinen Webserver arbeite ich schon mit Directorys (Telnet), werde
noch mal eine Doku erstellen! Das Schreiben von Datein,kommt im laufe
der nächsten Woche. Habe ich aber noch nicht ganz Fertig. Teste es
gerade mit meinem CCD den ich am Atmel angeschlossen habe.

Gehe jetzt erst mal Feiern.

Frohes neues Jahr!!

Mfg Uli

von Hans (Gast)


Lesenswert?

gibt es zufällig irgendwo einen schaltplan wo drinnen steht welcher pin
(name... z.b mosi,miso,...) auf welchen pin auf der karte kommt..

ich hab hier einige manuals... nur da ist nirgends der spi-mode mit
bildchen vom pinout beschrieben grml

und das was ich aus dem sd-manual von sandisk hab hat dazu geführt,
dass meine karte jetzt schrott ist(was angesichts der 16mb nicht weiter
tragisch ist)

btw ich hab ein stk500 genommen, die spannung auf 3,3V runter gedreht
und direkt verbunden... nur bevor ich jetzt das nochmal mach wollt ich
fragen obs irgendwo ein schönes "referenz-design" gibt...

73 de oe6jwf / hans

von Jens123 (Gast)


Lesenswert?

schau mal hier..

www.ulrichradig.de


ja, von dem ist auch die lib...

von Hans (Gast)


Lesenswert?

ja schon... aber..

seh ich das richtig... DI vom der MMC karte kommt auf MOSI vom AVR und
DO kommt auf MISO vom AVR... rest ist mir eigentlich schon klar...

73 de oe6jwf

von Uli (Gast)


Lesenswert?

Hallo @all,

Schreibt doch bitte in der Threadliste MMC/SD die zweite weiter! ich
finde hier wird es so langsam ein bischen voll!

Mfg Uli

von Daniel (Gast)


Lesenswert?

Blöde Frage  - "Threadliste MMC/SD die zweite" - wurde dieser Thread
schon angelegt und ich kann ihn nur nicht finden ( ein Link wäre
nett...) - oder ist der noch nicht angelegt worden !?

MfG Daniel

von Uli (Gast)


Lesenswert?

Hallo,

Ist schon angelegt!

http://www.mikrocontroller.net/forum/read-4-125350.html#new

Mfg Ulrich

von dave (Gast)


Lesenswert?

Hi,

darf ich mal ne Frage stellen :)

Hat es einen tieferen Sinn, warum du nen paar Sachen ins EEProm
speicherst? Ich versuche nämlich grad das ganze auf Assembler zu
packen. MMC funktioniert soweit.
Kann man das ganze nicht einfach beim Start laden und dann im RAM
verstecken? Ich seh da keinen Unterschied...

dave

von Uli (Gast)


Lesenswert?

Hallo,

Natürlich kann man die Sachen aus dem EEProm ins Ram packen. Habe ich
nur aus Platzgründen gemacht.

Bitte den neuen Thread benutzen der hier dauert mir jetzt zu lange!!

http://www.mikrocontroller.net/forum/read-4-125350.html#new


Mfg Uli

von Michael Szivatz (Gast)


Lesenswert?

Hallo ,
            habt ihr den Code von Ullrich Rading in einen Code Vision
Code umgewandelt??

Ich arbeite  gerade drann, aber leider bekomm ich keine Reaktion von
der Karte zurück!

Habt ihr ein Ahnung was ich falsch gemacht haben könnte?


Meine SPI Einstellungen sind:
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 31,250 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: High
// SPI Data Order: MSB First


lg
 Michael Szivatz

von nobody0 (Gast)


Lesenswert?

Die 31,250 kHz SPI Clock Rate erscheinen mir sehr langsam. Ich habe auf
MSP430 immer 4 MHz verwendet und laut Spezifikation sind mindestens 20
MHz möglich.

von Michael Szivatz (Gast)


Lesenswert?

Langsamer sollte ja kein Problem sein oder?

lg

von nobody0 (Gast)


Lesenswert?

Theoretisch nein, so wie bei PCI, aber praktisch kann es gut sein, dass
man mindestens 1 MHz braucht, denn ich habe noch keine Karte gesehen,
die auch nur das vom Standard vorgeschriebene Protokoll einhält.

von Michael (Gast)


Lesenswert?

Danke flutscht schon! Allerding dauert das Schreiben in die Karte bei
häufigen Zugriffen ca. alle 255mal etwas länger! (keine Ahnung warum)

Habt ihr eine Ahnung,
man kann ja die Betriebsspannung aus einen Register auslesen!
Muß man die Karte nicht mit dieser Spannung betreiben?
Oder ist man mit 3V3 immer gut unterwegs???

lg
 Michael Szivatz

von nobody0 (Gast)


Lesenswert?

Ja, zumindest bei MMC kann man bis 3,6 V verwenden und die Werte für die
Stromaufnahmne sind für 2,7 V. Bei SDC sollte es ebenso sein, weil die
kompatibel ist.

von Lemming (Gast)


Lesenswert?

Hallo Leuts,
habe ein Datenlogger mit SD Card gebaut der FAT12 und FAT16 kann.
Jezt habe ich folgendes Problem, bei Batteriebetrieb ist warscheinlich
die Spannung beim Schreiben eingebrochen und mit der Karte ist etwas
undefiniertes gescheihen.
Kann dadurch der MBR überschrieben worden sein? Wenn ja wie kann ich
die Karte selber neu Formatieren und eventuell einen neuen MBR
anlegen.
Normale Reader können einer Karte ohne Partitionstabelle nicht lesen
also auch nicht formatieren.
Kenn sich da jemand aus von Euch?

von Thomas V. (Gast)


Lesenswert?

Hallo Lemming,

kann Dir leider nicht weiterhelfen, bin aber sehr an Deinem Datenlogger
interessiert. Kannst Du wohl weitere Infos zur Verfügung stellen
(Schaltpläne, Quelltext) wie schreibst du Dateien auf die KArte?

Vielen Dank, Thomas

von nobody0 (Gast)


Lesenswert?

Also "normale Reader" kümmern sich nicht um die Partitionstabelle,
denn ansonsten könnte man die Karten damit nicht formattieren.
Ich formattiere beispielsweise so:
mkfs.msdos -I -F 12 -f 1 -R 1 -v -S 512 /dev/sda

Man kann einfach ein Image von der Karte mache und diverse
Rettungs-Tools rüberlaufen lassen, die die Partitionen und die FAT neu
erstellen.
Zum Auslesen, beispielsweise zum Sichern von Datenträgern nimmt man am
Besten (unter Linux) ddrescue oder dd_rescue. Im Gegensatz zu dd
brechen die bei Fehlern nicht ab; die überspringen defekte Sektoren.

von Norbert Pil (Gast)


Lesenswert?

Hello Uli,

I'm using your 2.1 sources to read a 64MB SD card (transcend). I'v
formatted the disk en put the file 'index.htm' on it. While running i
get a big nothing between 'Directory' and 'Directory ende'. So it
doesn't find anything.

The second part where it should find the file 'index.htm' also
fails.

Any idea what i'm doing wrong ?

Norbert.

ps. If i look at the data from the Cluster_Data_Store() call it does
look like a Boot sector (MSDOS5.0 string)

von XJAG (Gast)


Lesenswert?

Hi,

ich möchte MMC- und SD-Karten mit verschiedenen Formatierungen testen.
Kennt jemand ein PC-Tool mit dem man mit verschiedenen Einstellungen
(z.B. Anzahl der Sektoren pro Cluster..., FAT12 und FAT16) formatieren
kann?
Das WinXP-Tool "format.com" ist leider nicht besonders mächtig.

Gruß
XJAG

von nobody0 (Gast)


Lesenswert?

Der MS-Win-Programmierer der Firma hier meint, daß man nur
MS-Windows-Default nehmen kann.
Unter Linux benutze ich das Superfloppy-Format mit mkfs.msdos
beispielsweise so:

mkfs.msdos -I -F 12 -f 1 -R 1 -v -S 512 /dev/sda

Bei größeren Karten (> 128 oder > 256 MB) braucht man -F 16 für FAT16.

von XJAG (Gast)


Lesenswert?

OK, aber irgendwo auf der Welt müsste es ein Windows-geeignetes Tool
(grafisch oder Kommandozeile) geben mit dem man auch unter Windows
FAT12 formatieren kann, oder?

Gruß
XJAG

von Lemming (Gast)


Lesenswert?

..das muß auch irgendwie unter Windows gehen! Es gibt aber einen
Unterschied zwischen dem Format von Win2000/XP und dem von 98
versuche mal "format m: /FS:FAT12 /A:512

von PatrickHH (Gast)


Lesenswert?

Schau mal hier nach: http://www.boot-us.de
mit dem Bootmnager kann man auch Partitionen anlegen und Formatieren.
Ist ein sehr guter Bootmanager. Bin damit sehr zufrieden.

Gruß PatrickHH

von XJAG (Gast)


Lesenswert?

@Lemming:
/FS:FAT12 geht unter XP leider nicht (unter /? nicht dokumentiert und
Test war auch negativ).
Es werden nur FAT, FAT32 und NTFS angeboten, wobei FAT immer FAT16
bedeutet.
Geht /FS:FAT12 unter Windows 98/ME? Weißt du das?

@PatrickHH
Danke für den Link. Werd ich mir dann mal ansehen.

Gruß
XJAG

von nobody0 (Gast)


Lesenswert?

Also mit cygwin ( http://www.cygwin.com/ ), sollten so ziemlich alle
Linux-Kommandos auch unter MS-Win > 9X laufen, also auch
Low-Level-Zugriffe auf Datenträger.

Das Lesen von FAT12 ist unter MS-Win kein Problem, so dass man mit
mkfs.msdos -I -F 12 -f 1 -R 1 -v -S 512 /dev/sda
(unter Linux oder MS-Win(>9X)+Cygwin) zumindst bis 128 MB formattieren
+
partitionieren kann.

von Lemming (Gast)


Lesenswert?

also ich hab das cygwin installiert aber die Kommandoshell kennt kein
mkfs.dos! Was nun?

von Norbert Pil (Gast)


Lesenswert?

Hello,

mkfs.dos is part of the dosfstools package. I don't know if there is a
cygwin package.

Maybe you can use a bootable livecd like Knoppix.

With regards,
Norbert.

von XJAG (Gast)


Lesenswert?

Hi,

next I'll try to find mkfs.dos on my Knoppix-CD at home.

Best regards
XJAG

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.