Forum: Mikrocontroller und Digitale Elektronik SD-Card an MSP430F1612 (wieder mal.)


von Mathias U. (munter)


Lesenswert?

Hallo, ich möchte eine SD-Card an den MSP430 anbinden.
Kurz zur Hard & Software:

MSP430F1612
SanDisk 512MB SD-Card
IAR 3.20A
Das ganze soll in C geschrieben werden...

Ich habe mich schon etwas in die Sache eingelesen, aber irgendwie gibt 
es dabei ein paar Widersprüche.

Vor ein paar Wochen hat der User  "reflection" ja schonmal angemerkt, 
dass wohl die Apnote (SLAA281A) von TI bezüglich SOMI und MISO falsch 
sei.
Das sehe ich auch so.

Ich habe meine SD-Card so angeschlossen, wie es auf dem 
Development-Board der Firma olimex realiseiert ist.
Hier mal ein Link zum Schematic:
http://www.olimex.com/dev/images/MSP430-4619LCD-sch.gif
(auf der rechten Seite ist die Anbindung zu sehen...)

Hier meine Anbindung:

SD-Card                       MSP430F1612
-----------------------------------------
Pin 1 Dat3/CS/CD              P5.0/ STE1
Pin 2 Data IN                 P5.1/ SIMO1
Pin 3 GND
Pin 4 Vdd
Pin 5 CLK                     P5.3/ UCLK1
Pin 6 GND
Pin 7 Data OUT                P5.2/ SOMI1
Pin 8 per PullUp auf 3.3V
Pin 9 per PullUp auf 3.3V

Die Pins P5.4 bis P5.6 des MSP benutze ich, um abzufragen, ob eine Karte 
drin ist, oder nicht, und um zu testen, ob der Schreibschutz aktiv ist.
Dies geschieht rein mechanisch, da an meinem SD-Card-Adapter extra-Pins 
dafür vorgesehen sind...

Jetzt gibt es noch ein Problem mit dem TI Apnote. Da haben sie ja den CS 
(Pin 1 der SD-Card) auf P5.4 des MSP gelegt...was soll das denn?
Beim oben genannten Development-Board ist der Chip-Select auf P5.0 des 
MSP gelegt. So hab ich es ja auch.

Das komische ist aber auch das einige hier im Forum schreiben, sie 
hätten den TI-Code zum Laufen gebracht. Aber welche Änderungen muss ich 
denn jetzt an dem Code durchführen, wenn überhaupt?

Geht meine Beschaltung überhaupt? Ich meine, wenn Olimex diese Boards 
verkauft, wird es schon richtig sein, oder?

Noch eine Sache zu Datei-System:

Ich habe Daten vom MSP, die aber nur zu bestimmten Zeiten auf SD-Card 
geschrieben werden sollen. Die Start und Endzeit gibt der Benutzer vor.
Diese Daten hätte ich am liebsten in separaten Textfiles auf der 
SD-Card.
Ich möchte die Daten nur per PC lesen können. Aber ohne irgendwelche 
Hex-Editoren oder ähnliches...
--> Also muss wohl nen FAT drauf. Aber welches? Reicht ein Fat16, oder 
müsste es da ein FAT 32 sein. Ich würde gerne die Text-Files auf der 
SD-Card nach der Startzeit der Protokollierung benennen, also z.b. 
0709171030 für 17.09.07 10:30.
Jetzt hat der Dateiname allerding mehr als 8 Zeichen...ginge das 
trotzdem mit FAT 16?

Wo finde ich auf die Schnelle Infos zum Implementieren von FAT auf dem 
MSP430?

Sind viele Fragen, ich weiss, aber ich hoffe, Ihr könnt mir 
weiterhelfen...
Vielen Dank!!

von reflection (Gast)


Lesenswert?

Also mit FAT habe ich es bis Dato nicht zum laufen gebracht. DAs TI ding 
ging, aber nur nach diversen Anpassungen. Was genau weiss ich jetzt auch 
nicht mehr, aber vor allem in den Headerfiles. Dort wird so viel ich 
noch weiss der CS ect. eingestellt.

Gruss reflection

von Mathias U. (munter)


Lesenswert?

