SD-Karte wird nicht erkannt NetIO

#3493203
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....
Angehängte Dateien:
Gast #3493284
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.
Gast #3494086
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....
#3494644
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
Angehängte Dateien:
Gast #3495271
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.
Gast #3497265
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.
Gast #3504284
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.
Gast #3505457
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?
#3506572
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.
#3536443
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
....
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren