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

von bricktop (Gast)


Lesenswert?

Hiho

Folgendes möchte ich realisieren: von MMC nur Lesen
Ich habe eine Textdatei mit kurzen Sätzen à max 20 Zeichen (=20 Bytes
?)
Diese stehen unternander. Es sind ca. 30.000 von diesen Zeilen. Nun
möchte ich, mit einer alfabetischen Tastatur ein Wort eingeben (Display
zeigt an) und der PIC soll dann dieses Wort in der auf der MMC liegenden
.txt suchen und die direkt darunter liegende Zeile auf dem Display
anzeigen. Also eine Datenbank-Applikation. Ich weis nur net, wie
Windows die .txt auf die Karte schreibt. Sie muss das Ende einer Zeile
ja immer erkennen und dann die nächste (darunterliegende) zum PIC
senden.

1.) Wenn Windows also jede Zeile (mit max. 20Bytes) in einen Sektor
(512 Bytes) schreibt, müsste er nur immer zum nächsten Sektor fahren
und dessen Inhalt ausgeben.

2.) Wenn Win aber alles hintereinander anreiht, weiß ich nicht wie man
die Zeilenenden erkennen soll. Also bräuchte man ein
"Erkennungszeichen"?!

Das ganze würde ich in ASM programmieren, weil ich mich da schon eher
auskenne. Oder ist das Unsinn, aufgrund der Ausmaße?

von Rolf F. (Gast)


Lesenswert?

@Lemming:
Es muß mkfs.msdos und nicht mkfs.dos heißen.

@ bricktop:
DOS/MS-Win verwendet "\n\r" als Zeilenendzeichen.
Unter Unix/Linux hat man nur "\n".

von Volkmar (Gast)


Lesenswert?

@bricktop:

So nebenbei: Welche Reaktionszeit erwartest Du, wenn Du 30.000
Worteinträge vergleichen möchtest?

Volkmar

von bricktop (Gast)


Lesenswert?

na das ist ne gute Frage.
Allerdings habe ich gelesen dass so eine MMC ca. 5MB/s lesen kann. Und
diese Text-Datei ist nur 500kB groß

von Volkmar (Gast)


Lesenswert?

Es hängt nicht alleine an der MMC. Sondern auch an dem Controller bzw.
der Umgebung. Schau Dir mal die Geschwindigkeitsangaben hier im Thread
an. Sie schwanken von 30kb/s bis über 400kb/s. Wobei die 400kb/s nur
durch reines sequentielles Auslesen erreicht wurden.

Volkmar

von Daniel (Gast)


Lesenswert?

Kurze Frage an euch:

Ist es denn möglich einen SD-Port Doubler zu bauen?
(an meinen Pocketpc gibt es leider nur einen SDIO-Port, ich bräuchte
aber eine WLAN Karte und eine 1GB SD-Speicherkarte..)

von Nik Bamert (Gast)


Lesenswert?

Ich weiss zwar nicht ob es möglich ist,
aber wenn dir 256 mb auch reichen würden, dann wäre
so was vielleicht eine Lösung:
http://www.sandisk.com/retail/256mb-wifi-sd.asp

von Erik Lins (Gast)


Lesenswert?

Habe seit ein paar Tagen ein neues Board für diesen Zweck fertig:
ATmega128 mit MMC/SD-Karte und ein wenig Peripherie, dazu passend
Displayboard mit LCD und Tastern und ein passendes Gehäuse. Infos auf
www.chip45.com

Viele Grüße,
ER!K

von pebisoft (Gast)


Lesenswert?

hallo, das board gefällt mir gut.
ist eine gute ergänzung für meine gameboycam-experiemente mit dem avr,
um die bilddaten (16kbyte pro bild) in die speicherkarte zu schicken.
werde es mir demnächst bestellen.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

hallo, bei mir kommen fehlermeldungen:
outb,inp,cbi,sbi
wird nicht erkannt.
wer kann mir dafür ersatzroutinen geben, damit ich die mmc-karte
auslesen kann.
mfg pebisoft

von Elektrikser (Gast)


Lesenswert?

Diese Funktionen gitbt es in der aktuellen Version von WinAVR nicht mehr
(seit 14.02.2005). Lade dir halt die aktuelle Version der MMC-Bibliothek
bei Ulrich Radig (www.ulrichradig.de) herunter. Da ist es schon länger
abgeändert.

Gruß Elektrikser

von marcelKo (Gast)


Lesenswert?

Hallo,
verwendet jemand die MMC funktionen von ProcyonAVRliB von
http://hubbard.engr.scu.edu/embedded/avr/avrlib/ ?

nach ein paar Änderungen hab ich die zum laufen bekommen und kann nun
mit 1048Mbit in 512Byte Blöcken auslesen, bei einem mega128 und 8MHz.

aber nun muss ich noch die FAT einbauen damit der MP3 player richtig
geht.
einfaches auslesen der blöcke und abspielen auf einem VS1001 geht
schon.

sehe ich das richtig, das wenn ich FAT verwende und nur lesen will, das
ich dann garnicht die CID und CSD register lesen muss ?

grüsse

von Ulrich Radig (Gast)


Lesenswert?

Hallo,

Ja das ist Richtig. Diese Register benötige ich nur zum Formatieren.

Mfg Ulrich

von marcelKo (Gast)


Lesenswert?

Ähm,
ich meinte natürlich lesen mit 1048Kbit
und schreiben hab ich gerade probiert geht mit 820Kbit.
grüsse

von Rolf F. (Gast)


Lesenswert?

Und mit welchen Karten erreicht man diese Raten?
Mit einem MSP430 habe ich bei 4 MHz SPI-Takt habe ich nur um 30 kByte/s
(Schreiben etw. langsamer, Lesen schneller) gemessen.

von marcelKo (Gast)


Lesenswert?

Hallo,
das ist eine SanDisk 256MB SD-Card.
ob andere gehen, weis ich nicht, da ich nur diese habe.
grüsse

von Mike (Gast)


Lesenswert?

Habe jetzt mal eine MMC von Reichelt erstanden. Initialisierung scheint
zu funktionieren, jedoch arbeitet der Schreibzugriff (write sector)
nicht, er liefert Null zurück. Die Leseroutine liefert ja kein
Feedback, ob sie erfolgreich war.
CID und CSD lassen sich lesen.

Any ideas?

von arampee junyai (Gast)


Lesenswert?

The Detail your disscuse, it OK. Now I make hobby project for play MP3.
I find & Search some information, After I download example from this
website. My project are successfull

Thakns
J.nut

If you want to visite to Thai, Please let me know, I take care

von Ulrich Radig (Gast)


Angehängte Dateien:

Lesenswert?

Hallo @mike

lade dir mal den neuen Source Code von meiner Webseite herunter!
Die Versionsnummer ist immernoch 2.4 hatte aber noch einen kleinen
fehler.

Mfg Ulrich

von marcelKo (Gast)


Lesenswert?

hi,
hab eine andere MMC probiert. eine nokia 32MB, die bei einem handy
dabei war.
ich bin mehr als erstaunt.
keine probleme beim initialisieren.
noch mehr erstaunt mich die datenrate.
nokia32MB:
lesen mit knapp 1,4Mbit!
schreiben mit knapp 1,3Mbit!

normal sollte doch eine sd card schneller sein ?

die SanDisk 256MB schafft nur etwas über 1Mbit lesen und knapp 800Kbit
schreiben ?

wieso ist die MMC schneller als die SD card ?
sandisk ist doch eigentlich eine gute marke ?

ich hab da noch ein problem mit der sandisk.
und zwar sollte ja im sector 0 bei FAT16 der MBR masterbootrecord drin
sein. bei der sandisk ist im sector 0 aber die VBR volume boot record.
bei der nokia ist es wie es sein sollte, sector 0 der MBR und im sector
64, wie es im MBR steht ist die VBR drin.

wer weis rat ?

ich hatte bei den ersten versuchen mit der sandisk wahllos daten in
wahllose sectoren geschrieben, worauf die digitalcam die card garnicht
mehr erkannt hat. aber windows hat die erkannt und auch formatiert.
erst nachdem ich die karte mit dem AVR " formatiert" hatte, das heist
ich habe von sector 0 bis 10000 alles mit nullen gefüllt, hat die
digitalcam die karte wieder erkannt und konnte die dann formatieren.

kann es sein, das ich bei den test versehentlich ein fuse bit gesetzt
habe, ein protect bit, sodass die card nun irgendwie keinen MBR mehr
hat ?
grüsse

von marcelKo (Gast)


Lesenswert?

so,
nun hab ich die beiden karten in der digicam getestet.
die MMC nokia speichert in der digicam die bilder 2,5mal schneller als
die SD card.
wieso ist die SD card so langsam ?
ich hab die damals gekauft, statt eine MMC, weil die angeblich
schneller sein sollte.
kann es sein, das die card mit der zeit langsamer werden, je öfter die
benutzt wird ?
grüsse

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 Rolf F. (Gast)


Lesenswert?

@marcelKo:
Das kann sein, da sie eine interne Speicherlogik haben, die defetkte
Sektoren durch Reserve-Sektoren ersetzt, so wie bei einer Festplatte.

von pebisoft (Gast)


Lesenswert?

hallo, wer kann mir ein mmc-aufnahmemodul als fertigen anschluss auf
eine platine anfertigen mit spannungsregler dazu, den die mmc-karte
braucht. würde ich auch mit mmc-karte fertig kaufen. über den preis
verhandle ich nicht, bezahle den übermittelten.
mail: pebisoft@arcor.de

mfg pebisoft

von marcelKo (Gast)


Lesenswert?

hallo,
hab jetzt auch eine 512MB billig reichelt MMC getestet.
marke irgendwas mit euro......

die schaft auch 1,4Mbit lesen und 1,1Mbit schreiben.

wieso ist die Sandisk SD card so langsam ?
kann es sein, das die sd karten nur im 4 bit modus wirklich schneller
als die MMC sind ?
grüsse

von Rolf F. (Gast)


Lesenswert?

Die Sandisk-Karten sind traditionell langsam, insbesondere bei der
Latenzzeit. Man findet das z. B. wenn man nach Karten-Bechmarks
googelt.

von marcelKo (Gast)


Lesenswert?

hi,
das ist gut zu hören,
den eigentlich wollte ich schon 10 euro mehr ausgeben für eine
sandisk.
aber jetzt werd ich wohl doch das billige nehmen und hoffen das die
schneller als die sandisk ist.
grüsse

von Katja (Gast)


Lesenswert?

Hab mir einen card reader besorgt der fast alle Karten liest, nur liest
er meine 128mb MMC nicht, hab keine Ahnung also bitte um Verständnis
und eine Erklärung für blöde...:-)
Er zeigt an das das Laufwerk leer ist...??!!??

HELPPPPP

von Wiskas(TM)-Jäger (Gast)


Lesenswert?

> Er zeigt an das das Laufwerk leer ist...??!!??

Dann liest er die Karte doch. Kannst du sie formatieren?

von Matze (Gast)


Lesenswert?

Help ..

wer kann mir das mit dem CMD18 und CMD23 erklären ?
möchte gerne 200 Blocks am stück auslesen, ohne pausen.

bei CMD17 muss ich immer auf 0xFE,anfang jeder Datenuebertragung
(Block) warten ...Command(0x51,H,L,0xFF)

von Thomas (Gast)


Lesenswert?

Hallo,

ich versuch gerade einen Datenlogger zu entwickeln.
Mein uC ist allerdings ein ATMega8L.
Der WinAVR Compiler mault jetzt dass er bestimmte Konstanten nicht
kennt.
Geht das mit dem ATMega8 überhaupt ? (zuwenig RAM, etc)
Hat sich schon jemadn die Arbeit gemacht den code für ATMega
umzuschreiben ?

Danke .. Thomas

von Stefan Seegel (Gast)


Lesenswert?

@Thomas:

Sollte kein Problem sein, der Mega8 hat genausoviel Ram wie der
Mega16.

@Matze:
MMC Karten arbeiten immer blockorientiert. Du kannst maximal 512 Bytes
lesen und musst dann ein neues Lesekommando senden.

Ich habe in dem Thread

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

übrigens den Code von Uli noch etwas erweitert und modifiziert dass man
auch mit weniger RAM auskommt. Nochmal herzlichen Dank an Uli für das
Vorbild!

Stefan

von Thomas (Gast)


Lesenswert?

@Stefan: Danke

von Thomas (Gast)


Lesenswert?

Hallo,

gestern hab ich die MMC (Sandisk 32MB) an den AtMega8L DIL
"angelötet".
Ich hab dabei die sachaltung von Ullrich Radig genommen.
Die mmc lib ist von Stefan Seegel.

Nach dem ISP Programmieren, wird die MMC erstmal nicht erkannt.
Ein paar Mal reset gedrückt und dann wird die MMC erkannt.
Das wars dann aber leider auch schon.

Weder ein sector_read noch _write klappen.
Die Funktion kommt nicht mehr zurück.
Aus das Lesen CID und CSD Registers der MMC klappt nicht.

Die CS ist am rechten unteren Pin das AT8L (hab leider die Doku grad
nicht da).

Hat jemand einen Tip für mich ?
Wie kann man das Problem am besten analysieren ?

Was mir noch aufgefallen ist:
ISP Programmierung geht nicht mehr.
Die MMC hängt ja auf MIOS, MOSI, etc wie der ISP.
Die MMC scheint das zu stören.
Ohne MMC klappt es ganz prima.

Die Hauptschleife pollt den USART (simples terminal).
Der Timer0 lässt eine LED 1 mal pro Sek blinken.

Danke .. Thomas

von Elektrikser (Gast)


Lesenswert?

Ersetze die zwei Dioden in der Spannungsversorgung durch einen 3,3V
Spannungsregler. Bei mir funktionierte es nicht mit allen SD-Karten,
weil die Versorgungspannung um die 3,6-3,8V lag. Nachdem ich die
Spannung heruntersetzte klappte es einwandfrei...

Gruß Elektrikser

von Stefan Seegel (Gast)


Lesenswert?

@Thomas:

Also wenn man Hilfe erwartet sollte man sich vielleicht doch die Mühe
machen und rausfinden welcher Pin "rechts unten" ist...
Bei welchem Gehäuse ? DIP, TQFP, MLF ? Von wo aus rechts unten ?!

Naja, ich unterstelle einfach mal DIP Gehäuse und dass rechts unten PB1
ist (obgleich auch die Warscheinlichkeit nicht so hoch ist). Jedenfalls
schließt die Beschreibung aus dass du für CS der MMC den SS Pin des
AVRs benutzt. Das muss zwar auch nicht sein, aber zumindest  muss dann
dieser Pin richtig konfiguriert werden, da er fest zum SPI Interface
gehört. Weiteres im Datenblatt des Mega8 Seite 126.

Gruß
Stefan

von Rolf (Gast)


Lesenswert?

@Elektrikser:
Laut SD-Standard ist der zulässige Spannungsbereich 2,7-3,6 V, sofern
es sich nicht um low-voltage-Versionen handelt. Ausserhalb schalten die
Karten ab.
Zur Spannungsmessung kann man auch die SD-Karte verwenden, denn die
speichert die aktuelle Spannung in einem Karten-Register, das man
auslesen kann.

von Thomas (Gast)


Lesenswert?

@Elektrikser: Das ist mir beim ersten Nachmessen auch aufgefallen. Da
liegen bei mir mindestens 3.8V an. Ich dachte, das passt schon (wenn's
so bei Ullrich Radig funktioniert hat, ich selber bin da ziemlich
unbeleckt). Werd ich ändern.

@Stefan: mea culpa, ich entschuldige mich, hast du recht.
Ich hatte schon geschrieben welches Gehäuse "AtMega8L DIL",
bloss war ich auch noch zu blöd und hab DIL statt DIP geschrieben.
Nochmals sorry.
Das mit dem CS Pin hab ich selbst schon gefunden, leider erst nachdem
ich die obige Nachricht geschrieben hatte. Hab ich
gestern auch umgelötet. Einmal hat ein sector_read geklappt (vermutlich
ein Unfall). Allerdings hab ich CS immer noch nicht korrekt konfiguriert
und ich denke das muss wohl auf jeden Fall
sein. Werde ich am Wochenende machen.

Danke an alle für die schnelle Hilfe .. Thomas

von Elektrikser (Gast)


Lesenswert?

@Rolf

Stimmt! Habe ich aber erst gelesen, nachdem die Schaltung bei mir nicht
funktionierte. Vielleicht sollte Ullrich die Dioden aus seiner Schaltung
gleich rauswerfen und einen LD33 einzeichnen. Wenn ich es richtig
mitbekommen habe, sind schon mehrere darauf hereingefallen.