Hallo...und Deine Files hast Du nicht mehr??? Ahhhhh, schade!!!
Klar kann man in den Header-Files ne Menge einstellen, aber ich will mir 
ersparen, alles *per Hand durchzugehen...

Wie hast Du das dann ohne nen FAT gemacht?
Danke

von reflection (Gast)


Lesenswert?

Ich schreibe direkt auf die Karte, muss es dann halt mittels eines HEX 
Editors anschauen, aber dafür ist es schneller :o)
Wegen Files muss ich nochmal schauen, habe das Projekt auf Eis gelegt.
Gruss

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Hallo Mathias,

schön, ich mache gerade was ähnliches, siehe auch meinen Beitrag von 
heute. Die Beschaltung und Software läuft schon teilweise. Ich kann auf 
die Karte schreiben, aber nicht lesen. Ich bin jetzt im Büro, kann Dir 
aber heute abend Links geben. Dort findest Du Informationen zu FAT16, 
langen Dateinamen etc.

Zu Deiner Frage mit der TI-Doku: Ja, ich habe SOMI und SIMO vertauscht, 
weil der MSP als Master läuft. Das geht auch aus der Doku zu SPI von TI 
hervor, also nicht aus dem Dok slaa281a.pdf.

Gruß
Uli

von Mathias U. (munter)


Lesenswert?

Hallo Uli, wäre super mit den Links...
irgendwie muss die Sache doch zum laufen zu kriegen sein...

Wohin hast du den Pin1 von der SD-Card gelegt? Auf Px.0 (wie ich) oder 
Px.4 (wie im appnote)? Das ist so eine Sache, die mir irgendwie nicht 
ganz einleuchtet...
@Uli: hast du ein schematic da?

@ reflection: wenn Du die files noch finden würdest, wäre super.
Aber dann schrieb auch mal bitte, WIE Du die SD-Card an den MSP 
drangebastelt hast...mit nem schematic als pdf oder so...

Wenn gewünscht, kann ich mein schematic auch mal dranhängen...

Gruß
Mathias

von Ulrich M. (Firma: ---) (ulrich1267)


Angehängte Dateien:

Lesenswert?

Hallo Mathias,

ich habe !CS an P5.4, wie in der Appnote. Scheint auch zu funktionieren. 
Ich kann ja bloss nichts von der Karte lesen. Also muß die restliche 
Belegung wohl stimmen, sonst könnte ich nichts schreiben. Oder? Ich bin 
mir nicht 100% sicher...

Guck' mal unter

http://home.teleport.com/~brainy/fat16.htm und
http://home.teleport.com/~brainy/lfn.htm

Auch lesenswert ist der FAT16-Artikel auf wikipedia.
Ich habe aber auch vermutlich geringere Ansprüche an das FAT als Du. Ich 
will lediglich aus dem Root-Verzeichnis lesen und auch nur dort 
schreiben. Ich glaube, dass das die Sache sehr vereinfacht.

Ich kriege nix gelesen. Ist doch zum K****n!

Im Anhang ist ein Ausschnitt von mir. Da ist kein µC zu sehen. Ich habe 
stattdessen Steckerleisten eingezeichnet. Die sind aber Pinkompatibel...

Gruß
Uli

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hallo, hast es ja wirklich genauso gemacht, wie im appnote...
Danke für die Links...da hab ich ja was zu Lesen heute Abend ;-)

Ich habe mal meines angehängt.
Ich habe es hier her:
http://www.cs.ucr.edu/~amitra/sdcard/Additional/sdcard_appnote_foust.pdf
(von Seite 3)

Aber ich habe gerade festgestellt, dass die mit !SS den Px.4 meinen und 
nicht Px.0. In deren Software ist es P3.4.
ICH habe den aber an P5.0 dran...weil ich es wie geschrieben aus der 
ganz oben genannten Quelle habe.
hxxp://www.olimex.com/dev/images/MSP430-4619LCD-sch.gif

Also werde ich wohl nen neuen Adapter basteln, der dann auch mit der 
Appnote übereinstimmt, sonst müsste ich ja soviele Sachen dran ändern...

Könnte es bei deinem Lese-Problem an den fehlenden PullUP-Widerständen 
liegen? Kannst ja mal testen...

