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