Schade, dass ich momentan wenig Zeit habe. Ich wollte eigentlich noch
die Sources von Holger Klabunde testen, aber das wird dauern...

Gruß Elektrikser

von Thomas (Gast)


Lesenswert?

Mit den beiden Dioden liegen bei mir 4.09 Volt an der Versorgung der MMC
an. Muss ich wohl doch den Spannungsregler besorgen, ...

von Mark (Gast)


Lesenswert?

Hallo,

wäre es auch möglich, mit einem AVR eine Festplatte anzusteuern, das
directory und die Daten dann jeweils umgekehrt an einen "SD-Adapter"
auszugeben? Hintergrund: der Audi A3 hat 2 SD Kartenschächte, wo ich
gern Mucke zuführen würde, oder gibt es dazu schon andere Vorschläge?

Mark

von Rolf (Gast)


Lesenswert?

Übrigens funktionieren die meisten SD-Karten nicht mit 3,0 V; man
braucht 3,3 V; im Gegensatz zu dem was der Standard angibt.

von Shadow (Gast)


Lesenswert?

Hallo zusammen,
ICh weis nich ob meine frage hier rein gehört weil ich ehrlich gesagt
keine ahnung davon habe benötige baer hilfe bei folgendem:
Ich habe mir heute bei einem an und verkauf geschäft eine 128MB MMC
card von Sandisk gekauft, diese wird jedoch in meinem handy nicht
erkannt(hängt sich auf wenn ich die karte anwählen möchte) und im
cardreader am PC kam zunächst die karte sein unformatiert, jedoch
wollte mein pc sie auch nicht formatieren und nun nach einigen
fehlgeschlagenen format versuchen kann ich die karte garnicht mehr
anwählen (so wie bei einem disketten laufwerk wo keine diskette drin
ist)!

Wäre für jede hilfe dankbar!!!!

von Rolf F. (Gast)


Lesenswert?

Die Karte ist defekt.
Auf Garantie umtauschen und gleich im Laden testen.

von Sebastian (Gast)


Lesenswert?

Hallo,

ich versuche schon seit mehreren Tagen eine SD Card mit nem ATmega128
anzusteuern und krieg es nicht zum Laufen. Die Schaltung ist im
Wesentlichen die von Ulrich mit den Wiederständen (allerdings 1k und
2k) und nem Spannungsregler für die 3,3 V. Ich hab die lib von Ulrich
ausprobiert. Die Initilaisierung macht er prima nur wenn ich dann Daten
auselesen möchte, bringt er nur Mist.
Alle Pegel scheinen vernünftig zu sein, ich habs mir stundenlang mit
dem Oszi angesehen. Die Karte antwortet auch eigentlich so wie sie
soll. Nur wenn ich nach der Initialisierung einen Block oder ein
Register auslesen will, antwortet er nicht mit einem 0xFE sondern mit
einem 0xFC und ein paar Daten dahinter. Die Menge der Daten bevor dann
wieder 0xFF kommt, stimmt auch ungefähr (128 Bit beim CSD Register oder
32 beim OCR). Nur ist der Inhalt eben totaler Blödsinn.
Er schickt auch tatsächlich ein 0xFC, das sieht alles aus wie aus dem
Bilderbuch auf dem Oszi.
Hab es auch mit langsamem Takt probiert und tausend anderen Sachen. Die
Karte verhält sich so wie sie soll schickt aber blödsinnige Daten.

Hat jemand eine Idee, was die Karte da mit mir macht?

von Toppy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Falls es noch jemand braucht.
Hab mal aus allen möglichen Quellen eine Zusammenfassung für FAT32
gemacht. Hoffe es hilft weiter.

Aber jetzt hätte ich auch noch eine Frage...
Sitze an einem größeren Projekt - controllerseitig bin ich fertig -
habe die Daten auf einer CompactFlash-Karte. Als FAT32-Datei.
Jedoch muss ich teilweise was in den MBR (1. Sector) schreiben.
das ich dann am PC auslesen sollte. Hat jemand Ahnung, wie ich am PC
auf die einzelnen Sektoren einer CompactFlash-Karte zugreifen kann?
Am liebsten in C++ :-)

Danke im Voraus,

Toppy

von e=mmc² (Gast)


Lesenswert?

Tag zusammen.
Ich hab da mal eine generelle Frage:
Wie schnell kann man maximal auf eine MMC Karte im SPI
Modus schhreiben ?

Ich muss 600KByte am Stück schreiben, einfach ohne Filesystem ab Sektor
0 oder so.

Das ganze wird auf einem schnelleren DSP laufen also wird nur die Karte
der begrenzende Faktor sein.

Momentan schreibe ich 300kByte/s wenn ich mehr machen will scheitert
der Datentransfer beim Sektor Write init irgendwie...
Muss ich nochmal genau gucken was ich da falsch mache.
Mein Code basiert auf dem MMC code von U. Radig, vielen Dank dafür !
Er hat mir sehr geholfen ;)

Aber bevor ich suche wüste ich halt gerne ob sich das lohnt und wieviel
ich maximal rausholen kann.
sind 2 MByte/s drin ? Oder gar mehr ?

von Uli (Gast)


Lesenswert?

Hallo @Toppy ,

Der direkte Zugriff auf einzelne Sektoren mit oder ohne Fat ist am
besten unter Linux mit dem Befehl dd möglich.

Gruss
Ulrich Radig

von Meister (Gast)


Lesenswert?

@ sebastian.
hast du einen 10µF direkt an der versorgungsspannung von der SD card ?
wenn nicht dann mach den mal dran.
so nahe wie möglich an der SD.
grü0ße

von Toppy (Gast)


Lesenswert?

@Ulrich Radig:
Vielen Dank für die Info schon mal. dann kann ich mich da schon mal ein
bisschen damit beschäftigen....

Aber das Problem ist ich wollte das in ein Prog mit reinnehmen, das mir
die Daten auswertet.
Geht das unter Windows überhaupt, oder macht da das Mircosoft OS
komplett dicht?

Danke,

Toppy

von thomas (Gast)


Lesenswert?

Hallo,
ich bin inzwischen am Verzweifeln. Es klappt einfach nicht.
Ich versuche immer noch einen Datenlogger zu bauen.
Der Baustein ist ein ATMega8L im DIL Gehäuse.
Ich hab 3 verschiedene MMC Karten probiert, SanDisk 32MB, NoName 128MB
und Toshiba miniSD 128MB. Nicht mal der Init geht, ich bekomme immer
Returcode 2 (Timeout).
Ich verwende die Lib von Ulli Radig (Version 2.4).
Die Pins sind folgendermassen definiert (für HW SPI):
#define SPI_Clock      5
#define SPI_DI        4
#define SPI_DO        3
#define SPI_SS        2
#define MMC_Chip_Select                  1
Heut hab ich noch mal die Verdrahtung geprüft (normaerweise eins meiner
üblichen Probleme) und die Pegel stimmen (3.2-3.3V).
Die Dioden hab ich mit einem Spannungswandler ersetzt.
SS ist als Output initialisiert.
Ich verwende keinen externen Quarz, sondern den internen Taktegber
(4MHZ).
Die Karte steckt in einem ISA Slot mit fliegender Verdrahtung.
Zum Testen ist der ATMega immer vom ISP getrennt.
Timer 0, ein AD Pin und UART ist belegt von eigenem Code, sonst ist da
nicht viel.

Irgendwie hab ich den Eindruck, dass was mit CLK nicht stimmt.
Wenn SPI eingeschaltet ist, kann ich nicht mehr den Pin PB5 low und
high setzen (in einer Testroutine mit sbi(PORTB, 5)).

Hat jemand noch einen Tip für mich ?

Oder gibt es irgendwo ein fertiges Modul für kleinen Preis, kleinenA
bmessungen und programmierbar ?

Danke .. Thomas

von castle (Gast)


Lesenswert?

hallo...
wieviel platz nimmt eure mmc-steuerung auf dem avr ein
(speichergrösse).

Castle

von thomas (Gast)


Lesenswert?

Hallo,

heut nacht hab ich noch was gefunden. Im mmc_init hat das Setzen der
Pins (In-/Ouput) nicht richtig geklappt (keine Ahnung wieso).
Inzwischen geht der init fast immer.