Wie heißt denn die Appnote für das SPI? Habs auf die schnelle nicht 
gefunden.

Mathias

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Ich meinte mit SPI-Doku keine spezielle Appnote, sondern einfach das 
Kapitel "14.2 USART Operation: SPI Mode" aus dem 'normalen' MSP430x1xx 
User Guide.

Die Pullup-Widerstände. Ja, das ist richtig. Die sind aber doch 
eigentlich nur wichtig, wenn keine SD-Karte steckt, damit die Eingänge 
vom MSP definiert sind. Jedenfalls denke ich das. Deswegen habe ich sie 
meinem ersten Entwurf einfach mal weggelassen (ist eh nur ein 
Experimentieraufbau)... Meinst Du trotzdem, dass es daran liegen könnte? 
Das werde ich dann heute noch mal ausprobieren.

von Mathias U. (munter)


Lesenswert?

...Ich weiß es nicht, bin was MSP430 angeht absoluter noob.

Aber Versuch macht kluch, oder?
Schaden können die PullUP's jedenfalls nicht...

Mathias

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

So, habe mal angefangen mich durch den Code von der Appnote slaa281a zu 
hangeln.
Schon tauchen die ersten Merkwürdigkeiten auf.

Ich habe mal die komplette *.zip angehängt.

mmc.c :

Die Funktion initMMC
1
char initMMC (void)
2
{
3
  //raise SS and MOSI for 80 clock cycles
4
  //SendByte(0xff) 10 times with SS high
5
  //RAISE SS
6
  int i;
7
  // Port 5 Function           Dir       On/Off
8
  //         5.0-mmcCD         Out       0 - card inserted
9
  //         5.1-Dout          Out       0 - off    1 - On -> init in SPI_Init
10
  //         5.2-Din           Inp       0 - off    1 - On -> init in SPI_Init
11
  //         5.3-Clk           Out       -                 -> init in SPI_Init
12
  //         5.4-mmcCS         Out       0 - Active 1 - none Active
13
  P5SEL |= 0x0E;
14
  P5SEL &= ~0x11;
15
  P5OUT |= 0x10;
16
  P5DIR |= 0x1A;
17
18
  initSPI();
19
  //initialization sequence on PowerUp
20
  CS_HIGH();
21
  for(i=0;i<=9;i++)
22
    spiSendByte(0xff);
23
24
  return (mmc_GoIdle());
25
}

1) Muss es nicht im Kommetar heissen, dass P5.0 ein INPUT ist, denn in 
der Funktion mmc_ping (mmc.c) wird das erste Bit des Ports 5 
abgefragt...also INPUT???
Ausserdem Wird ja per P5DIR |= 0x1A; bit0 als Eingang definiert.

2) P5SEL |= 0x0E; (0000 1110) bedeutet, dass für die Pins P5.1 bis P5.3 
die Zweitfunktion gelten soll, richtig???

3) Was soll dann P5SEL &= ~0x11; ?? das macht doch nochmal genau das 
gleiche, oder?

Erst steht in P5SEL 0000 0000 drin.
Dann P5SEL |= 0x0E; damit steht jetzt 0000 1110 drin
Dann P5SEL &= ~0x11; also wird 0000 1110 mit 1110 1110 "geUNDet", was 
wieder 0000 1110 bedeutet...???

4) Die Funktion mmc_ping():
1
char mmc_ping(void)
2
{
3
  if (!(P5IN & 0x01))
4
    return (MMC_SUCCESS);
5
  else
6
    return (MMC_INIT_ERROR);
7
}

Kann mir mal bitte einer erklären, was if (!(P5IN & 0x01)) bedeutet.
Diese Kurzschreibweisen in den TI_codes sind für Anfänger echt ein 
Graus!
Meine Erklärung:
Wenn die Abfrage des Port5 Pin0 false ist, dann gib MMC_SUCCESS zurück.
Man könnte es auch so schreiben if ((P5IN & 0x01) == 0)...  , oder?


danke

mathias

von Stefan (Gast)


Lesenswert?

>Erst steht in P5SEL 0000 0000 drin.
>Dann P5SEL |= 0x0E; damit steht jetzt 0000 1110 drin
>Dann P5SEL &= ~0x11; also wird 0000 1110 mit 1110 1110 "geUNDet", was
>wieder 0000 1110 bedeutet...???

Falls P5SEL nun aber 1111 1111 war ?
Was ist dann?
Dann macht P5SEL &= ~0x11 sehr wohl Sinn :-)

von Stefan (Gast)


Lesenswert?

>Man könnte es auch so schreiben if ((P5IN & 0x01) == 0)...  , oder?

Yepp!

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

if (!(P5IN & 0x01))

Pin 5 wird mit 0x01 verundet. Raus kommt == 0 oder != 0. Der folgende 
Code wird also nur ausgeführt, wenn das erste Bit von PIN5 NICHT gesetzt 
ist, da das ! ja verneint.

Gruß
Uli

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Und noch was: Wenn Du den Code von TI am laufen hast, pass genau auf, 
wann char und unsigned char verglichen wird. Das ist knifflig. Bei mir 
hat das mit dem Lesen genau aus diesem Grund nicht funktioniert, bis ich 
die Compiler-Option "plain_char=unsigned" gesetzt habe...

von Mathias U. (munter)


Lesenswert?

OK, danke...für welche Pins wird denn nun die Zweitfunktion verwendet?

P5SEL ist doch standartmäßig 0000 0000, also Erstfunktion, oder?
Es wird auch vorher im Code nicht verändert.
Was wieder 3) auf den Plan ruft...

Wenn es wirklich 1111 1111 WÄRE, dann würde nach der ganzen Aktion ja in 
P5SEL 1110 1110 drin stehen.
Also alle bis auf P5.0 und P5.4 wäre auf Zweitfunktion gestellt.
Was ja ziemlich dämlich ist, weil P5.5 bis P5.7 im Code NIEMALS 
vorkommen.

Gruß
mathias

von Stefan (Gast)


Lesenswert?

OK, ich habe jetzt nicht explizit auf die P5.x geachtet.
Ich meinte eigentlich, dass man generell als Programmierer nie davon 
ausgehen sollte, dass eine Variable/Register einen bekannten Wert (in 
dem Fall 0) hat, denn eine Funktion, die man schreibt, sollte ja 
universell einsetzbar sein und damit auf alle Fälle vorbereitet sein. 
Und dann muss man eben sowohl Bits setzen (|=) als auch löschen (&= ~) 
können!

von Stefan (Gast)


Lesenswert?

Im Detail:

Da es sich hier anscheinend um SPI dreht und ich dem Code-Schnipsel da 
oben entlocke, dass es 3-Wire SPI ist, dann hast Du Recht, das P5.1-P5.3 
die "Zweitfunktion" haben sollen. Demzufolge wäre folgender Code nicht 
schlecht:

  P5SEL |=  0x0E;       // P5.1 - P5.3 Zweitfkt. setzen
  P5SEL &= ~0xF1;       // Alle anderen P5.x Zweitfkt. löschen

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

Nö, würde ich nicht sagen. 0x11 bezieht sich nämlich nicht auf das 
gesamte restliche Byte 0xF1 schon!

0x11 =    10001
0xF1 = 11110001

0x11 läßt also alles was nicht verstellt werden soll in Ruhe...

von Stefan (Gast)


Lesenswert?

>0x11 =    10001
>0xF1 = 11110001
>0x11 läßt also alles was nicht verstellt werden soll in Ruhe

Mathias sagt:
>Was ja ziemlich dämlich ist, weil P5.5 bis P5.7 im Code NIEMALS
>vorkommen.

Deshalb habe ich P5.5 - P5.7 auch als I/O definiert.
Er hatte ja die 0x11 nicht verstanden!

von Ulrich M. (Firma: ---) (ulrich1267)


Lesenswert?

@Stefan Achso, dann sorry. Das war sowieso etwas oberlehrerhaft bzw. 
einfach Klugscheißerei von mir... ;-)

@Mathias Da wir jetzt ja noch was ähnliches vorhaben, SD zum Laufen 
bringen und dann FAT16, wäre ich sehr an einem Erfahrungsaustausch 
interessiert. Der Krempel ist ja für uns beide Neuland. Was meinst Du? 
Ich komme wahrscheinlich erst wieder ab Freitag dazu, aber wenn ich 
irgendwas zum Laufen bringe, werde ich Dich das einfach mal wissen 
lassen. Umgekehrt wäre ich Dir auch dankbar für Neuigkeiten... :-)

