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


von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Hallo,

ich will mit Hilfe der "Radig Methode" 
(http://www.ulrichradig.de/home/index.php/avr/mmc-sd) eine SD Karte an 
meinem NET IO anschliessen. Leider funzt es noch nicht. Ich glaub es 
liegt an der Softwareintegrierung von mir.
Mein Problem sehe ich darin, dass ich u.a. kein Platz mehr für den
1
//  #define SPI_SSSD      3    //Nicht Benutz muß aber definiert werden

habe.

Ich habe den somit auskommentiert, da er auch nirgends verwedent wird, 
jedoch steht in Ulrichs Kommentar das er definiert werden muss? Muss das 
so sein?

Ausserdem habe ich in der config.h folgende Portinitialisierung (Port D) 
vorgenommen:
1
  // Port D-0 = USART 1 RxD
2
  // Port D-1 = USART 1 TxD
3
  // Port D-2 = USART 2 RxD
4
  // Port D-3 = USART 2 TxD
5
  // Port D-4 = SD-Karte Pin 2 - SPI_DI  Input
6
  // Port D-5 = SD-Karte Pin 5 - SPI_Clock Output
7
  // Port D-6 = SD-Karte Pin 7 - SPI_DO Output
8
  // Port D-7 = SD-Karte Pin 1 - MMC_Chip_Select Output
9
10
  //1=OUTPUT / 0=INPUT -> Bei 0 (Eingang) mit Portx den Pullup aktivieren 
11
  #define OUTA     0b00000000
12
  #define OUTC     0b11111111
13
  #define OUTD     0b11101011                     
14
  //Achtung!!!! an PORTB ist der ENC
beißt sich das eventuel mit den Einstellungen in der mmc.h (PS.: Meine 
beiden seriellen Verbindungen (Pin 0-3 des D-Ports) funktionieren noch 
einwandfrei!

Im Anhang auch noch ein Bild meiner Verdrahtung. Ich benutze vier 
verschieden SD Karten mit FAT16 formatiert.

Vielen Dank für jegliche Tips....

Initialisierung mmc.h
1
#define SPI_Mode      0    //1 = Hardware SPI | 0 = Software SPI
2
//#define SPI_Mode      0
3
4
#define MMC_Write      PORTD  //Port an der die MMC/SD-Karte angeschlossen ist also des SPI 
5
#define MMC_Read      PIND
6
#define MMC_Direction_REG  DDRD  
7
8
  #define SPI_DI        4    //Input Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
9
  #define SPI_DO        5    //Output Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
10
  #define SPI_Clock      6    //Output Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
11
  #define MMC_Chip_Select    7    //Output Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
12
//  #define SPI_SSSD      3    //Nicht Benutz muß aber definiert werden

Edit: Sorry für das eine zu große Bild, sollte auch komprimiert sein....

: Bearbeitet durch User
von oszi40 (Gast)


Lesenswert?

Hat Deine SD wirklich 2GB und wirklich FAT16? Andere Typen müssen nicht 
unbedingt laufen. http://de.wikipedia.org/wiki/SD_Memory_Card

von Markus P. (sebastianwurst)


Lesenswert?

Hallo Oszi,

ich hatte gerade auch einmalig "Karte gefunden!"
Und die Meldung aus der  fat_ini() "MBR Signatur not found!"
Nach nochmaligen aus/einstecken der Karte kommt jetzt wieder nur " Keine 
MMC/SD Karte gefunden!!"

Ich kann es nicht reproduzieren....

Meinst Du denn, dass meine config Einstellungen OK sind?

????

: Bearbeitet durch User
von Martin K. (dschadu)


Lesenswert?

SD-Karten sind sehr empfindlich was Spannungsversorgung angeht, auch die 
Konstruktion mit den Spannungsteilern als Pegelwandler ist nicht 
Optimal. Außerdem wirkt deine Fliegende Verdrahtung wie eine riesen 
Antenne.
Das kann also nur schief gehen.
Heißt für dich: Vernünftiges Adapter-Board besorgen und nochmal 
versuchen.

von oszi40 (Gast)


Lesenswert?

Markus P. schrieb:
> kommt jetzt wieder nur " Keine MMC/SD Karte gefunden!!"

Mach erst mal die Gegenprobe am PC ob sie überhaupt noch lebt. 
Klappriger Aufbau auf Steckbrett hat oft Kontaktprobleme.

von Stefanus (Gast)


Lesenswert?

Hi,
ich habe schon einige Experimente mit SD Karte und primitiven 
Spannungswandlern gemacht. Es funktioniert nur sehr unzuverlässig.

Am Besten ist, Du verwendest einen Mikrocontroller, der mit 3,3V 
versorgt wird und schließt da die SD Karte direkt mir sehr kurzen 
leitungen an. Mehr als 5cm würde ich gar nicht erst versuchen.

Falls das mit den 3,3V nicht geht, dann besorge Dir eine Platine mit 
SD-Slot und Pegelwandler. Die gibt's für Arduino bei eBay - man kann sie 
selbstverständlich auch mit anderen Mikrocontrollern benutzen.

Weiterhin zicken SD Karten generell gerne mal. Ich habe z.B. eine im 
Fotoapparat, die ausschließlich dort und im Laptop meiner Frau 
funktioniert. Auf mienm Laptop kann ich sie nur auslesen, aber nicht 
beschrieben (dann geht das Filesystem kaputt) und auf den anderen 
Geräten und USB Adaptern läuft die gar nicht. In meinem AVR Webserver 
steckt eine alte Mikro-SD Karte, die sort super funktioniert, aber im 
Handy will sie nicht gehen. Manchmal muss man einfach eine andere Karte 
versuchen - so blöd das auch ist.

> Mein Problem sehe ich darin, dass ich u.a. kein Platz mehr für den
> #define SPI_SSSD 3 //Nicht Benutz muß aber definiert werden
> habe.

Das kann gar nicht sein.

Definitionen erzeugen keinen Programmcode und können daher auch keinen 
Platz belegen. Nur wenn sie benutzt werden, erzeugen sie Code.

Definitionen sind einfach nur Textersetzungen, die der Pre-Compiler vor 
dem eigentlichen Compiler anwendet.
1
#define Trallala printf("Hallo");
2
#define Nix printf("Nix los");
3
4
void main() {
5
  Trallala
6
}

In diesem Fall wird Platz belegt, weil "Trallala" in der main() Funktion 
benutzt wird. Für die Definition "Nix" wird hingegen kein Platz belegt, 
weil sie nicht verwendet wird.

von leluno (Gast)


Lesenswert?

Ich würde zuerst die Funktion der spi-Schnittstelle unabhängig von der 
sd-karte überprüfen. Du hast einen software-spi. Wenn du in der 
spi-funktion zum testen delays einbaust, kannst du die Funktion gut 
nachvollziehen und fesstellen, an welcher Stelle im code das Problem 
liegt.

von oszi40 (Gast)


Lesenswert?

Wenn ich den klappigen Aufbau auf dem Foto oben sehe, muß man viel Glück 
haben, daß überhaupt etwas funktioniert.

von holger (Gast)


Lesenswert?

>Ich habe den somit auskommentiert, da er auch nirgends verwedent wird,
>jedoch steht in Ulrichs Kommentar das er definiert werden muss? Muss das
>so sein?

Ja, das muss so sein. Wenn der SS Pin nicht auf Ausgang
geschaltet wird hängt sich das SPI Modul immer wieder auf.

von holger (Gast)


Lesenswert?

>Ja, das muss so sein. Wenn der SS Pin nicht auf Ausgang
>geschaltet wird hängt sich das SPI Modul immer wieder auf.

Upps, du hast ja Software SPI. Dann muss das nicht sein.

von Markus (Gast)


Lesenswert?

Danke erstemal an Alle,
Morgen probiere ich es aus direkt mit kurzen Verbindungen am NetIo die 
Karte "fest" zu verlöten....
Mit kein Platz für den SS-Pin meinte ich nur das ich keinen freien 
Ausgang mehr habe, deswegen....
Ich meld mich morgen wieder, wäre schön wenn ihr nochmal vorbei schaut 
fals ich noch ne Frage habe....

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

So, da bin ich weider...leider ohne Erfolg;-)

Im Anhang zwei Bilder der neuen Platine, jetzt sind die Leitungen von 
den Ausgängen des NET IOS nur noch circa 6cm lang (10poliges 
Flachbandkabel)

Seht ihr vielleicht irgendetwas was ich falsch gemacht haben 
könnte...die Karten sind alle FAT16 formatiert (Kontrolliert mit 
"EaseUS Partition")
Habe jetzt effektiv drei verschiedene im Einsatz (Toschiba (s.Bild), 
AnyCard SD und Transcend SD, alle 1GB groß)

Das ist jetzt meine Config:
1
  // Port D-0 = USART 1 RxD
2
  // Port D-1 = USART 1 TxD
3
  // Port D-2 = USART 2 RxD
4
  // Port D-3 = USART 2 TxD
5
  // Port D-4 = SD-Karte Pin 2 - SPI_DI  Input
6
  // Port D-5 = SD-Karte Pin 5 - SPI_Clock Output
7
  // Port D-6 = SD-Karte Pin 7 - SPI_DO Output
8
  // Port D-7 = SD-Karte Pin 1 - MMC_Chip_Select Output
9
10
11
  #define SPI_DI        4    //Input Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
12
  #define SPI_DO        6    //Output Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
13
  #define SPI_Clock      5    //Output Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
14
  #define MMC_Chip_Select    7    //Output Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
15
//  #define SPI_SSSD      3    //Nicht Benutz muß aber definiert werden
16
17
18
19
20
  //1=OUTPUT / 0=INPUT -> Bei 0 (Eingang) mit Portx den Pullup aktivieren 
21
  #define OUTA     0b00000000
22
  #define OUTC     0b11111111
23
  #define OUTD     0b11101011                     
24
  //Achtung!!!! an PORTB ist der ENC

von Stefanus (Gast)


Lesenswert?

Du hast immer noch keine anständigen Pegelwandler. Schade um die 
versaute Platine.

von Markus (Gast)


Lesenswert?

Was für einen Pegelwandler würdest du empfehlen? Wie ürdest du es 
machen?

von Karl K. (leluno)


Lesenswert?

Spar dir den nerv mit der Pegelwandlung. Nimm einen atmega644 oder 1284, 
die Kannst du mit 3Volt betreiben. Da passt die sd-karte und der enc 
direkt dran.

von Stefanus (Gast)


Lesenswert?

> Was für einen Pegelwandler würdest du empfehlen? Wie würdest du es
machen?


Hab ich doch geschrieben! Und auch andere.
Ich zittiere:

Am Besten ist, Du verwendest einen Mikrocontroller, der mit 3,3V
versorgt wird und schließt da die SD Karte direkt mir sehr kurzen
leitungen an. Mehr als 5cm würde ich gar nicht erst versuchen.

Falls das mit den 3,3V nicht geht, dann besorge Dir eine Platine mit
SD-Slot und Pegelwandler. Die gibt's für Arduino bei eBay - man kann sie
selbstverständlich auch mit anderen Mikrocontrollern benutzen.

von Johannes M. (johannesm)


Lesenswert?

Hast du schon mal eine SD Karte eines anderen Herstellers getestet?
Bei meinem letzten Projekt ließen sich z.B. Platinum und Intenso Karten 
nicht zu funktionsfähigen Betrieb überreden. SanDisk und hama Karten 
funktionierten auf Anhieb.

von Markus (Gast)


Lesenswert?

Ich habe noch ein paar SD Karten bestellt, ausserdem auch einen 
Pegelwandler. Den mc auf 3V umzubauen geht bei mir nicht so gut, dann 
muss ich andere Sachen umwandeln....
Ich meld mich....

von leluno (Gast)


Lesenswert?

Markus schrieb:
> Den mc auf 3V umzubauen geht bei mir nicht so gut

Signalleitungen von 5V-Geräten mit nur 3Volt zu betreiben, ist meistens 
kein Problem. Ich nehme immer 5 Volt Stromversorgung und einen 
3volt-StepDown-Regler für den AVR und die 3V-Geräte.

Was du noch machen könntest, wäre die sd-Karte an PortB anzuschließen. 
Der wird wegen dem enc eh mit 3Volt versorgt. Du musst dann nur die 
CS-Leitung auf 3Volt herunterregeln, was auch mit deinem Spannungsteiler 
funktionieren müsste.

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe jetzt den Pegelwander 74HC125 integriert und folgendermaßen 
angeschlossen (s. Anhang) Ist das richtig so gemacht?

von Stefan F. (Gast)


Lesenswert?

Du musst schon mehr als eine Leitung beschalten.
Und auch die Output-Enable Leitungen müssen beschaltet werden.

Wobei die Datenleitung bidirektional ist. Also doppelt beschaltet. Da 
musst Du noch steuern, in welche Richtung das Signal laufen soll.

Also ganz so einfach geht das nicht.

Kauf Dir doch besser einen fertigen SD-Slot mit eingebautem 
Pegelwandler. Die gibt's ganz billig als Arduino Zubehör.

von holger (Gast)


Lesenswert?

>Wobei die Datenleitung bidirektional ist.

Bei SD Karten ist keine der Leitungen bidirektional.

von holger (Gast)


Lesenswert?

>>Wobei die Datenleitung bidirektional ist.
>
>Bei SD Karten ist keine der Leitungen bidirektional.

Im SPI Modus wohlgemerkt, und darum geht es hier.

Bevor jemand meckert;)

von Markus (Gast)


Lesenswert?

Ich habe natürlich alle nötigen eingangs Pins der SD Karte so 
beschaltet...also muss ich G1 ..2..3 auch noch auf Vcc legen?!?! Laut DB 
verstehe ich das irgendwie anders...???

von Markus (Gast)


Lesenswert?

Eine fertige Platine mit Pegelwandler ist bestellt... Leider noch nicht 
da.
Ich benutze den Software SPI...

von Stefan F. (Gast)


Lesenswert?

>> Wobei die Datenleitung bidirektional ist.
> Bei SD Karten ist keine der Leitungen bidirektional.

Ach ja, hast Recht.

von Markus (Gast)


Lesenswert?

Wie muss ich G1..2..3..4 denn belegen?

von Volker (Gast)


Lesenswert?

Du mußt /Gn auf GND legen damit Puffer Nr. n durchschaltet.
Allerdings ist der 74HC125 eher schlecht als Pegelwandler von 5V -> 3.3V 
geeignet, weil er interne Schutzdioden hat.

von Markus (Gast)


Lesenswert?

Ok, was ist denn das schlechte an Schutzdioden. Welchen würdest Du denn 
empfehlen?

von Markus (Gast)


Lesenswert?

Leider hat das noch nicht geklappt, die Meldung

** Keine MMC/SD Karte gefunden!! **

kommt trotzdem immer noch.

Das einzige was mir jetzt aufgefallen ist, dass die Meldun ohne SD Karte 
im Slot, circa jede 1 Sekunde kommt. Stecke ich irgendeine Karte ein, 
kommt die Meldung 10mal die Sekunde???
Sieht das vielleicht nach einem bestimmten Fehler aus?

von Volker (Gast)


Lesenswert?

Der 74hc4050 ist da besser.

von Markus P. (sebastianwurst)


Lesenswert?

Danke, werde den mal bestellen mit der Hoffnung, dass es dann klappt... 
Ich glaub aber noch nicht dran...irgendow habe ich noch ein Bock drin!

von Gerhard G. (g_g)


Lesenswert?

Hallo,

schau dir das mal an:

http://www.exp-tech.de/Shields/Itead-SD-MICRO-SD-Breakout.html

Hat alle Funktionen die du brauchst. Der Preis ist unschlagbar.
Zweit Slots (groß/klein), 3 oder 5 Volt, Spannungsregler, Led.

UND... funktioniert mit allen bekannten Tools/Lib's auf Anhieb.

Mit dieser Schaltung kannst du dich auf dein Programm konzentrieren und 
musst dich nicht immer fragen, ist der Fehler in der Software oder 
funktioniert meine Hardware nicht!

Gruß G.G.

von Markus P. (sebastianwurst)


Lesenswert?

Hi und danke, habe ich mal bestellt....

Da kann ich dann auch direkt mit meinen NET IO Ausgängen un ddem einen 
Eingang drauf gehen, oder?!?!?!? Muss ich was an den internen PullUps 
beachten?

: Bearbeitet durch User
von Gerhard G. (g_g)


Lesenswert?

Hallo,

alle PullUps intern weglassen!



Gruß G.G.

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Hi,
ich habe es immer noch nicht hin bekommen, ich habe jetzt den Adapter 
(http://www.exp-tech.de/Shields/Itead-SD-MICRO-SD-Breakout.html) 
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 Markus P. (sebastianwurst)


Lesenswert?

Hallo...habe der Übersichthalber einen neuen Thread eröffnet.:
http://www.mikrocontroller.net/user/my_posts

von Markus P. (sebastianwurst)


Lesenswert?


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.