Sind da irgendwelche Macken des Compilers (Win-AVR, avr-gcc 3.4.1)
oder der anderen Tools bekannt ?

Beim Auslesen der CSD und CID Register kommt allerdings fast immer
irgend was anderes raus (bei 2 Abfragen), also fast Zufallswerte.

Einen Sektor Schreiben bzw. Lesen geht gar nicht, da kommen nur Fehler
bzw. Abbrüche.

Scheinbar funktionieren ein paar Sachen, aber es ist nicht stabil.
Hat jemand eine Ahnung woran das liegen könnte ?
Einen Kondensator zwischen GND und Vss hab ich nicht.

Der Code liegt bei 2904 bytes, Variablen hab ich schon abgespeckt.
Das müsste in die 1024 bytes locker reingehen.

Danke .. Thomas

von Geri (Gast)


Lesenswert?

Hallo zusammen

Zuerst mal: Ich finde es toll, welche Infos Ulrich Radig hier zur
Verfügung stellt!
So wie ich es verstanden habe, funktioniert die Kommunikation zwischen
MMC-card und Controller über SPI. Mich würde mal interessieren, welchen
Datentransfer man beim Schreiben und beim Lesen mit so einer Kombination
ungefähr erreichen kann (unter der Annahme, dass SPI vom Controller per
uP-Hardware realisert ist) und der Controller beim Lesen ausgelastet
ist.
Hat jemand von Euch hier Erfahrungen gesammelt?

Freundliche Grüsse und vielen Dank im Voraus
Geri

von Elektrikser (Gast)


Lesenswert?

Hallo Geri,

Holger Klabunde hat mit einer eigenen Variante der MMC- und
CF-Ansteuerung experimentiert. Er hat auch eine FAT 12/16 implementiert
und die Zeiten beim Lesen und Schreiben ausgewertet.
Schau es dir einfach mal an:
http://www.holger-klabunde.de/


Gruß Elektrikser

von Geri (Gast)


Lesenswert?

Hallo Elektrikser

Super, vielen Dank. Das is genau das was ich gesucht habe.

Beste Grüsse
Geri

von thomas (Gast)


Lesenswert?

Hallo,

inzwischen geht das Lesen des CID und CSD Registers konstant.
Allerdings nur bei der Toshiba MiniSD 128 MB, die Noname (takeMS 128 MB
steht drauf) und die SanDISK 32MB gehen nicht.
Auch egal, Hauptsache eine geht.

Lesen & Schreiben eines Sektors geht noch nicht, mal weiter sehen.

Thomas

von thomas (Gast)


Lesenswert?

Ein Tip an alle die das auch probieren wollen:

 Kauft erst mal eine Satz verschiedener Testkarten !

Meine Erfahrungen:

 + Sandisk32 hat gar nicht funktioniert.
 + Noname 128 MB (takeMS von Reichelt) geht auch gar nicht
 + Toshiba miniSD 128 MB (Reichelt), init, CID/CDS lesen geht,
   beliebigen Sektor lesen/Schreiben geht nicht
 + SanDisk 128MB miniSD (Reichelt, alles geht, juchu)

Ich hab die gleichen Ergebnisse mit der MMC Lib von Ulli Radig und
Stefan Seegel.

Thomas

von Ssss S. (sssssss)


Lesenswert?

Hi!

Also bei mir gingen bis jetzt alle Karten.
(uralte 32MB, Sandisk 256 SD, extreME 256 MMC)
Naja zumindest bis ich die eine gekillt habe 8)

Gruss,
Simon

von Uli (Gast)


Lesenswert?

Hallo,

Auf meiner HP habe ich nun auch einen neueren Source Code für den
MMC/SD Karten zugriff für den AVR und ARM. Sogar das Schreiben in eine
vorhandene Datei unter FAT ist nun möglich.

Gruss
Ulrich

von Spider84 (Gast)


Lesenswert?

I tried this code with SanDisk SD 16M - not work :(
on CMD0 card response - 0x05 (illegal command + idle)
Can any body help me?

von Manni (Gast)


Lesenswert?

Dank an Uli,

habe eine "Take-MS" 256 Mbyte Karte verwendet und seine EINFACHE H/W
Schaltung genommen sowie sein Timing Diagramm von seiner Homepage
verwendet, und den entsprechenden Code in Assembler geschrieben - SPI
mit einfachen Port Befehlen, also ohne internem SPI (habe natürlich
auch den C-Code von Uli analysiert) und siehe da, die SD Karte
funktioniert ohne Mukken.

Den Source Code werde ich noch hier im Forum ablegen.

Nochmals Dank an Uli

Gruss Manni

von Michael Stahl (Gast)


Lesenswert?

Hallo,
hab auch angefangen mit einer SD-Card rumzuprobieren. Der Source von
Ulrich Radig hat mich schon ein ganzes Stück nach vorne gebracht. Auch
die Beiträge waren alle sehr hilfreich.
Ich habe aber dennoch ein Problem:
Nach der Initialisierung möchte ich ab Adresse 0 der Karte 512 Byte
auslesen. Es kommt immer 0xFE und dann ein ganzer Sack von Nullen.
Wenn ich die SD-Card mit WinHex auslese steht ab Adresse 0 etwas ganz
anderes.
Die Karte ist mit WinXP auf FAT16 formatiert worden.
Kann mir einer helfen? ist 0xFE normal?

von Lupin (Gast)


Lesenswert?

mach mal nen ganzen dump der karte. also übertrag mal die ersten paar MB
auf deinen PC.

Dann schau mal nach ob du irgendwann was findest was dem aus winhex
entspricht.

Deine Karte ist vielleicht mit einem Master Boot Record formatiert,
d.h. WinHEX zeigt dir nur den Teil an der tatsächlich zum FAT16
Dateisystem gehört aber nicht den MBR der Karte.

Google.de hat alle infos die du dazu wissen musst :)

von Michael Stahl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Lupin,
vielen Dank für die schnelle Antwort. Ich hab mal die ersten 2KByte der
Karte ausgelesen in 512Byte Blöcken.
Auffällig war, das jeder Block mit 0xFE begonnen hat.
Im HexDump.jpg kann man einen ausgelesenen Bereich sehen. Komisch ist,
das wenn die Daten kommen immer doppelt sind.
Konnte auch keinen übereinstimmung mit WinHex finden.
Die FAT16 besagt doch, das der MBR ab Adr 0 beginnt, 512Byte lang ist
und mit 0x55AA abschließt, oder?
Gibt es ein Programm für XP, mit dem ich die SD-Card 1 zu 1 auslesen
kann?

von Michael Stahl (Gast)


Lesenswert?

Ich bins nochmal.
Der HEX-Dump ist falsch. Bei dem Treiber von Ulrich Radig muss man beim
Auslesen eines Sectors die Sectornummer angeben. Wird dann intern auf
die Adresse umgerechnet.
Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen
geschickt.
Sieht so aus als wäre die Karte nicht bereit oder so? Ich arbeite an
der SPI mit 100kHz. Kann doch nicht zu schnell sein, oder?

von Michael Stahl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hab eine interessante Entdeckung gemacht. Ich habe ab Adresse 0xC00 512
Byte geschrieben.
Die Bytes standen in einem char Array. Das Array hab ich gefüllt mit
0x01,0x02,0x03... usw bis 0xFF und dann nochmal 0x01,0x02,0x03... usw
bis 0xFF.

Anschließend habe ich die Karte mit dem Controller ausgelesen. Im
Buffer stand 0x02,0x02,0x06,0x06,0x0a,0x0a,0x0e,0x0e,0x12,0x12 usw.

Dann habe ich die Karte mit WinHex ausgelesen und ab Adresse 0xC00
standen die Daten, welche im angehängten Bild zu sehen sind.

Wie ist das möglich?

von Lupin (Gast)


Lesenswert?

>Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen
>geschickt.

Ist normal, das sind die "reserved sectors" der Karte, im ersten
sektor stehen die Partitionsinformationen, da steht irgendwo ein
Eintrag mit der Adresse von der aus die tatsächliche FAT16 Partition
beginnt.

Was das mit dem schreiben auf sich hat kann ich auch nicht genau
sagen...