von Mathias U. (munter)


Lesenswert?

Hallo Uli, da ich dies im Zuge meines Diploms brauche, werde ich wohl 
fast täglich dransitzen... ;-)
Erfahrungsaustausch ist super! Bin dabei...

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe gestern mal meine kleine Platine verändert,
damit die Belegung jetzt wie im TI_Sample ist.

Hier meine jetzige Anbindung:

SD-Card                       MSP430F1612
-----------------------------------------
Pin 1 Dat3/CS/CD              P5.4/ MCLK
Pin 2 Data IN                 P5.1/ SIMO1
Pin 3 GND
Pin 4 Vdd
Pin 5 CLK                     P5.3/ UCLK1
Pin 6 CD                      P5.1/ STE1
Pin 7 Data OUT                P5.2/ SOMI1
Pin 8 per PullUp auf 3.3V
Pin 9 per PullUp auf 3.3V

Jetzt habe ich mal das Programm von T druchlaufen lassen.
Siehe Beitrag vom Datum: 17.09.2007 21:56 von mir...

Die Initialisierung scheint zu funktionieren, denn:

Er gibt mir im Debugger eine CardSize von 507379712 aus. Nun gut...
Die SD-Card (Sandisk 512MB) ist laut Windows-Datei-Explorer mit FAT16 
formatiert
und hat 507.052.032 Bytes freien Speicher. Das entspricht rund 483MB.

Der Hex-Editor WinHex gibt mir ebenfalls die 507.052.032 aus.
Allerdings soll die gesamte Kapazität bei 507.201.024 Bytes liegen.
Das weicht ein wenig von der vom Programm ausgegebenen Größe ab, soll 
mich aber jetzt nicht weiter stören.
1
unsigned char buffer[512];
2
3
int main( void )
4
{
5
  WDTCTL = WDTPW + WDTHOLD;
6
  
7
  initMMC();
8
  
9
  while ((mmc_ping() != MMC_SUCCESS));      // Wait till card is inserted
10
11
  // Read the Card Size from the CSD Register
12
  cardSize =  MMC_ReadCardSize();
13
14
  for (i = 0; i <= 512; i++) buffer[i] = i;
15
  mmcWriteSector(1, buffer);                // write a 512 Byte big block beginning at the (aligned) adress
16
17
  for (i = 0; i <= 512; i++) buffer[i] = i+64;
18
  mmcWriteSector(2, buffer);                // write a 512 Byte big block beginning at the (aligned) adress
19
20
  mmcReadSector(1, buffer);                 // read a size Byte big block beginning at the address.
21
22
  mmcReadSector(2, buffer);                 // read a size Byte big block beginning at the address.
23
24
  mmc_GoIdle();                             // set MMC in Idle mode
25
26
  while (1);
27
}

Er schreibt ein Array aus 512bytes. Dieses ist mit 0, 1, 2, ..., 511 
belegt.
Dieses Array wird jetzt in Sektor 1 der SD-Card geschrieben.
Danach überschreibt er das Array (buffer[i]) mit neuen Werten 64, 65, 
..., 566.
Dieses Array wird jetzt in Sektor 2 der SD-Card geschrieben.

Danach liest er die Sachen wieder aus, wobei ich noch nicht weiss, wie 
ich überprüfen kann, ob er es tatsächlich macht...

Was ich jetzt nicht begreife, ist:

Müsste ich nicht im WinHex sehen, dass im Sektor 1 und im Sektor 2 Daten 
drin stehen?
Der erste Sektor beginnt wohl bei 512 und endet bei 1023.
Im Bild sieht man, dass bei
512 F8, bei 513 FF, bei 514 FF und bei 515 FF drin steht, danach wieder 
Nullen.
Das sollen doch die einzelnen Bytes sien, oder? aber warum ZWEI stellen? 
Nen Byte sind doch ACHT bit.

Wo oder wie kann ich mir die "Daten" anschauen, die auf die SD_Card 
geschrieben wurden.

Sorry, für die evtl. blöden Fragen, aber ich kenn mich mit der MAterie 
noch nicht ganz so gut aus...habt Verständnis ;-)

