mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Card Probleme


Autor: Pete K. (pete77)
Datum:
Angehängte Dateien:
  • preview image for sd.PNG
    sd.PNG
    174 KB, 836 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mit der beiliegenden Schaltung an einem M324P eine SD-Card 
angeschlossen.

Die Ansteuerung erfolgt mit dem Code von Ulrich Radig in der neuesten 
Version 2_7.

//############################################################################
//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
unsigned char mmc_init ()
//############################################################################
{
  unsigned int Timeout = 0;
  
  //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
  MMC_Direction_REG &=~(1<<SPI_DI);      //Setzen von Pin MMC_DI auf Input
  MMC_Direction_REG |= (1<<SPI_Clock);    //Setzen von Pin MMC_Clock auf Output
  MMC_Direction_REG |= (1<<SPI_DO);      //Setzen von Pin MMC_DO auf Output
  MMC_Direction_REG |= (1<<MMC_Chip_Select);  //Setzen von Pin MMC_Chip_Select auf Output
  MMC_Direction_REG |= (1<<SPI_SS);  
  MMC_Write |= (1<<MMC_Chip_Select);      //Setzt den Pin MMC_Chip_Select auf High Pegel

  for(unsigned char a=0;a<200;a++){
  nop();
  };    //Wartet eine kurze Zeit

  #if SPI_Mode
    //Aktiviren des SPI - Bus, Clock = Idel LOW
    //SPI Clock teilen durch 128
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); //Enable SPI, SPI in Master Mode  
    SPSR = (0<<SPI2X);
  #endif
uart_puts("init 1");  
  //Initialisiere MMC/SD-Karte in den SPI-Mode
  for (unsigned char b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte
    {
    mmc_write_byte(0xff);
    }
  
  //Sendet Commando CMD0 an MMC/SD-Karte
  unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
  while(mmc_write_command (CMD) !=1)
  {
    if (Timeout++ > 200)
      {
      MMC_Disable();
      uart_puts("Abbruch bei Commando1 (Return Code1)");
      return(1); //Abbruch bei Commando1 (Return Code1)
      }
  }
uart_puts("init 2");

Ich benutze Software_SPI, die PIN-Belegung habe ich entsprechend 
eingetragen.

Das Programm findet die Karte nicht und zeigt mir kein "init2".

Eine Überprüfung des CS-Signals nach "MMC_Write |= 
(1<<MMC_Chip_Select);" brachte nur 1,6V, ist das nicht etwas wenig ?

Pete

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG Fuse gesetzt ?

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG Fuse ist disabled. Der 1-Wire an PC3 funktioniert.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal vermuten die LED am CS stört.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe noch einmal alles durchgemessen. Die LED hatte ich schon 
abgelötet.

Nach dem Nachlöten einer Lötstelle am M32 bekomme ich auch 3,21V am /CS 
Pin.

Das Programm erkennt die Karte (und eine Zweite) aber immer noch nicht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Programm erkennt die Karte (und eine Zweite) aber immer noch nicht.

Weitere Lötfehler ?

Was für Karten sind das denn ?
Eventuell ist der Code zu einfach für diese Karten gehalten.
Nicht alle Karten antworten grundsätzlich auf CMD1.

An welcher Stelle klemmt es denn ? Bei CMD0 oder CMD1 ?

Und ich mag es kaum sagen (weil ich dann gleich haue bekomme ;) :
Mit richtigen Pegelwandlern könnte es besser werden.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Pegelwandler :-) Muss mir wohl doch mal einen max3378 bestellen, 
aber die Platine ist jetzt bestückt.

Eine Alternative ist noch, alles mit 3,3V zu betreiben, aber das wäre 
wirklich die letzte Möglichket, die ich nutzen möchte, weil noch ein LCD 
angeschlossen werden soll.

Karten: Ich habe eine 32MB MMC, 2GB SD, 16MB SD sowie eine 64MB MiniSD 
getestet.

Ausstieg ist bei dem CMD0 Kommando (return code 1).

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ausstieg ist bei dem CMD0 Kommando (return code 1).

Da würde ich doch erst mal weiter Lötstellen kontrollieren.
Schreib dir einfach mal ein kleines Programm was nichts
anderes macht als die Leitungen zur Karte (einzeln) auf 1 zu setzen.
Dann nachmessen ob es pegelmässig passt.

Ein anderes Problem könnte die Software SPI sein.
Beim Init ist die möglicherweise zu schnell.
Versuchs mal mit dem kleinsten möglichen internen Takt vom ATmega.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Widerstandspannungsteiler: Böse Böse ! Ich hatte das gleiche Problem. 
Hier http://www.shop.display3000.com/pi8/pi14/pd102.html (nach unten 
scrollen) ist das Problem gut visualisiert.