von Manni (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

für alle die "nur" in Assembler programmieren, hier der Source Code
für die Ansteuerung einer SD/MMC Card mit einem ATmega32. Ich habe die
"EINFACHE" H/W Schaltung von Ulrich Radig verwendet (siehe Zip file).
Die S/W ist für eine Karte von 128 Mbyte ausgelegt, kann jedoch durch
die Definition der maximal beschreibbaren Blocks a 512 Byte
entsprechend geändert werden.

Zum Testen der SD/MMC Karte habe ich ein Testprogramm beigelegt. Es
schreibt quasi zufällige Daten in die Blocks der Karte und verifiziert
danach beim Lesen die Inhalte. Bei dieser Kartengröße dauert dieser
Vorgang ca. 1.5 Stunden.

Um überhaupt "SEHEN" zu können, dass sich was im uC tut, verwendet
das Testprogramm an Port C 8 LEDs. Beim Schreiben der 245504 Blocks
leuchtet die LED von Port C0. Beim Lesen der 245504 Blocks leuchten die
LEDs von Port C0 und C1. Wenn alles korrekt gechrieben und gelesen
wurde, blinken alle 8 LEDs mit ca. 1 sec auf.

Ich gehe mal davon aus, dass alles einigermaßen selbst erklärend ist,
da ich die Dokumentation im Quellcode recht ausführlich gestaltet habe
--> Ist so ne Macke von mir.

Viel Spaß beim Ausprobieren. Kommentare sind immer Willkommen.

Gruß Manni

von Michael Stahl (Gast)


Lesenswert?

So, ich kann jetzt Daten auslesen. Es war ein Hardwareproblem. Und zwar
hab ich zum Auslesen eines Blocks einen Continius-Read benutzt.
Zwischen den einzelnen Bytes war also keine Pause. 512x8 Clocks am
Stück. Das hat der Karte nicht gefallen.
Jetzt hab ich nach jedem Byte eine kurze Pause eingefügt und siehe da,
es funktioniert.

Der modifizierte Code von Ulrich Radig läuft.
Das Direktory wird ausgelesen und die Datei MMC.TXT wird auch gefunden.
Nur mit dem Auslesen der Datei hab ich noch Schwierigkeiten. Irgendwie
funktioniert die Blockberechnung noch nicht so ganz.
Hat jemand zu dieser Blockberechnung vielleicht noch ein paar
Unterlagen oder einen nützlichen Link?

Gruß
Michael

von Hermann Mösker (Gast)


Lesenswert?

Hallo zusammen!

möchte eine SD-card im 4-bit-Mode mit einem avr ansteuern!
Hat jemand von Euch Erfahrung damit?

Wie bekommt man die Karte in den 4-Bit-Mode?
Welche Dokumentation gibt es?

Freundliche Grüsse und vielen Dank für eine Antwort

Hermann

von Stefan Seegel (Gast)


Lesenswert?

Was ist ein 4-bit Mode bei SD-Karten ?
Wo hast du das gelesen ?

Stefan

von Nik Bamert (Gast)


Lesenswert?

@Stefan so viel ich weiss ist das der Sd modus der mit vier bit läuft +
zusätzlich noch clk und steursignal, ist glaube ich auch in der hitachi
doku auf ulrich's Seite drinn, kann mich aber nicht mehr genau daran
interessieren.

@Michael
Falls du an einem fat32 System schreibst, kann ich dir
http://www.pjrc.com/tech/8051/ide/fat32.html empfehlen, ist superleicht
erklärt finde ich, allerdings auf englisch :-)

Nik

von Nik Bamert (Gast)


Lesenswert?

Hab nachgesehen und siehe da, es war das hitachi dokument :-)
Ich weiss allerdings nicht ob 4bit mmc = 4bit bei sd ist, aber ich
nehme es mal an.

http://www.ulrichradig.de/site/atmel/avr_mmcsd/pdf/hitachi_hb28b128mm2.pdf
Ab seite 22..

Nik

von Nik Bamert (Gast)


Lesenswert?

Ach Mist, hab mich verlesen, 4bit ist der noch nicht bei der MMC, bei
der SD siehts dann so aus das es einfach ein DAT0-DAT4 gibt, die CMD
und CLK leitungen bleiben bestehen. Irgendwo hab ich das Pdf aber
noch,
wo das drinn steht, werds verlinken falls ich es auftreiben kann

von Nik Bamert (Gast)


Lesenswert?

http://www.arktake.co.jp/pdf/minisd.pdf

Hab's doch noch gefunden, sehr ausführlich ist es leider nicht und
zudem noch für miniSd, aber das Prinzip ist bei Sd's so weit ich weiss
dasselbe

von Hermann Mösker (Gast)


Lesenswert?

Hallo Nik,

Danke für Deine schnelle Antwort!
Hat mir zunächst mal weitergeholfen.

Leider steht in der minisd.pdf nicht drin, wie in den sd-mode
umgeschalltet wird.
Dazu ist wahrscheinlich ein spezielles Kommando erforderlich.

werde mal weitersuchen...

Gruß
Hermann

von Hermann (Gast)


Lesenswert?

Hallo zusammen,

hab bei der Ansteuerung meiner MMC-Karte noch ein kleines Problem.
Benutze das EVA-Board von Glyn, M16C62P, SRC 2.5 von U.Radig (Danke!)
bzw. von Glyn.
Zum Testen liegt der Clock bei 200kHz.

Die Initialisierung funzt einwandfrei,
CSD/CID Lesen klappt ebenfalls problemlos.
Beim Lesen von Sectoren gibt es aber Schwierigkeiten:
Das erstmalige Lesen eines beliebigen Sectors klappt ohne Probleme,
Allerdings schlägt jeder Versuch einen weiteren Sector zu lesen fehl.
Bekomme immer die R1 Response 0x01=Error.

Konnte leider mangels Alternative nur die mitgelieferte X4Store Karte
testen.

Hat jemand dazu eine Idee? Vielleicht seh ich ja den Wald vor lauter
Sectoren nicht mehr...

Danke
Hermann

von Hermann (Gast)


Lesenswert?

Konnte Problem nun doch noch lösen ...
Lag an der Adressierung der Sectoren.
Hatte bei meiner ReadSector den Blocksizefaktor vergessen.

Hermann

von Wolfram Ebel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich hab ein Problem beim Ansteuern einer SD-Karte. Ich verwende einen
ATMega162 auf einem STK500 mit einer internen Clock von 3,686 MHz.
Bei der Initialisierung (Senden von CMD0) scheint die Karte überhaupt
keine Antwort zu geben. Wenn irgendwo ein Timeout auftritt leuchtet
LED7 kurz auf. Bei erfolgreicher Initialisierung soll LED0
aufleuchten.
Bei Tests mit drei verschiedenen SD-Karten kam das selbe negative
Egebnis zu Stande.
Der Quellcode ("reines Assembler") ist im Anhang.

Wenn irgendjemand eine Idee oder Fragen hat, würd ich mich freuen.
Danke für Eure Hilfe.

Wolfram

von Oliver Erb (Gast)


Lesenswert?

Hallo Ulli,

ich verwende deinen Code (mmc u. fat) um eine MP3 Player zu
realisieren. Es klappt auch alle ganz gut, BIS JETZT. Wenn ich eine
Datei mit der Funktion fat_read_file (fstcluster,Buffer,b) lese klappt
das auch, solange ich nur einen Block lese. Ich kann jeden beliebigen
Block der Datei lesen (sieht zumindest so aus). Wenn ich jedoch die
ganze Datei Blockweise lesen lasse und über den Com Port an den PC
übertrage, bricht die Übertragung immer irgendwann ab (mal früher oder
später).

Hier der Code:

unsigned long b = 0;
int a;

for (b = (filesize/512)-1; b < (filesize/512); b++)
{
  fat_read_file (fstcluster,Buffer,b);
  for (a = 0; a <= 512; a++)
  {
    WriteC_Seriell(Buffer[a],0);
  }
  LF; // Linefeet und CR.
}

Woran liegt es das der ATmega128 stehen bleibt wenn man die ganze Datei
Blockweise nacheinander lesen will. Die Irq's sind alle I.O. und habe
auch ihren Handel. Der Watchdog ist ausgeschaltet und der ATmega läuft
mit 11.0592 Mhz.

Gruß Oliver

von Volkmar D. (volkmar)


Lesenswert?

Hallo Oliver,

zumindest solltest Du in der Schleife "a" die Abbruchbedingung
ändern:
  for (a = 0; a < 512; a++)