mathias

von Christian R. (supachris)


Lesenswert?

Vielleicht solltest du dir folgende Zeile nochmal gaaaanz genau 
angucken:
1
for (i = 0; i <= 512; i++) buffer[i] = i;

Das macht mir hoher Wahrscheinlichkeit nicht das, was du möchtest.

Ebenso das 2. Füllen des Buffers.

Hast du den Buffer nach dem Füllen mal im Debugger angeschaut?

von Mathias U. (munter)


Lesenswert?

?? Also der Code kommt ja nicht von mir, sondern von TI.

Ich hab die for() - Schleife mal im debugger "beobachtet". Und da 
schreibt er in buffer[0] ne 0, in buffer[1] ne 1 usw.
und dann in der zweiten for() halt in buffer[0] ne 64 usw....

>>Hast du den Buffer nach dem Füllen mal im Debugger angeschaut?

Wie meinst Du das?

Mathias

von Stefan (Gast)


Lesenswert?

1.) VORSICHT!
>for (i = 0; i <= 512; i++) buffer[i] = i;
Dein Buffer ist nur 512Bytes groß, Du schreibst aber 513Bytes rein!
Könnte Dir eventuell andere Variablen in Prog zerschießen!

2.)
>Das sollen doch die einzelnen Bytes sien, oder? aber warum ZWEI stellen?
>Nen Byte sind doch ACHT bit.
mit 8Bit kanns'te Werte von 0 bis 255 darstellen.
Die ZWEI Stellen sind im hex-Format und gehen von 0x00 bis 0xFF,
das ist aber der gleiche Wertebereich (0-255)

von Mathias U. (munter)


Lesenswert?

OK, das mit den 513bytes leuchtet ein, aber wie gesagt, die Sache ist 
nicht auf meinem Mist gewachsen...

Das mit den zwei Stellen habe ich eben auch herraus gefunden... ;-) auch 
logisch!

Aber wo sehe ich denn jetzt die Daten im Hex-Editor?

Ich habe mal auf die Karte eine Test.txt gemacht.
Im HexEditor hat er dann bei der logischen SektorNr. 243 (physical 
SectorNr 480) nen Eintrag mit dem Dateinamen...

Und ab logischer SektorNr. 275 (pysical 512) steht der in der datei 
enthaltenen text drin...also DAS kann ich mir schonmal anschauen, aber 
wo sind die Daten vom MSP???

mathias

von Stefan (Gast)


Lesenswert?

>OK, das mit den 513bytes leuchtet ein, aber wie gesagt, die Sache ist
>nicht auf meinem Mist gewachsen...
Nee, aber korrigieren musst Du es trotzdem ;-)

>wo sind die Daten vom MSP???
Wie gesagt, wäre es möglich, dass obiger Fehler eine andere Variable 
zerschießt und der MSP dadurch erst gar nix auf die SD schreibt...
... zumindest eine mögliche Ursache...

von Mathias U. (munter)


Lesenswert?

Hallo, hmmm, na mal schauen.

Also die Funktion mmcWriteSector ist folgendermaßen definiert.

#define mmcWriteSector(sector, pBuffer) mmcWriteBlock(sector*512ul, 512, 
pBuffer)

Was bedeutet denn eigentlich sector*512u1?
Das *512u1 irritiert mich etwas? Was ist denn 512u1?

Ich meine, wenn sector 1 ist, wäre das ja die Stelle, an der der 
reingeschriebene Buffer beginnt...

mathias

von Stefan (Gast)


Lesenswert?

>Das *512u1 irritiert mich etwas? Was ist denn 512u1?
ul = unsigned long
so wie in mmcWriteBlock(const unsigned long...) auch definiert

von Mathias U. (munter)


Lesenswert?

...also müsste er, bei
1
mmcWriteSector(1, buffer);
die daten an die physikalische sektor no. 1*512 schreiben?
Und dieses "ul" ist ein Typecast? Nur in anderer Schreibweise?
danke

von Christian R. (supachris)


Lesenswert?

Nee, das ist für den Präprozessor, damit der weiß, dass die Variable 
eine Länge von unsigned long haben kann, und entsprechend Speicherplatz 
reserviert.

