Forum: Mikrocontroller und Digitale Elektronik Probleme mit MSP430 und MMC


von TheMason (Gast)


Lesenswert?

Hallo

ich versuche nun schon seit Wochen meine blöde MMC Karte an einem MSP
ans laufen zu bringen. Habe den Quellcode von Ulrich Radig verwendet
und für den MSP angepasst. Mein Problem ist aber das die
Initialisierung schon nicht hinhaut.
Ich verwende die Port-Pinne 1.3 bis 1.6 in der Reihenfolge für CS, DO,
CLK und DI. SPI mache ich SW-mässig. Die Geschwindigkeit liegt im kHz
bereich da ich sehr lange warte. (Verzweiflungstat)
Die Datenrichtung sollte richtig gesetzt sein (bei DI wird der Pin erst
noch auf High). Das Selektionsregister für Port 1 steht auf "alle als
GPIO" nutzen. Wenn ich aber nun Daten einlesen möchte bekomme ich nur
FF zu lesen. Selbst wenn ich den DI-Pin auf 0 zwangssetze (Brücke an
den Pins) liest der mir noch ne 1 ein. Was mache ich falch ?

Gruß
Rene

von Rolf F. (Gast)


Lesenswert?

Ich habe sowas mal vor einiger Zeit gemacht:

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

von didi (Gast)


Lesenswert?

hallo THE MASON;
hast du s hinbekommen?
ich habe auch das gleiche problem, hast du den CODE noch? du hast  es
angepasst auf msp430.? kannst du s mir geben?
danke dir.

von didi (Gast)


Lesenswert?

hallo ROLF;
hast du den code was du im link gegeben hast geschrieben? wenn ja? hat
s funktioniert?
bei mir bekomme ich nichts zu lesen, ich habe A und B geschreiben aber
ich bekomme nix zu lesen. woran kann das liegen??
danke

von Rolf F. (Gast)


Lesenswert?

Das kann daran liegen, dass versucht wird weniger als 512 Byte zu
schreiben oder an einer Adresse, die nicht n*512 ist oder an zu wenigen
Wartezyklen.
Die online-Version hat mit einigen Karten funktioniert, aber andere
brauchen mehr Wartezyklen.
Es muss auch die Versorgungsspannung stimmen, also bei 3,3 V liegen.

von didi (Gast)


Lesenswert?

halo ROLF;
ICH BENUTZE msp430, PORT 6 also genau wie im beispiel.
habe auch 8 MHZ quarz, und 3v3. mal die frage, hast du nichts geändert
an dem CODE? die initialiesierung der PORTS? oder der SPI?
weil ich sehe hier in dem code wurde 2 mal den Port 5 und auch PORT4
initialisiert? bitte um hilfe
danke

von didi (Gast)


Lesenswert?

ich meine MSP430, und Port 5 für die SPI und nicht PORT6.

von didi (Gast)


Lesenswert?

falls du mir dein code rüber schickst (per email)dann kannst du s gern
machen

von Rolf F. (Gast)


Lesenswert?

Der Code ist ungeändert und er lief bei Ti und bei mir.
Das Problem ist, dass im Standard einige Wartezeiten nicht limitiert
sind und einige Karten längere Wartezeiten brauchen.

von didi (Gast)


Lesenswert?

gibt s ein software wo man sehen kann dass die karte läuft( so wie hyper
terminal für UART), so was ähnliches für SD card? dass man weisst dass
der code mit der karte funktioniert.

von didi (Gast)


Lesenswert?

es zeigt diese WARNING:
variable "C" was declared but never referenced.
   ''    "rvalue"   ''     ''    ''    ''     .
   ''    "i"  ''     ''    ''    ''    ''     .

von Rolf F. (Gast)


Lesenswert?

Wer Warnungen/Fehler findet, darf sie behalten ...