Sonst läuft die Schleife 513-Mal durch und nicht 512-Mal.

Deine Schleife "b" wird doch nur 1-Mal durchlaufen, oder? Der
Startwert ist gerade 1 niedriger als die Abruchbedingung.

Was passiert wenn Du die MMC/FAT-Routinen auskommentierst und nur
Dummy-Daten an den PC schickst? Wenn es dann auch abbricht, liegt es
nicht an den MMC/FAT-Routinen.

Volkmar

von Oliver Erb (Gast)


Lesenswert?

Hallo Volkmar

jo, hast Recht. Die Schleife a muss ich ändern.
Die Schleife b ist so dargestellt das ich den letzten Block der Datei
lese (ID3 tag steht da drin).
Um die ganze Datei zu lesen mache ich die Schleife so:

for (b = 0; b < (filesize/512); b++)
{...
}
Das auskommentieren der MMC/FAT-Routinen werde ich nachher mal
ausprobieren.

Gruß Oliver

von Stahl Michael (Gast)


Lesenswert?

Ich habe Probleme mit dem Auslesen der Karte. Manchmal werden Bytes
doppelt gelesen. Ich habe festgestellt, wenn man eine Pause nach
mmc_read_byte einfügt, kann man dieses Verhalten ändern. Sauber läuft
es jedoch nicht.
Ich steuer die Kart mit einem Infineon 16-Bit Prozessor an und nutze
das SPI-Interface des Prozessors. Hat irgend jemand in dieser Richtung
schon Erfahrung gesammelt?

Gruß
Michael

von Stahl MIchael (Gast)


Lesenswert?

So, ich habs. Es ist wichtig, das der Idle-Zustand des Clock-Signals
HIGH ist, und das bei steigender Flanke die Daten übernommen werden.

Hab die SPI zu Fuß programmiert.

von Martin (Gast)


Lesenswert?

Ich bin grad dabei eine Multimedia Card im SPI modus anzusteuern und
ich habe bisher nur eine von ca 5 zum laufen gebracht.

kann es sein, dass es MMC Cards oder SD cards ohne SPI modus gibt oder
wird der Fehler eher an meinem Programm bzw an meiner Verschaltung
liegen?

von Rolf (Gast)


Lesenswert?

Der SPI-Modus ist laut MMC-Spezifikation immer vorhanden, so wie auch
bei den SD-Cards. Es macht auch keinen Sinn den wegzulassen, da viele
(langsame) Kartenleser den verwenden und der Hardware-Aufwand dafür
auch auf Karten-Seite minimal ist.

von Benedikt (Gast)


Lesenswert?

Schöne Software, nur leider gibt es noch einige Fehler, wie z.B. hier:

FAT_Byte_Addresse = (Cluster*2) % BlockSize;

//Berechnung des Blocks der gelesen werden muß
FAT_Block_Addresse = ((Cluster*2) / BlockSize) +

Hier wird Cluster*2 nur als int gerechnet, es lassen sich also nur die
erste Hälfte der Sektoren ansprechen. Mit Cluster*2UL funktioniert es
aber.

Weiterhin scheint die Software nicht mit allen Karten zu
funktionieren.
Ich habe einige kleine Karten die nicht erkannt werden.

von Martin (Gast)


Lesenswert?

ich habe nun ein wenig den code von ulrich radig verwendet und da ist
mir aufgefallen, dass er bei der SPI initialisierung den CPOL (SCK high
on idle) nicht setzt. aus dem datenblatt kann man entnehmen, dass das
taktsignal für die MMC karten standardmäßig immer high sein soll.

was ist nun richtig?

von Dennis Kleine-Beck (Gast)


Lesenswert?

Hallo,

wär' chronologisch günstiger gewesen, in dem zweiten Thread
(http://www.mikrocontroller.net/forum/read-4-125350.html#new)weiterzuschreiben,
aber mittlerweile ist es sowieso schon hoffnungslos durcheinander.
Benedikts Anmerkung habe ich auch gleich mal einfließen lassen! Wie
genau äußerte sich der Fehler?

> es lassen sich also nur die erste Hälfte der Sektoren ansprechen

Pro Datei oder generell die Hälfte der Sektoren auf der Speicherkarte?

Welche Karten werden nicht erkannt? Ich habe bisher keine gefunden, die
sich nicht ansprechen lässt (MMC und SD). Allerdings läuft mein M16 nur
mit 4MHz. Als ich in der mmc_init() mal den SPI Clock-Teiler von 128
auf 64 geändert hatte, gab es schon Probleme! D.h. analog mit >= 8Mhz
extern nd 128er SPI-Teiler.

Mir ist auch aufgefallen, dass die Stromaufnahme nach der init hoch
bleibt (ca. 30mA) und erst z.B. nach einem mmc_write auf einen
Bruchteil abfällt ( < 5mA).

In mmc_write_sector() habe ich

//Wartet einen Moment und sendet x Clocks an die MMC/SD-Karte
  //for (a=0;a<100;a++)
  // mmc_read_byte();

auskommentiert. Ich denke, das braucht man nur, wenn man multiple
Blocks schreiben will (s. HITACHI Spec auf Ulrichs website). In Ulrichs
Code wird aber nur single Block geschrieben. So (und mit ein paar
inlines) konnte ich die Schreibgeschwindigkeit nahezu verdoppeln. D.h.
SDS von 55kB/s auf 95kB/s!

Gruß,
Dennis

von Benedikt (Gast)


Lesenswert?

Sobald man über Cluster 32767 hinaus geht, kommt es zu einem Überlauf
und es werden die Cluster 0-32767 nochmal gelesen.
Die obere Hälfte de Karte lies sich also bisher nicht ansprechen.

von Dennis Kleine-Beck (Gast)


Lesenswert?

Mal 'ne blöde Frage:

> Hier wird Cluster*2 nur als int gerechnet

Warum eigentlich "int". Sollte es nicht "unsigned int" ergeben?
Wären dann immerhin 0xFFFF cluster. Also bei z.B. Clustersize 2kB
immerthin 128MB.
Oder wird durch die "2" autom. alles auf "int" gecasted?


Nett wär auch noch die kurze Beantwortung der Frage, welche Karten man
meiden sollte (bzw. gerade die probieren MUSS ;-))

Gruß,
Dennis

von Benedikt (Gast)


Lesenswert?

Stimmt, es ist unsigned int, aber das Problem liegt einfach darint, dass
der Compiler eben 2xunsigned int=unsigned int rechnet und daher der
Überlauf auftritt.

Die Karte war eine 8MB Panasonic Karte, die ich aber eben auch zum
Laufen bekommen habe indem ich beide Timeout Werte bei der mmc_init
Funktion auf 250 erhöht habe. Anscheinend war die Karte nur etwas
langsamer. Mal schauen ob auch alle anderen Karten jetzt funktionieren.

von Dennis Kleine-Beck (Gast)


Lesenswert?

Also, ich habe mir die entsprechenden Werte bei der mmc_init mal auf nem
Display für verschiedene SD / MMC anzeigen lassen. Daraufhin habe ich
das timeout für CMD0 auf 25d reduziert (unkritisch) und das für CMD1
auf 250d erhöht. CMD1 ist offenbar bei manchen SD-Cards kritischer.

Erster timeout = 25d hat den Vorteil, dass die Initialisierung schnell
abbricht, wenn keine Karte eingelegt ist.

Danke für die Info! Werde mal nach Panasonic Karten Ausschau halten...

Dennis

von Benedikt (Gast)


Lesenswert?

Stimmt, den ersten Wert kann ich sogar bei der Panasonic Karte auf <100
erniedrigen, der zweite muss aber unbedingt bei >200 liegen.

von AVRNIX (Gast)


Lesenswert?

abo

von Matthias H. (matthias_hartmann)


Lesenswert?

[x] subscribe ...

von thomas (Gast)


Lesenswert?

Hallo,