Irgendwie ziemlich unclever, solch lange Variablen als 
Übergabeparameter....das wird alles durch die Arbeitsregister 
geschleift....hmm...naja, der Code ist ja nicht direkt von TI, den haben 
die dann mal irgendwann reingenommen, den gabs vorher schon im Netz von 
Privat....

von Stefan (Gast)


Lesenswert?

@Mathias:
Da Du an Deiner Diplomarbeit arbeitest, solltest Du vielleicht nicht 
'einfach' den TI-Code übernehmen, sondern ihn gründlich hinterfragen.
Ich meine, wir haben jetzt schon mind. 2 Fehler darin entdeckt 
(Pinzuordnung, Buffergrenzen überschritten)... welche Fehler mögen da 
noch drin stecken? Wäre vielleicht nicht schlecht, wenn Du den Zugriff 
auf eine SD-Card verstehen würdest und darauf aufbauend Deine eigenen 
Routinen schreibst. Anregungen kannst Du Dir ja von TI holen, aber Du 
musst damit rechnen, dass die auch nicht alles richtig und perfekt 
machen!

Hier zwei Links zu sehr detaillierten Product Manuals für MMC/SD von 
SanDisk:
http://wolverine.caltech.edu/referenc/SDMMCv52.pdf
http://wolverine.caltech.edu/referenc/SDSDv17.pdf

Weitere Fragen kommen dann von alleine :-)

von Mathias U. (munter)


Lesenswert?

Hallo Stefan,

da hast Du sicher Recht, ABER die SD_Card_Geschichte macht ungefähr nur 
1% der ganzen Arbeit aus.
Ich hätte gerne die Zeit, ALLES bis ins letzte Detail zu verstehen, aber 
irgendwann MUSS ich ja auch abgeben...
Ich möchte auch nicht einfach nur C&P anwenden; lernen möchte ich dabei 
schonwas...

mathias

von Mathias U. (munter)


Lesenswert?

@uli:

ich hab dir mal ne mail geschrieben...nur falls sie in deinem 
spam-ordner gelandet sein sollte...

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hallo, also die Schreibgeschichte läßt mich irgendwie nicht los...
es geht irgendwie nicht...

Ich habe mal einen Screenshot angehängt, bei dem mir etwas komisch 
vorkommt...

Zu sehen ist der logisch 0te Sektor meiner SD-Card. Warum die 
Nummerierung der physikalischen SektorNr. bei 237 weiß ich nicht. Weiß 
einer warum?

Das ist also sicher der MBR und die FAT-Einträge ganz am Anfang der 
Karte.

Was ich jetzt komisch finde, ist dass in der ASCII-Ansicht rechts steht:
"...Datentr„ger entfernenÿ Medienfehlerÿ Neustart: Taste drcken"

Was ist denn das für ein "Medienfehler".
Könnte das damit zu tun haben, dass mein MSP zwar was auf die Karte 
schreibt, und auch liest, denn die Variablen für erfolgreiches Schreiben 
und Lesen werden ja gesetzt, aber ich trotzdem die Daten nicht sehen 
kann?

Kann mir das einer erklären?

Ich verwende den Code von TI. (wurde etwas weiter oben schon gepostet)
Habe bis auf den hardwareseitigen Tausch von SOMI und SIMO, sowie die 
Änderung der Initialisierung:
statt:
1
for (i = 0; i <= 512; i++) buffer[i] = i;
habe ich
1
for (i = 0; i < 512; i++) buffer[i] = i;
gemacht, weil der Buffer ja nur 512 und nicht 513 Elemente aufnehmen 
kann.

Ich habe auch mal einen zweiten Buffer erstellt.
Es wird dann der Buffer von TI von der Karte gelesen und in meinen 
eigenen geschrieben. Macht er alles, so wie er soll...aber ich finde 
halt die Daten auf der Karte nicht...

Hat einer eine Idee?
danke

mathias

*edit: komisch finde ich ja auch, dass der "used space" bei null ist.
Wird also wirklich nichts vom MSP draufgeschrieben?

von holger (Gast)


Lesenswert?

>Zu sehen ist der logisch 0te Sektor meiner SD-Card. Warum die
>Nummerierung der physikalischen SektorNr. bei 237 weiß ich nicht. Weiß
>einer warum?

Ja, ich ;)

>Das ist also sicher der MBR und die FAT-Einträge ganz am Anfang der
>Karte.

Das ist nicht der MBR, das ist der Bootsektor der ersten
Partition. Und der liegt bei deiner Karte im Sektor 237.
Der MBR liegt im Sektor 0. Im MBR steht die Adresse deines
Bootsektors im Eintrag für die erste Partition.

von Seb (Gast)


Lesenswert?

Hallo,

Ich habe das Thema mit Interesse überflogen und wollte mal wissen, ob es 
nun jemand geschafft hat eine SD-Karte zu beschreiben und die Daten 
hinterher korrekt am Rechner auszulesen ?

Teilweise scheint die Sache recht tricky zu sein und ich stehe gerade 
vor der Entscheidung ein solches Projekt in Angriff zu nehmen.

von Wolfgang-G (Gast)


Lesenswert?

>nun jemand geschafft hat eine SD-Karte zu beschreiben und die Daten
>hinterher korrekt am Rechner auszulesen ?
Ja, das funktioniert, wobei ich den hier im Forum schon öfter 
beschriebenen Weg gegangen bin.
Die SD karte zunächst mit dem PC formatieren und irgendeine Datei auf 
die Karte kopieren, deren Größe der später gewünschten entspricht. Jetzt 
mit z.B. Winhex den 1. Sektor der Datei suchen und unter Verwendung der 
SLAA281.zip diesen Sektor und die folgenden beschreiben.

#define mmcWriteSector(sector, pBuffer) mmcWriteBlock(sector*512, 512, 
pBuffer)

mmcWriteSector(sector,mmc_buffer); // sector = Nr. des 1. Sektors

Um schneller ans Ziel zu kommen, habe ich zunächst alle Prüffunktionen 
usw. weggelassen und nur die obige Schreibfunktion verwendet.
MfG
Wolfgang

von Seb (Gast)


Lesenswert?

Also hast du kein FAT16 benutzt ?

Das klingt auf jeden Fall vielversprechend.

von Wolfgang-G (Gast)


Lesenswert?

>Also hast du kein FAT16 benutzt ?
ICH nicht.
Um aber die Karte vom Computer lesen zu können, wurde die Karte ja 
formatiert.
Dadurch befindet sich also eine FAT schon auf der Karte.
Für das Schreiben mit dem MSP430 ist dies aber nicht zwingend 
erforderlich.
MfG
Wolfgang

von Seb (Gast)


Lesenswert?

Hallo zusammen,

Der Anschluss einer µSD-Karte verläuft prinzipiell wie der einer 
normalen SD-Karte oder gibt es da irgendwelche Besonderheiten ?

von Mathias U. (munter)


Lesenswert?

Ich nehme an, die Pin-Belegung ist die Gleiche? Dann wirds wohl keine 
Probleme geben.

von Seb (Gast)


Lesenswert?

Ist das vielleicht auch der Grund warum ich kein Datenblatt für eine 
Micro-SD-Karte finde ? Kann mir da ggf. jemand aushelfen ?

Bei Scandisk bin ich nicht fündig geworden.

von Seb (Gast)


Lesenswert?

Ich schreibs einfach nochmal hier rein:

Mir ist gerade aufgefallen, dass die Micro-SD-Karten einen Anschluss 
weniger haben als die normalen SD-Karten. Leider kann ich immer noch 
kein Datenblatt für eine Micro-SD-Karte finden.

Fällt da einfach eine der beiden Vss oder was anderes weg ?

von Mathias U. (munter)


Lesenswert?


von Sebastian H. (baddy)


Lesenswert?

Ah, danke !

Genau so etwas habe ich gesucht.

von Seb (Gast)


Lesenswert?

Guten Morgen Zusammen,

Ich habe ein Problem mit dem Quelltext von TI. Nachdem ich die Fehler 
(Buffergröße, zu nutzender Sektor etc) beseitigt habe. Wird mir beim 
Debuggen ständig ein "Linking Error" ausgeworfen.
Gibt es vielleicht jemanden, der anfangs ebenfalls ein solches Problem 
hatte ?

Gruß

Seb

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.