www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Karte, Probleme mit CMD1


Autor: Stefan_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen,

Ich habe eine SD-Karte an einen Atmega128 mit Pegelwandler MAX3378 
angeschlossen und kann diese Karte nicht initialisieren(eine 32MB SD und 
eine microSD mit 2GB). Ich schicke via SPI das CMD0 und erhalte 0x01, 
das ist ja auch gut so ;-). Wenn ich nun die Karte Initialisieren möchte 
(CMD1) erhalte ich zuerst ein paar mal 0xff, dann einmal 0xfc und ein 
0x07 ab dann wieder 0xff.

Preudocode:
SPI_Init();
for i=0 to 15 //sync.
  SPI_put_char(0xff);
wait(5);//5s waiting
SPI_cs_enable(); //set cs low

SPI_put_char(0x40);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x95);
do
{
  answer=SPI_get_char();
}while(answer==0xff)

rs232_send_byte(answer);//PC rec. 0x01

SPI_put_char(0x41);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x01);
do
{
  answer=SPI_get_char();
  rs232_send_byte(answer);//PC rec. 0xff 0xff 0xff 0xfc 0x07 0xff 0xff (point of no return)
}while(answer!=0x00)



Hat jemand eine Idee? Was mache ich falsch?

glg,

Stefan

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin !

Gug mal hier rein ;)

http://www.captain.at/electronic-atmega-mmc.php

Gruß

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sendest auch 0xFF (andere Werte führen bein manchen Karten zu 
Fehlern) an die SPI, wenn du ein Byte empfangen willst?

Autor: Stefan_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

@Rex: wo liegt dort der unterschied zu meinem code? Das einzige was ich 
gesehen: Ich sende das CMD1 mit crc=0 und das Beispiel mit crc=0x7F. 
Weiters hole ich nach dem Senden von CMD1 immer nur ein Byte ab, in dem 
beispiel wird solange das CMD1 geschickt bis die richtige antwort kommt, 
habe ich beides bei mir auch verändert, dann kommt prinzipiell immer 
0xff und hinundwieder 0xfc oder oxfe.

@Gast: Ja ich schicke 0xff bei SPI_get_char();

lg,

Stefan

Autor: M. G. (looking)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan_h schrieb:
> SPI_put_char(0x41);
> SPI_put_char(0x00);
> SPI_put_char(0x00);
> SPI_put_char(0x00);
> SPI_put_char(0x00);
> SPI_put_char(0x01);

Probier mal bei CMD 0x41 im letzten Byte 0xFF zu senden statt 0x01.

Autor: Stefan_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gerade probiert, gleiches ergebnis.

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Command 1 :

Deine Version :

SPI_put_char(0x41);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x01);


Version Captain.at :

SPI_put_char(0x41);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0xFF);
SPI_put_char(0xFF);

Gruß

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich nun die Karte Initialisieren möchte (CMD1) erhalte
> ich zuerst ein paar mal 0xff, dann einmal 0xfc und ein
> 0x07 ab dann wieder 0xff.

Ich bin jetzt zu faul fuer dich das Datenblatt zu lesen, aber
soll es bei diesem Kommando denn zwei Bytes als Antwort geben?
Wenn nicht dann hast du wohl ein Problem auf niedrigstem Level,
also falscher SPI-Mode, Flankensteilheit, Reflexion auf dem Kabel.

Olaf

Autor: M. G. (looking)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Vorschlag:


...
rs232_send_byte(answer);//PC rec. 0x01

SPI_cs_disable(); //set cs high

SPI_put_char(0xFF);

SPI_cs_enable(); //set cs low
SPI_put_char(0x41);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0x00);
SPI_put_char(0xFF);
do
{
  answer=SPI_get_char();
  rs232_send_byte(answer);//PC rec.
}while(answer!=0x00)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du einen Pullup am DO der Karte? Wie schnell ist die Taktfrequenz 
des SPI?

Autor: Stefan_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Danke vielmals für die vielen antworten, es war eine Kombination aller 
Antworten.

Ich habe den Code so geändert:

do
{

  SPI_cs_disable(); //set cs high
  SPI_put_char(0xFF);
  SPI_cs_enable(); //set cs low

  SPI_put_char(0x41);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0xFF);
  do
  {
    answer=SPI_get_char();
  }while(answer==0xff);
  rs232_send_byte(answer);//PC rec.
}while(answer!=0x00)

Anscheinend muss das Commando immerwieder an die Karte geschickt werden 
und davor jedesmahl das CS auf High - ein 0xff schicken - und wieder CS 
wieder auf Low, dann das Commando schicken und auf die Anwort warten, 
die ist bei den ersten 2x 0x01 und beim dritten mal dann 0x00, also 
initialisiert. Warum das so ist, weiß ic nicht, lt. Datenblatt sollte es 
anders gehen, vieleicht hab ichs auch falsch verstanden. Egal.

Ich werd dann mal versuchen Daten zu schreiben und zu lesen, wenns nicht 
geht melde ich mich wieder ;-)

lg,

Stefan

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön dass es funktioniert :)

Anbei noch 2 Anmerkungen.


Stefan_h wrote :

>Anscheinend muss das Commando immerwieder an die Karte geschickt werden

Richtig , was der captain.at Code ja auch beinhaltet ?!

st: // if there is no MMC, prg. loops here
  if (Command(0x41,0,0,0xFF) !=0) goto st;


>und davor jedesmahl das CS auf High - ein 0xff schicken - und wieder CS
>wieder auf Low

Laut code (und eigener zurückliegender Erfahrung) ist es wichtig die 
clock Leitung am Anfang EINMAL high und dann wider low zu ziehen.
Das Timing was im code angegeben ist, muss eingehalten werden..also 80 
Clockzyklen:
  PORTB |= (1 << SPICS); // disable MMC
  // start MMC in SPI mode
  for(i=0; i < 10; i++) SPI(0xFF); // send 10*8=80 clock pulses
  PORTB &= ~(1 << SPICS); // enable MMC

Gruß

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry meine natürlich nicht die Clockleitung sonder CS ?!

Autor: Stefan_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Status ist im Moment folgender:

- Karte in Idle setzen geht
- Karte dann initialisieren geht auch

das wars dann schon :-(

Habe dann versucht 512 Bytes auf die Karte zu schreiben:
do
{
   SPI_put_char(0xFF);
   SPI_put_char(0x58);
   SPI_put_char(0x00);
   SPI_put_char(0x00);
   SPI_put_char(0x02);
   SPI_put_char(0x00);
   SPI_put_char(0xFF);
   answer=SPI_get_char();
}while(answer==0xFF);//CMD write block

rs232_send_hex(answer);//PC rec. 0x00
SPI_put_char(0xff);
SPI_put_char(0xff);
SPI_put_char(0xfe);//start block
for(i=0;i<512;i++)
{
  SPI_put_char(0xAA);//block
}
SPI_put_char(0xff);//dummy
SPI_put_char(0xff);//dummy
do
{
  answer=SPI_get_char();
  rs232_send_hex(answer);
}while(answer==0xFF);

answer&=0x1f;
rs232_send_hex(answer);//should be 0x05
do
{
  answer=SPI_get_char();
}while(answer!=0xFF);


Statt den zu erwartenden 0x05 kommt meist was anderes konnte kein Muster 
erkennen. Hatte aber schon einmal 0x05!

habe einmal versucht die Bocklänge zu setzen, erhalte als antwort nie 
0x00, meist 0x03 oder 0x01 ...:
SPI_Disable();
SPI_PutChar(0xFF);
SPI_Enable();
do
{
  SPI_put_char(0x50);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0x00);
  SPI_put_char(0xFF);
  do
  {
    answer=SPI_get_char();
  }while(answer==0xFF);
}while(answer!=0x00);

Habe auch schon viele codebeispiele(http://www.captain.at, 
http://www.captain.at, uvm) ausprobiert, CMD1 geht weiter komme ich 
nicht.

Ideen?

glg,

Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.