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
Ich habe sowas mal vor einiger Zeit gemacht: http://random.linux-site.net/files/unsorted/kartenleser_ti/
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.
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
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.
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
falls du mir dein code rüber schickst (per email)dann kannst du s gern machen
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.
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.
es zeigt diese WARNING: variable "C" was declared but never referenced. '' "rvalue" '' '' '' '' . '' "i" '' '' '' '' '' .
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.
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??
Was genau funktioniert nicht? Mit einem Oszilloskop sieht man ja, ob die Daten übertragen werden oder nicht.
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; }
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.
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.
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.
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,
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.
ti hat eine appnote zum msp430 + mmc/sd gemacht!!! http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slaa281&fileType=pdf (doku) http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slaa281&fileType=zip (code) vielleicht hilft es ja ;-)
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.
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, ...
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.
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
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 ;-)
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.
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)
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.
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.
@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
@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
@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)
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.