Forum: Mikrocontroller und Digitale Elektronik SD-Card Probleme


von Pete K. (pete77)


Angehängte Dateien:

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.

1
//############################################################################
2
//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
3
unsigned char mmc_init ()
4
//############################################################################
5
{
6
  unsigned int Timeout = 0;
7
  
8
  //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
9
  MMC_Direction_REG &=~(1<<SPI_DI);      //Setzen von Pin MMC_DI auf Input
10
  MMC_Direction_REG |= (1<<SPI_Clock);    //Setzen von Pin MMC_Clock auf Output
11
  MMC_Direction_REG |= (1<<SPI_DO);      //Setzen von Pin MMC_DO auf Output
12
  MMC_Direction_REG |= (1<<MMC_Chip_Select);  //Setzen von Pin MMC_Chip_Select auf Output
13
  MMC_Direction_REG |= (1<<SPI_SS);  
14
  MMC_Write |= (1<<MMC_Chip_Select);      //Setzt den Pin MMC_Chip_Select auf High Pegel
15
16
  for(unsigned char a=0;a<200;a++){
17
  nop();
18
  };    //Wartet eine kurze Zeit
19
20
  #if SPI_Mode
21
    //Aktiviren des SPI - Bus, Clock = Idel LOW
22
    //SPI Clock teilen durch 128
23
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); //Enable SPI, SPI in Master Mode  
24
    SPSR = (0<<SPI2X);
25
  #endif
26
uart_puts("init 1");  
27
  //Initialisiere MMC/SD-Karte in den SPI-Mode
28
  for (unsigned char b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte
29
    {
30
    mmc_write_byte(0xff);
31
    }
32
  
33
  //Sendet Commando CMD0 an MMC/SD-Karte
34
  unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
35
  while(mmc_write_command (CMD) !=1)
36
  {
37
    if (Timeout++ > 200)
38
      {
39
      MMC_Disable();
40
      uart_puts("Abbruch bei Commando1 (Return Code1)");
41
      return(1); //Abbruch bei Commando1 (Return Code1)
42
      }
43
  }
44
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

von Benedikt K. (benedikt)


Lesenswert?

JTAG Fuse gesetzt ?

von Pete K. (pete77)


Lesenswert?

JTAG Fuse ist disabled. Der 1-Wire an PC3 funktioniert.

von Benedikt K. (benedikt)


Lesenswert?

Ich würde mal vermuten die LED am CS stört.

von Pete K. (pete77)


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.

von holger (Gast)


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.

von Pete K. (pete77)


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).

von holger (Gast)


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.

von Volker (Gast)


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

von Pete K. (pete77)


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.

von Pete K. (pete77)


Lesenswert?

1Mhz geht auch nicht, gleiches Fehlerbild.

von holger (Gast)


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.

von Pete K. (pete77)


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.

von Pete K. (pete77)


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.

von Pete K. (pete77)


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:
1
  //Sendet Commando CMD0 an MMC/SD-Karte
2
  unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
3
  while(mmc_write_command (CMD) !=1)
4
  {
5
    if (Timeout++ > 200)
6
      {
7
      MMC_Disable();
8
      return(1); //Abbruch bei Commando1 (Return Code1)
9
      }
10
  }

Latinum ad endum ...

von Pete K. (pete77)


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.
1
//############################################################################
2
//Sendet ein Commando an die MMC/SD-Karte
3
unsigned char mmc_write_command (unsigned char *cmd)
4
//############################################################################
5
{
6
  unsigned char tmp = 0xff;
7
  unsigned int Timeout = 0;
8
9
  //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) 
10
  MMC_Disable();
11
_delay_us(2);
12
  //sendet 8 Clock Impulse
13
  mmc_write_byte(0xFF);
14
_delay_us(2);
15
  //set MMC_Chip_Select to low (MMC/SD-Karte Aktiv)
16
  MMC_Enable();
17
_delay_us(2);
18
  //sendet 6 Byte Commando
19
  for (unsigned char a = 0;a<0x06;a++) //sendet 6 Byte Commando zur MMC/SD-Karte
20
    {
21
    mmc_write_byte(*cmd++);
22
    }
23
24
  //Wartet auf ein gültige Antwort von der MMC/SD-Karte
25
  while (tmp == 0xff)  
26
    {
27
    tmp = mmc_read_byte();
28
    if (Timeout++ > 500)
29
      {
30
      break; //Abbruch da die MMC/SD-Karte nicht Antwortet
31
      }
32
    }
33
  return(tmp);
34
}

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.