Der Code war für IAR 1.x und lief damit ohne Fehler/Warnungen.
Für ein paar hundert EUR (nur 499) gibt's von mir auch eine aktuelle
Version die mit jeder bekannten Karte funktioniert und sowohl mit
mspgcc als auch crossworks läuft und die auch mit IAR laufen sollte.
Gegen Aufpreis auch mit SDS (Simple Data Store, einfaches Dateisystem),
Power-Management (Ein-/Ausschalten der Karten-Versorgung) und Support
;-)

Zum Testen/Entwickeln kann man einfach einen Kartenleser nehmen und z.
B. mit dd direkt auf die Karte zugreifen und die Daten lesen/schreiben.

von didi (Gast)


Lesenswert?

ich mache praktikum, und soviel geld habe ich nicht. ich dachte es gibt
irgendein sofware dafür.
ich kann nicht mit diesem programm schreiben, was kann falsh sein. ?der
buchstabe wird in mmcbuffer geschreiben und mehr nicht, weil da der
programm zu ende geht....
kann mir jemand helfen??

von Rolf F. (Gast)


Lesenswert?

Was genau funktioniert nicht?
Mit einem Oszilloskop sieht man ja, ob die Daten übertragen werden oder
nicht.

von didi (Gast)


Lesenswert?

die 'A' wird in dem mmcbuffer gespeichert, und hier:

// Fill first Block (0) with 'A'
memset(&mmc_buffer,'A',512);


   aber hier bei diesem befehl bricht der programm ab.
//set breakpoint and trace mmc_buffer contents

      mmcWriteBlock(0x00);

und genauer hier in diesem funktion:

char mmcCheckBusy(void)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;
  char rvalue;
  while(i<=64)
  {
    response=spiSendByte(0xff);
    response &= 0x1f;
    switch(response)
    {
      case 0x05: rvalue=MMC_SUCCESS;break;
      case 0x0b: return(MMC_CRC_ERROR);
      case 0x0d: return(MMC_WRITE_ERROR);
      default:
        rvalue = MMC_OTHER_ERROR;
        break;
    }
    if(rvalue==MMC_SUCCESS)break;
    i++;
  }
  i=0;
  do
  {
    response=spiSendByte(0xff);
    i++;
  }while(response==0);
  return response;
}

von didi (Gast)


Lesenswert?

oder besser gesagt was sendet die karte als erstes??

von Rolf F. (Gast)


Lesenswert?

Also das Programm kann nicht abbrechen; das läuft mit einer
Endlos-Schleife, aus der es nicht rauskommt mangels
break/goto/longjmp.
Es kann höchstens der Debugger stehen bleiben, aber da das Debuggen
häufig die UART-Kommunikation stört, kann es gut sein, dass mit
Debugger nichts geschrieben werden kann.

Man sich da mit einem manuellen Breakpoint behelfen, bei dem a) alle
IRQs gesperrt werden und b) mit LED-Blinken das Erreichen angezeigt
wird. Damit erkennt man, ob die betreffende Stelle (logischerweise darf
man nur eine verwenden) erreicht wurde.

von didi (Gast)


Lesenswert?

halo Rolf,
kannst du mir bitte erklären was diese funktion macht?:
mmcCheckBusy(void)....
weil wenn ich mit dem breakpoint hier ankomme dann geht der program zu
ende.
noch was!! wenn ich die 'A' sende muss ich 0101 als antwort bekommen
ist das richtig?
und nochmaleweise muss danach die 'B' gesendet werden, aber das
passiert nicht.
beim erkennen der karte habe ich das geschreiben:
while (P5IN&0x01)........ sonst komme ich nicht ein in der programm.
danke nochmal für deine mühe.

von Rolf F. (Gast)


Lesenswert?

mmcCheckBusy wird nur nach dem Schreiben von Daten verwendet, um auf
eine Antwort der Karte zu warten. Das dauert so lange, wie die Karte
beschäftigt (busy) ist.
Statt
(i<=64)
sollte dort besser
(i<=1000)
stehen.
Und die nachfolgende Schleife stellt man besser auf eine for-Schleife
mit timeout um.