ich baue immer noch an meinen Datenlogger (mit ATM8 geht's nicht, mit
ATM32 geht's scheinbar auf Anhieb). Jetzt bin ich am folgenden Punkt:
Die MMC braucht relativ viel Strom, meine Datenrate ist aber sehr
niedrig (einen Sektor all 5 Sekunden). Ich würde die Karte deshalb
gerne nur alle 5 Sekunden kurz einschalten, den Sektor schreiben und
die Karte dann wieder ausschalten. Der ATmegaekann die bis zu 40 mA
aber nicht direkt treiben, also muss ich wohl eine Transistor
dazwischenschalten.
Hat da jemand eine Schaltung parat bzw. welchen Transistor genau kann
ich dafür nehmen ?

Danke .. Thomas

von Werner B. (Gast)


Lesenswert?

Alle mir bekannten MMC/SD Karten schalten sowiso in den "sleep modus"
wenn sich längere Zeit (im ms Bereich - genaues muss man im jeweiligen
Datenblatt nachsehen) nicht angesprochen werden. Was ich festgestellt
habe ist, dass ein 100nF Keramik C direkt an den Versorgungspins des
MMC/SD Sockels/Adapters wahre Wunder bewirken kann.

von Werner B. (Gast)


Lesenswert?

P.S. Reicht dennn dein RAM im M8???

von thomas (Gast)


Lesenswert?

Danke für die Info mit dem Sleep Modus.

Das mit dem Kondensator werd ich nochmal ausprobieren.

Das RAM des ATM8 reicht. FAT brauch ich nicht und neben dem
Sektorbuffer sind da nur noch ~20 Variablen (meist Integer).
Die Probleme sind ja auch schon beim Init und nicht erst wenn ich mit
eine Sektor hantiere.

Thomas

von Florian (Gast)


Lesenswert?

Was ich noch nicht so ganz auf die Reihe kriege ist das
Formatieren/Schreiben der Karten unter Windows XP. Gibt's da nicht
irgendeine ausführliche Anleitung oder ein Tool, womit man das richtig
machen kann, damit mal eine Fehlerquelle ausgeschlossen werden kann?

von Mike (Gast)


Lesenswert?

Natürlich!
http://www.sdcard.org/Downloads.aspx
Heisst SDFormatter.

von Dennis Kleine-Beck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

üblicherweise geht das auch mit XP-eigenen Mitteln in der DOS-Box. Man
muss evtl. nur mit dem Wert von "a" etwas spielen (ganzzahliges
Vielfaches von 1024), um am Ende "16 bits in each FAT entry" zu
erhalten.

Anbei ein Bsp. für 'ne kleine Karte (Karte ist Laufwerk f: in diesem
Bsp.).

Gruß,
Dennis

von Matthias (Gast)


Lesenswert?

Hallo,

Warum darf es nur 16 Bit in jedem Fat Datensatz geben

ich formatiere 1 oder 2 GB Karten mit 32 Bit in jedem Datensatz
ist das schlecht

gruss
Matthias

von Thomas (Gast)


Lesenswert?

Hi,
ich hab meine Datenlogger jetzt soweit (mit ATM32, ATM8 ging gar nicht).
Leider ist der Stromverbrauch recht hoch.
ATMEGA (mit 1MHz internal clock) ~ 8mA
LED ~ 5mA
MMC (MMCplus, Reichelt, 256MB) ~ 40 mA (in Ruhe!)

Die MMC braucht in Ruhe schon einen Haufen Strom.
Ich würde die MMC gerne abschalten und nur alle 5 Sekunden
kurz einschalten. Das passt auch für meine Applikation.

Leider weiss ich nicht wie ich das anstellen soll.
Analog kann ich nicht.

Ich hab mal gegoogelt und es diletantisch mit BS 170 und
BS250 MOSFET's probiert. Hat aber nicht funktioniert.

Kennt jemand ne Seite im Web wo eine MMC über einen Transistor
Schalter ein und ausgeschaltet wird.
Bitte keine allgemeinen Sachen über Transistoren, ich hätte es
gerne einfach nur zum Nachbauen ohne Grundlagen. (Frech, ich weiss)

Danke .. Thomas

von Michael P. (mipo)


Lesenswert?

Schau mal an, wie Chan das gemacht hat --> 
http://elm-chan.org/fsw/ff/00index_e.html

(In den Samples sind auch Schaltpläne drin.)

von Benedict (Gast)


Lesenswert?

Hi Leute!
ich bin gerade dabei einen GPS-Datenlogger zu bauen. Leider steh ich ein 
wenig auf dem Schlauch, wie ich das alles verkabeln soll. Könnte mal 
jemand bitte seinen schaltplan posten? Als IC hatte ich mir einen 
ATmega128 vorgestellt, oder gibt es auch eine alternative ohne SMD zu 
verlöten?

Vielen Dank und noch frohe Festtage!
Benedict

von emil (Gast)


Lesenswert?

Hallo,

beim Kompilieren von main.c (SourceCodeV2.5 von Uli) bekomme ich immer 
wieder die folgende Error-Message:

main.c:65: warning: passing arg 1 of `fdevopen' from incompatible 
pointer type
main.c:65: error: too many arguments to function `fdevopen'


Dies bezieht sich auf folgenden Funktionsaufruf in main.c:

....
//öffnet einen kanal für printf
fdevopen (uart_putchar, NULL, 0);
...

Was mache ich denn falsch?

von Volkmar (Gast)


Lesenswert?

Tippe mal auf eine neuere Compiler-Version. Ist aber ein Griff ins 
Blaue.

Volkmar

von Richard Brose (Gast)


Lesenswert?

@emil

Einfach fdevopen (uart_putchar, NULL, 0); in
fdevopen (uart_putchar, NULL); ändern.

von emil (Gast)


Lesenswert?

@Richard:

vielen Dank Richard, bin mittlerweile auch darauf gekommen, jetzt klappt 
es!

von Minipilot (Gast)


Lesenswert?

Hallo!

Habe vor Daten von einem GPS Modul auf eine SD karte zu speichen. Das 
ganze soll in einer Text Datei erfolgen. Ich habe gelesen das es möglich 
ist in einer FAT16 formatierten Karte in einer vorhandenen Datei zu 
schreiben. (z.B. wie bei dem Webserver die Bilder). Kann man auch so was 
in einer .txt Datei realisieren, wenn ja wie.


Gruß Lutz

von Marian (Gast)


Lesenswert?

Hallo,

ich versuche auch gerade mit dem SourceCodeV2.5 von Uli eine SD Karte 
anzusprechen und bekomme beim Kompilieren folgende Fehlermeldungen:

MMC_main.c: In function 'main':
MMC_main.c:100: warning: pointer targets in passing argument 1 of 
'printf' differ in signedness
MMC_main.c:107: warning: pointer targets in passing argument 1 of 
'fat_search_file' differ in signedness

fat.c: In function 'fat_search_file':
fat.c:303: warning: pointer targets in passing argument 1 of 
'strcasecmp' differ in signedness
fat.c:303: warning: pointer targets in passing argument 2 of 
'strcasecmp' differ in signedness

Ich benutze AVRstudio 4.13 mit dem neuesten Compiler und verwende diese 
Uartfunktionen:

/* Uart Routine für die printf() Fkuntion*/
int uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
    loop_until_bit_is_set(UCSRA, UDRE);
    UDR = c;
    return 0;
}
FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);

In der main() habe ich noch folgendes zu stehen:
 //öffnet einen kanal für printf
 stdout=&mystdout;

Was muss ich noch ändern, damit diese Fehlermeldungen verschwinden?

Gruß,

Marian

von Werner B. (Gast)


Lesenswert?


von Marian (Gast)


Lesenswert?

@Werner B.:

Danke für den Link aber leider kann ich daraus nichts entnehmen was mit 
weiterhilft. Könntest du mir einen spezielleren Tip geben?

von holger (Gast)


Lesenswert?

Warnings sind keine Errors. Meistens kann man sie ignorieren.

Nimm einfach mal das als Beispiel:

>fat.c:303: warning: pointer targets in passing argument 1 of
>'strcasecmp' differ in signedness

strcasecmp() wird wahrscheinlich ein 'unsigned char'
als Parameter 1 übergeben, es sollte aber ein 'char'
sein. Ab Version 4.x.x sind die AVR-GCC penibler
als die früheren Versionen und meckern da rum.

Da hilft dann ein typecast mit (char).

von holger (Gast)


Lesenswert?

>Da hilft dann ein typecast mit (char).

Quatsch, natürlich mit (char *)

von Marian (Gast)


Lesenswert?

Danke Holger,

auf diese Idee bin ich auch schon gekommen aber verändere ich damit 
nicht irgendwie das Ergebnis?

von Werner B. (Gast)


Lesenswert?

Der wichtige Teil:

<cut>
The standard IO facilities API has been enhanced:

    * The backend functions put and get that are passed to fdevopen() 