Überbrücke doch einfach mal die Widerstände (oder löte zumindest die 
Widerstände gegen Masse raus) und lass das Board mit 3,3 Volt laufen.
Dann geht es bestimmt. 16 Mhz werden evtl. eng, stell dann erstmal auf 8 
Mhz.

Volker

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt den Takt auf 8Mhz heruntergenommen und die Ports auf 1 
gesetzt.  Das klappt soweit.

Ich verwende folgendes Mapping:
#define SPI_DI  7 //Port Pin an dem Data Output der MMC/SD-Karte 
angeschlossen ist
#define SPI_DO  5 //Port Pin an dem Data Input der MMC/SD-Karte 
angeschlossen ist
#define SPI_Clock 6 //Port Pin an dem die Clock der MMC/SD-Karte 
angeschlossen ist (clk)
#define MMC_Chip_Select  4 //Port Pin an dem Chip Select der 
MMC/SD-Karte angeschlossen ist
#define SPI_SS  2 //Nicht Benutz muß aber definiert werden

Werde noch einmal 1Mhz probieren.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1Mhz geht auch nicht, gleiches Fehlerbild.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eine Massefläche unter dem MMC/SD Sockel ?
Damit hab ich mir auch schon mal selber ein Bein gestellt.
Wenn man die Karte reinschiebt gehen bei einigen Sockeln die
Kontakte runter bis auf die Platine.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, keine Massefläche.

Bei 3,3V macht mein max232 schlapp. Leider habe ich kein max3232 hier 
liegen :-(

Somit sind die debug-Möglichkeiten etwas eingeschränkt.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:
Nicht der MAX232 macht schlapp, sondern der M324P. Wenn man die 
Brown-Out-Detection auf 2,7V herabsetzt geht sogar ein max232 noch ein 
bischen :-)

(indietischplattebeiss)

Die SD-Karte geht aber trotzdem nicht ... Gleiches Fehlerbild.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nach langer Pause habe ich mal wieder obiges Problem untersucht.

Ich habe alles auf 3,3V umgestellt und noch einen Kondensator (100nF) 
direkt an den Kartenslot zwischen 3,3V und GND gelötet.

Außerdem habe ich auf die aktuelle Version 2.9 von Ulrich Radig 
umgestellt und einen 7,37 Mhz Quarz eingelötet.

Den Sockel habe ich etwas angehoben und auf Kurzschlüsse überprüft.

Beim Einschalten leuchtet die LED4 an CS, also ein Zugriff findet wohl 
statt.

Bei dem folgenden Code aus der mmc.h steigt das Programm aus. Ich 
verwende Software SPI:
  //Sendet Commando CMD0 an MMC/SD-Karte
  unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
  while(mmc_write_command (CMD) !=1)
  {
    if (Timeout++ > 200)
      {
      MMC_Disable();
      return(1); //Abbruch bei Commando1 (Return Code1)
      }
  }

Latinum ad endum ...

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elektrisch scheint die Karte richtig angeschlossen zu sein. Ich habe die 
Pins an der SD-Karte jeweils einzeln gesetzt und wieder auf Low gezogen, 
das hat funktioniert.

In den write routinen haben ich nach jeden Setzen des Signals ein 
_delay_us(2) eingefügt, hat aber auch keine positive Wirkung gezeigt.
//############################################################################
//Sendet ein Commando an die MMC/SD-Karte
unsigned char mmc_write_command (unsigned char *cmd)
//############################################################################
{
  unsigned char tmp = 0xff;
  unsigned int Timeout = 0;

  //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) 
  MMC_Disable();
_delay_us(2);
  //sendet 8 Clock Impulse
  mmc_write_byte(0xFF);
_delay_us(2);
  //set MMC_Chip_Select to low (MMC/SD-Karte Aktiv)
  MMC_Enable();
_delay_us(2);
  //sendet 6 Byte Commando
  for (unsigned char a = 0;a<0x06;a++) //sendet 6 Byte Commando zur MMC/SD-Karte
    {
    mmc_write_byte(*cmd++);
    }

  //Wartet auf ein gültige Antwort von der MMC/SD-Karte
  while (tmp == 0xff)  
    {
    tmp = mmc_read_byte();
    if (Timeout++ > 500)
      {
      break; //Abbruch da die MMC/SD-Karte nicht Antwortet
      }
    }
  return(tmp);
}

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.