von didi (Gast)


Lesenswert?

unsigned char spiSendByte(const unsigned char data)
{
  while ((IFG2&UTXIFG1) ==0);                     // wait while not
ready / for RX
  TXBUF1 = data;                                  // write
  while ((IFG2 & URXIFG1)==0);                    // wait for RX buffer
(full)
  return (RXBUF1);
}
**********************************
ich habe gemerkt dass RXBUF1 ist immer gleich 0 ist, deshalb bei
vergleichen der response mit RXBUF1, kommt nicht mehr raus aus der
while schleife,

von Rolf F. (Gast)


Lesenswert?

Da kann man ein Timeout reinsetzen:

i=0;
while (!(IFG2 & URXIFG1) and (i++ < DEADLINE)); // USART1 RX buffer
ready? With timeout.

Aber normalerweise bedeutet es, das keine Daten ankommen.

von KoF (Gast)


Lesenswert?


von Rolf F. (Gast)


Lesenswert?

Aha, das ist ja ursprünglich mein MMC-Code, der von Ti überarbeitet
wurde, weil die Karten nicht nach dem Standard arbeiten.
Da hat Ti ja nur gut zwei Jahre gebraucht, um daraus eine Appnote zu
machen.

von KoF (Gast)


Lesenswert?

hmm...

hast du den code den freigegeben? ;-) (gpl,...)

ps ti hat in letzter zeit eh viele appnotes freigegeben... kann ja
sein, das man jetzt die ganze supports ausgewertet hat ;-)

z.b. zigbee, usb, ir, ...

von didi (Gast)


Lesenswert?

ok ich schau mal nach der seite.
ist der code dann richtig? und die schaltung auch? oder muss man da was
ändern...
bei mir ist der CS immer auf high.

von TheMason (Gast)


Lesenswert?

wow,

ihr schafft das ja alle ne SD-Karte anzusprechen bzw. zu nutzen. Ich
habs immer noch nicht geschafft, schiebe es aber immer noch vor mich
her, obwohl ich es demnächst mal wieder angehen werde (aufgeschoben ist
ja nicht aufgehoben :-)), hab aber im moment noch viele andere
interessante sachen zu machen)

gruß
rene

von KoF (Gast)


Lesenswert?

jaja die zeit...

was man mit mehr von ihr nicht alles anstellen würde können.
mir fallen spontan mind. 10 interessante dinge ein, für die ich jetzt
keine zeit habe.


@ didi
ich würde mal davon ausgehen, das die ti-leute genau wissen, was sie
tun ;-)

von Rolf F. (Gast)


Lesenswert?

Ja, die Application note sollte problemlos sein, wobei aber dort ein MC
mit deutlich mehr als den originalen 2 kB verwendet wird.
Der Code ist damals freigegeben worden, also public domain, da es ohne
Ti nicht fertig geworden wäre.
Allerdings ist der Code danach noch erweitert worden mit zusätzlichen
Wartezyklen und ich habe auch timeouts eingebaut, damit die Software
nicht irgendwo hängen bleibt.

von KoF (Gast)


Lesenswert?

bezüglich der 2kB... hast du da einen der f161x serie genommen, oder
hast du dir extern ram rangebastelt?

