Forum: Mikrocontroller und Digitale Elektronik Die Initialisierung von einer SD Karte (mal wieder)


von Flexxer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich hänge nun schon seit fast zwei Wochen an der Initialisierung einer 
SD-Karte und bin nun an einen Punkt angekommen, wo ich einfach nicht 
mehr weiter weiß.

Zur Zeit kommt immer wunderschön ein 0xFF als Antwort...

Ich habe hier einen AtMega88 an 5V mit einem folgender Routine.
1
#ifndef F_CPU        
2
#define F_CPU 18432000UL     //Controller mit 18,432 MHz Quarz
3
#endif
4
5
//---------------Bibliotheken-------------------
6
7
#include <avr\io.h>            //Eingang / Ausgang
8
#include <avr\interrupt.h>     //Interrupts
9
#include <avr\delay.h>       //Delays
10
#include "my_uart.h"
11
12
#define SS  PB2
13
#define MOSI  PB3
14
#define MISO  PB4
15
#define SCK  PB5
16
#define SPIWait() while(!(SPSR & (1<<SPIF)))
17
18
//---------------Funktionen---------------------
19
void Init_SD(void);
20
void SPI_put_char(unsigned char data);
21
unsigned char SPI_get_char(void);
22
void CMD0(void);
23
void CMD1(void);
24
void CMD16(void);
25
26
//---------------Konstanten----------------------
27
28
29
//---------------Variablen-----------------------
30
31
unsigned char temp;
32
33
//===================Main========================
34
int main(void) 
35
{
36
Uart_Init();
37
38
  sei();
39
40
  while(1)//Beginn der Schleife
41
  {
42
  }
43
  return 0;
44
}
45
46
47
void Init_SD(void)
48
{
49
50
unsigned char i;
51
52
/*
53
Register: SPCR, SPSR
54
SPCR: 
55
Bit7: SPIE Interrupt
56
Bit6: SPE Enable: 1
57
Bit5: DORD Data Order: 0
58
Bit4: MSTR Master/Slave:1
59
Bit3: CPOL Steigend oder Fallend: 0
60
Bit2: CPHA erste oder zweite FLanke: 0
61
Bit1/0: SPR1/0 Geschwindigkeit: 00 für max  00=1/4 11=1/128
62
SPSR:
63
Bit0: SPI2X Clock mal 2: 1 für max => halber Systemtakt
64
*/
65
66
//zuerst Tackt=1/16
67
//für Initialisierung muss er über 400 kH sein
68
SPCR|=0b01010001;
69
SPSR|=0x00;
70
71
//Ausgänge
72
DDRB|=(1<<SS)|(1<<MOSI)|(1<<SCK);
73
74
//Eingänge
75
DDRB&=~(1<<MISO);
76
77
_delay_ms(2);
78
79
  PORTB |= (1 << SS); // disable MMC
80
  // start MMC in SPI mode
81
  for(i=0; i < 15; i++) SPI_put_char(0xFF); 
82
  // send mind. 10*8Bit=80 clock pulses hier 15*8=120
83
  PORTB &= ~(1 << SS); // enable MMC
84
}
85
86
void CMD0(void)
87
{
88
unsigned char answer;
89
90
do
91
{
92
93
  PORTB |= (1 << SS);
94
   SPI_put_char(0xFF);
95
  PORTB &= ~(1 << SS);
96
97
  SPI_put_char(0x40);
98
  SPI_put_char(0x00);
99
  SPI_put_char(0x00);
100
  SPI_put_char(0x00);
101
  SPI_put_char(0x00);
102
  SPI_put_char(0x95);
103
  answer=SPI_get_char();
104
  //Uart_put_char=answer; //Für Zwischenergebnisse
105
  }while(answer!=0x01);
106
  Uart_put_char=answer;//PC rec.
107
}
108
109
void SPI_put_char(unsigned char data)
110
{
111
  SPDR =data;
112
  while(!(SPSR & (1<<SPIF)));
113
}
114
unsigned char SPI_get_char()
115
{
116
  unsigned char data = 0;
117
  SPDR =0xFF;
118
  SPIWait();
119
  data = SPDR;
120
  return data;
121
}
122
123
ISR (USART_RX_vect)
124
{
125
  temp=UDR0;
126
  
127
  switch(temp)
128
  {
129
130
  case 0x00:
131
  Init_SD();
132
  CMD0();
133
  //CMD1(); 
134
  //CMD16();
135
  break;
136
137
  case 0xFF:
138
  Uart_put_char=temp;
139
  break;
140
  }
141
}

Zur Erklärung:
Ich schicke an meinen Controller über USART die Ziffer 0x00 zum starten 
der Initialisierung. Um die Verbindeung PC-µC zu testen schicke ich 
0xFF, was dann an mich zurückgesendet wird.

Zum testen habe ich hier zwei normale (keine dünnen und keine SDHC) SD 
Karten von hama die am Computer noch Funktionieren. Einmal eine 256MB 
und eine 2GB. Jedesmal mit dem gleichen Ergebnis.

Der Aufbau ist wie im Anhang umgesetzt und gibt bei Messungen mit 
Oszilloskop das gewünsschte Ergebnis.

Ich glaube das war alles Wichtige. Ich hoffe ihr findet meinen blöden 
Fehler ^^°

MfG
Flexxer

von ikorb (Gast)


Lesenswert?

Flexxer schrieb:
> do
> {
>
(initialisierung)
>   answer=SPI_get_char();
>   //Uart_put_char=answer; //Für Zwischenergebnisse
>   }while(answer!=0x01);

Gib der Karte doch mal mehr als ein Byte Zeit um sich eine Antwort zu 
überlegen - wiederhole nicht den ganzen Init-Block sondern nur ab 
SPI_get_char bis ein Byte zurückkommt bei dem das oberste Bit 0 ist oder 
du der Meinung bist lange genug gewartet zu haben.

von Flexxer (Gast)


Lesenswert?

Ja Natürlich.
Das das war das Problem.
Vielen Danke.
Ja klar, wenn der eine Schreibt sendet der andere 0xFF
Hab so verbissen nach einem Fehler in der Logik gesucht, dass ich das 
Vergessen hatte.

Zum Glück lernt man besonders bei den blöden Fehlern xD

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.