during the setup of a stream now take the stream itself as an additional 
argument. By defining the macro __STDIO_FDEVOPEN_COMPAT_12 before 
including <stdio.h>, an fdevopen() function prototype will be declared 
that is backwards-compatible with avr-libc version 1.2 and before.
</cut>

von Marian (Gast)


Lesenswert?

@Werner B.:

Auch wenn ich das macro __STDIO_FDEVOPEN_COMPAT_12 vor dem einbinden der 
<stdio.h> definiere, gibt er mir diese Warnungen aus.

Ich werde das jetzt einfach casten und dann funktionierts ja.

Gruß,

Marian

von Martin W. (thepuppetmaster)


Lesenswert?

Hallöle Leute ...

Habe mich jezt auch mal mit der Ansteuerung der SD Karte beschäftigt.
Aus dem Grossen weiten netz habe ich massig an Quellcode gesammelt und 
musste feststellen, das nur 2 oder 3 % der Codes Funktionieren ...

Darum willich euch n kleinen Tip geben, woran es liegen kann, wenn Ihr 
trotz Probieren udn Probieren nicht zum Ziel kommen solltet.

Mir ist nämlich aufgefallen, das di equellcodes ansich nicht immer 
fehlerhaft sind, sondern eigentlich nur 10% der Codes leicht verbugt 
sind.

Das Grösste Problem bei der Ansteuerung sind nicht die Codes, sondern 
die Verwendete Hardware.

Wenn man die Hardware von Ulrich-Radig nuzt, mit den Transistoren, dann 
kann dies zu problemen mit einigen Quellcodes führen. (Nix gegen den 
Schaltplan von Ulrich)

Das Problem das ich ansprechen möchte ist die Geschwindigkeit der 
Kommunikation.

Ich nutze einen M16 mit 11,0592MHz Takt. Bei dieser Rate und dem 
Transistor-Levelshifter von Ulrich, kann es zu Signalverschliess kommen, 
und folglich zu fehlerhafter Kommunikation.

Wer Probleme mit der ansteuerung hat und ein Oszilloskop besizt, sollte 
sich mal die Clocksignale anschaun. Wenn diese verschliffen sind, und 
eher wie Ladekurven von Kondensatoren aussehen, dann solltet Ihr 
entweder einen anderen Quarz am µC nutzen (einen langsammeren), oder die 
Clockrate im Quellcode herab setzen.

Nachdem ich einige (bei mir nicht funktionierende Quellcodes) 
dahingehend Modifiziert habe, udn Warteschleifen, bzw. Clockraten 
geändert habe, haben diese Codes plötzlich Fehlerfrei funktioniert.

Ich kann mir zwar nicht erklären, wo das Problem mit den Transistoren 
(BC850) her kommt, da sie eigentlich eine höhere Transitfrequenz haben 
(einen höheren Frequenzgang als nötig besitzen), aber wie schon 
geschrieben, hat dies zur Lösung des Problems mit den Quellcodes 
geführt, die ich getestet habe.

In einem Quellcode nuzt jemand (weiss grad nicht von wehm das ist), die 
Shiftin udn Shiftout befehle. Um hier die Clockzeiten anzupassen, reicht 
es aus, dem Befehl noch 2 Weitere Parameter zu übergeben

(BASCOM-AVR)
Shiftout Mosi , Clk , Dat , Msbl , 8 , 500
Shiftout Mosi , Clk , Addr , Msbl , 32 , 500

Am ende gibt man zum einen eine "8" oder "32" für die anzahl der Bits 
ein, die übertragen werden sollen ("Dat" hat 8 Bits breite und "Addr" 32 
Bits), und danach eine Delay Zeit von 500 µs.

In anderen Beispielen, in denen Schliefen udn Manuelles Herausschiften 
genuzt wird, kann man eine kleine Wartesub schreiben, die eineige IPS 
abwartet, bis sich der Clockimpuls sauber aufgebaut hat.


Wer kein Oszilloskop besizt, kann auch einfach mal die Clockfrequenz 
runter setzen, auf ein extremes minimum, und eine LED über einen 1K 
wiederstand nach masse am MISO ausgang der Karte (Da wo daten zum µC hin 
laufen) an klemmen.
Bei entsprechender drosselung der Clock-zeiten, und einem 
Terminal-anschluss oder einem LCD, kann man dann schritt für schritt 
mitverfolgen, ob bei den entsprechenden Befehlen Antworten von der Karte 
gesendet werden.


Ich hoffe, ich konnte euch damit etwas weiter helfen.


MfG
TPM

von whitedog (Gast)


Lesenswert?

;) Nur ein kurzer Hinweis auf die Transistorproblematik, Leute immer 
schön dran denken dass die 'komplexen' Widerstände, insbesondere ab nen 
paar MHz sich ganz deutlich von der Gleichspannungsrechnung 
unterscheiden - nicht umsonst nennt das Datenblatt die BC-Gurke 
'low-noise' bis 15kHz ;)
Als pauschaler Tipp: nehmt MOSFETS (läßt sich leichter rechnen, da fast 
nur die Gate-Kapazität mit zu beachten ist) und wenns geht lieber nen IC 
(HC, AC, VHC, etc.) dann habt ihr die ganze Problematik nur wenn die 
Lötpunkte zu dick werden! ;)
Ansonsten, danke fürs Forum, der eine oder andere Tipp war echt 
hilfreich!

von Volker (Gast)


Lesenswert?

Hier (nach unten scrollen) gibt es ein paar nette Oszilloskopbilder zu 
dem Thema: http://www.shop.display3000.com/pi8/pi14/pd102.html
Ich vermute es liegt an der von "whitedog" und der in den Bildern 
gezeigten und nochmal beschriebenen Problematik das der Kartenanschluss 
bei vielen nicht klappt.
Volker

von Uli_2 (Gast)


Lesenswert?

@Manni Beitrag von 23.02.2006
mit SD_CARD_IF_SOFTWARE:ZIP.

Hallo habe deine Routine übernommen und diese auf 2 SD Karten zum laufen 
bekommen. 1000 Dank dafür.
Ich benutze eine 32MB SD Karte und eine 2GB MicroSD. Beide kann ich über 
das TestSDCard.asm ansteuern und testen.

Nach dem Test wird die Karte aber als unformatierte Karte unter XP 
angezeigt. Ist mir soweit auch klar, da ja alle Bereiche der Karte 
wahllos überschrieben werden.

Kann mir jemand weiterhelfen, wie ich unter Assembler die Bereiche für 
die Partition und die Fat und Dateitabelle beschreiben kann ?
Ich möchte nämlich die Daten des Atmega direkt als txt oder dat Datei 
auf der Karte ablegen, diese aber zur Auswertung an jedem Win Rechner 
einlesen können. Am Besten wären txt Datei und die Werte durch Tab 
getrennt. Somit wäre eine einfaches Importieren z.B. in Excel zur 
Datenauswertung einfach möglich.

Wer kann  mir helfen ?
Vielen Dank im voraus

Gruß uli2

von Robeterbauer (Gast)


Lesenswert?

Shiftout Mosi , Clk , Dat , Msbl , 8 , 500
Shiftout Mosi , Clk , Addr , Msbl , 32 , 500

Den scheiss oben von Bascom kann man so nicht nutzen.
Du musst dir davon mal den ASM-Source ansehen, dann wir dir schlecht.


mfg

von Gast (Gast)


Lesenswert?

Hallo,
habe jetzt auch mal das beispiel von radig probiert, leider findet mein 
avr die SD nicht, hab schon mehrere versucht und auch mal den port 
gewechselt, aber es geht einfach nicht. Gibts irgwas was man beachten 
sollte? Oder an was liegt das? Als µC hab ich einen atmega32 benutzt.

mfg

von Helfer (Gast)


Lesenswert?

>Gibts irgwas was man beachten sollte?
http://www.mikrocontroller.net/articles/MMC-_und_SD-Karten

von Gast (Gast)


Lesenswert?

Hab die Schaltung neu aufgebaut und etwas geändert, jetzt wird die karte 
immerhin erkannt, leider kommt jetzt der nächste fehler:
Karte gefunden!!

MBR Signatur not found!

Kommt bei allen karten von mir. Hab auch schon die Frequenz vom 
controller geändert und die karte mehrfach formatiert, aber immer das 
gleiche.

mfg

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.