mich würde auch einmal der datendurchsatz interessieren (raw/oder in
ein format (fat16/32)

von Rolf F. (Gast)


Lesenswert?

Original waren da 2 kB RAM, wobei 1 kB vom MMC-Treiber belegt wird.
Der Durchsatz war um 30 kB/s, trotz 8 MHz Quarz, aber viele Messungen
wurden nicht gemacht.

von didi (Gast)


Lesenswert?

hat jemand FAT für msp430 mmc? danke

von Staiger Holger (Gast)


Lesenswert?

Hallo zusammen,

ich will nun auch eine MMC-Karte mit FAT ansteuern. Hat irgendjemand
nun schon funktionieren Code für den MSP430?

Wenn nicht werd ich nun probieren den Code von Ulrivh Radig zu
portieren.

von TheMason (Gast)


Lesenswert?

@holger

also mein code ist bei weitem noch nicht fertig.

aber zum ansprechen der sd/mmc karte kannst du die APP-Note von TI
nutzen. die habe ich auch benutzt und funktioniert einwandfrei.
als weiteren code (fat16/fat32) kannst du die routinen von

- ulrich radig

- stefan seegel

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

- roland siegel

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

oder irgend jemand anderem benutzen. Mußt halt nur anpassungen machen.
aber laufen sollte es auf jeden fall.
Ich selbst wollte mir meine eigenen routinen schreiben (just to meet
the challenge). Bin aber zum einen noch nicht so weit und zum zweiten
wird mein code nicht so leicht verständlich sein wie die der anderen,
da ich noch einige erweiterungen vor habe.

gruß
rene

von Staiger Holger (Gast)


Lesenswert?

@rene
Das ist mal ne schnelle Antwort.

Hab schon angefangen den Code von Ulrich Radig zu portieren. Die
MMC-Karte wird auch schon erkannt. Allerdings kann ich noch keine
Ordner oder Dateien lesen. Hab wohl noch Fehler in der portierung
gemacht.
Leider fehlt mir im Moment noch das Wissen über Cluster, Volume
Boot Record usw..... Deswegen ist es noch ein wenig schwierig mit
der Fehlersuche.

Wenn Du mal den Code fertig hast, meld Dich.

gruß
Holger

von TheMason (Gast)


Lesenswert?

@holger

kann ich machen. aber bei mir wird es bestimmt noch dauern, da ich auch
neu in die thematik einsteige und noch viele ungeklärte fragen habe.

aber bei fragen zum thema cluster, volume/master boot record, fat
einträge würde ich hier mal im forum suchen. hab alle meine bisherigen
infos auch von hier, meist in dem ich mir mal die quelltexte der
anderen angeguckt hab, wie die das aufgebaut haben.
und bis jetzt klappt alles (zwar nur bestimmung der start-sektoren für
vbr/fat/dir/datei, und einzelne datei-einträge lesen, ohne lange
dateinamen)

von markus (Gast)


Lesenswert?

@TheMason
"...APP-Note von TI nutzen." die haben ja in Ihrer Dokumentation
DI/DO vertauscht !!
-- da haben Die wohl vom Orignalschreiber den Fehler kopiert.

Ich habe zu dem aber noch eine Frage hinsichtlich auslesen
Bootpartition der SD/MMC Karte, wenn diese von WindoofsXP oder orignal
vom Hersteller kommt:

Bei 'stefan seegel' und 'roland siegel' sehe ich ein einfacher
Zugriff auf Sektor 0. Bei mir seh ich nur normale Daten, kein 'magic'
AA55 und der Bootpartition ähnlich. Die Lese-/Schreibfunktionen
funktionieren soweit und kann dies auch positiv testen (habe die
Orginal TI-Funktionen genommen).
Ich habe das Gefühl daß die Karte hier mit einem Offset arbeitet. Kann
es sein dass dies mit dem 'RCA-Register' der SD-Karte zusammenhängt?
Adressoffset 16Bit?

Hat da jemand eine Idee?


danke für eure hilfe
gruss markus

von markus (Gast)


Lesenswert?

hat sich inzwischen erledigt!

Unter Linux konnte ich die beiden Karten ebenfalls nicht mehr
ansprechen -- mit einem Win2000-system und einem externen Multireader
war es doch noch möglich diese mit FAT32 bzw. FAT16 zu formatieren. Der
Startsector sieht nun so aus wie er soll -- mit dem 'WinHex' -- konnte
ich das nun verifizieren.
Mit dem MSP430 seh ich diesen Sektor nun ebenfalls -- war mit meine
Frage leider zu früh..

gruss markus

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.