SD-Card Probleme

OP #880950
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
Angehängte Dateien:
OP
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.
Gast
>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.
OP
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).
Gast
>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.
Gast
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
OP
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.
Gast
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.
OP
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.
OP
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 ...
OP
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.