Forum: Mikrocontroller und Digitale Elektronik SD-Karte wird nicht erkannt


von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe schonmal einen Thread dazu geöffnet 
(Beitrag "SD-Karte wird nicht erkannt NetIO"), aber da der 
schon so lange ausser Betrieb war, denke ich macht es Sinn einen neuen 
zu Eröffnen. Sollte das nicht erwünscht sein, einfach löschen....:

Hi,
ich habe es immer noch nicht hin bekommen, ich habe jetzt den Adapter
(http://www.exp-tech.de/Shields/Itead-SD-MICRO-SD-B...)
erhalten und angeklemmt, siehe Bild. Ich benutze die Programmcodes im
Anhang und meine main sieht im Gunde so aus...(s.unten):

Hat noch jemand eine Idee warum das nicht gehen kann? Habe ich noch
einen Klemmfehler, eventuell erkenn man das auf den Bildern....

Es ist doch richtig, dass der "SPI_DI" an den DO des SD-Karten Adapters
geht, oder?
Dieser zehnpolige stecker an dem SD-Kartenhalter geht auf die "EXT"
Klemme des Net-IO (Klemmplanauszug im Anhang)
1
#define SPI_DI        6    //Input Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist

Auszug aus der main:
1
int main(void)
2
{      
3
4
    usart_init0(BAUDRATE);     // setup the UART0
5
  usart_init1(BAUDRATE);     // setup the UART1
6
7
8
  //Initialisierung der MMC/SD-Karte
9
  usart_writePC("System Ready!\r\n");  
10
  while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten
11
    {
12
    usart_writePC("** Keine MMC/SD Karte gefunden!! **\n");  
13
    }
14
  usart_writePC("Karte gefunden!!\n");
15
  
16
  fat_init();//laden Cluster OFFSET und Size
17
  //Initialisierung der MMC/SD-Karte ENDE!
18
19
  unsigned char Buffer[512];
20
  unsigned int tmp;
21
  
22
  mmc_read_csd (Buffer);
23
  
24
  for (tmp = 0;tmp<16;tmp++)
25
    {
26
    usart_writePC("%x ",Buffer[tmp]);
27
    };
28
29
30
  //Ausgabe des Root Directory
31
  unsigned int Clustervar;
32
  unsigned char Dir_Attrib = 0;
33
  unsigned long Size = 0;
34
  usart_writePC("\r\nDirectory\r\n");
35
  for (char a = 1;a < 240;a++)
36
  {
37
    Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
38
      if (Clustervar == 0xffff)
39
      {
40
        break;
41
      }
42
    tmp = (Size & 0x0000FFFF);
43
    usart_writePC("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib);
44
    usart_writePC("%s",Buffer);
45
    usart_writePC("\r\n");
46
  }
47
  usart_writePC("\r\nDirectory Ende\r\n");
48
49
  //Lade Cluster für das index.htm File in den Speicher 
50
  Clustervar = 0;//suche im Root Verzeichnis
51
  if (fat_search_file((unsigned char *)"mmc.txt",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
52
    {
53
    usart_writePC("\nFile Found!!\r\n");
54
    //Lese File und gibt es auf der seriellen Schnittstelle aus
55
    for (int b = 0;b<52;b++)
56
      {
57
      fat_read_file (Clustervar,Buffer,b);
58
      for (int a = 0;a<512;a++)
59
        {
60
        usart_writePC("%c",Buffer[a]);
61
        }
62
      }
63
    }
64
65
  usart_writePC("FERTIG!!\r\n");  
66
67
68
69
70
71
72
73
74
//Konfiguration der Ausgänge bzw. Eingänge
75
  //definition erfolgt in der config.h
76
  
77
  //1=OUTPUT / 0=INPUT -> Bei 0 (Eingang) mit Portx den Pullup aktivieren 
78
  
79
  DDRA = OUTA; //Eingang
80
  DDRC = OUTC;
81
82
  // Pullups einschalten PortA  1 Pull up aktiv = Eingang 
83
  PORTA |= (1 << PORTA0) | (1 << PORTA1) | (1 << PORTA2) | (1 << PORTA3);
84
85
86
  //DDRB  &= ~(1 << DDB1);   // Pin B1 (Pollin Prog.-Jumper) als Eingang definieren
87
  //PORTB |= (1 << PORTB1);  // Pullup einschalten PortB1
88
  
89
  
90
  eepvar_init();        // Grundeinstellungen einlesen
91
  
92
    com74hc595_init();
93
....

: Bearbeitet durch User
von Flomann (Gast)


Lesenswert?

An welcher stelle hakt es denn überhaupt....

<"Es ist doch richtig, dass der "SPI_DI" an den DO des SD-Karten 
Adapters
geht, oder?">

Ist Okay

Deine verwendeten Routinen im Bereich Initialisierung sind schon
arg rudimentär und weit weg von dem aktuellen Init Flow..
Schaue dir die Spec auf der SDA Seite an, Kapitel 7 im Physical Layer 
Part.

Die Software SPI Routinen haben den Clk Idle High, zusammen mit
Latch Positiv Edge und Shift Negativ Edge wäre das SPI Mode3,
(Die HW SPI Schnittstelle ist laut kommentar Clk IDLE Low)
kann wohl funktionieren.. Selbst nutze ich für SD an SPI Clk und Phase 0
also SPI Mode0(aber in HW), meine dies auch so der SD Spec entnommen zu 
haben...

Wie dem auch sei wo hängts genau?? oszi/LA zu Verfügung dann
schau dir mal schritt für schritt an was und wie gesendet wird...

Gruß

von Thomas M. (langhaarrocker)


Lesenswert?

Ich hatte das gleiche Problem - bis ich den 10k Pullup an DO der SD 
Karte (=MISO) geklemmt hatte. :D

von FloMann (Gast)


Lesenswert?

Mal was anderes noch, du nutzt Software Spi,
bist du dir sicher des spi clk? Während der
Initialisierung 200-400khz.
Die Zeiten des spiclk sollten auch passen..
Wie Taktet deine Mcu? Passend, so das sich bei
den write read software spi routinen ein
passender clk zu beginn wie später ergibt.

von Markus P. (sebastianwurst)


Lesenswert?

HimFlomann,

Also mein Mcu taktet mit 16Mhz. Haken tut es eigentlich da, dass er 
immer "Keine Mmc/SD Karte gefunden" schreibt...
Der Code stammt von Ulrich Radig, ich versuche Ihn nur "stumpf" 
anzuwenden... Ich werde mal noch ein paar versuche machen, dann meld ich 
mich wieder!
Vielen Dank

von Michael L. (michaelx)


Lesenswert?

Was hast du für eine Speicherkarte, wie groß?

von leluno (Gast)


Lesenswert?

In die Funktion mmc_write_byte delays einbauen und an der sd-karte mit 
dem Multimeter überprüfen, ob dort die Signale mit der richtigen 
Spannung und in der richtigen Reihenfolge ankommen.

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.