MMC/SD ansteuern mit AVR

Gast #102032
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.
Gast #102036
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!
Gast #102037
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
Gast #102040
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
Angehängte Dateien:
Gast #102041
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?
Gast #102043
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
Gast #102046
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
Angehängte Dateien:
Gast #102048
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.
Angehängte Dateien:
Gast #102049
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
Gast #102050
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
Gast #102052
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);
}
Gast #102053
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.
Gast #102061
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
Gast #102064
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.
Gast #102065
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
Gast #102068
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 ...
Gast #102069
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
Gast #102073
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
Gast #102077
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
Gast #102087
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 ?!
Gast #102088
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
Gast #102089
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.
Gast #102090
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
Gast #102091
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
Gast #102098
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
Angehängte Dateien:
Gast #102100
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!
Angehängte Dateien:
Gast #102101
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
Gast #102102
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
Gast #102105
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 :-)
Gast #102111
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
Angehängte Dateien:
Gast #102115
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. Ä.).
Gast #102118
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
Gast #102119
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.
Gast #102120
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
Gast #102121
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
Gast #102123
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.
Gast #102130
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.
Gast #102131
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
:-(
Gast #102134
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
Gast #102136
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
Gast #102137
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é
Gast #102139
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
Gast #102140
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
Gast #102141
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
Gast #102142
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.
Gast #102143
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
Gast #102144
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
Gast #102145
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
Gast #102147
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
Gast #102149
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
Gast #102150
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
Gast #102151
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!
Gast #102156
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
Gast #102162
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
Gast #102163
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
Gast #102166
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
Gast #102167
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
Gast #102170
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.
Gast #102176
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
Gast #102177
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
Gast #102178
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 ?
Gast #102180
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.
Gast #102186
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 ... ;-)
Gast #102188
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.
Gast #102190
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
Gast #102191
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.
Gast #102194
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
Gast #102195
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
Gast #102196
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
Gast #102204
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
Gast #102208
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
Gast #102210
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?
Gast #102212
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.
Gast #102213
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)
Gast #102220
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren