1 | void SD_init(void)
|
2 | {
|
3 | unsigned char sendArray[5];
|
4 | SD_Version = 2;
|
5 | SDHC = 0;
|
6 |
|
7 | // Konfiguration SCK, MISO, MOSI, CS
|
8 | // Pullips
|
9 | GPIOC -> PUPDR &= ~(1 << 25);
|
10 | GPIOC -> PUPDR |= (1 << 24);
|
11 | GPIOC -> PUPDR &= ~(1 << 23);
|
12 | GPIOC -> PUPDR |= (1 << 22);
|
13 | GPIOD -> PUPDR &= ~(1 << 5);
|
14 | GPIOD -> PUPDR |= (1 << 4);
|
15 |
|
16 | // Konfiguration des Eingangs (MISO PC8)
|
17 | GPIOC -> MODER &= ~((1 << 16) + (1 << 17));
|
18 | GPIOC -> PUPDR &= ~(1 << 17);
|
19 | GPIOC -> PUPDR |= (1 << 16);
|
20 | // GPIOC -> TYPER |= (1 << 8); // open drain
|
21 |
|
22 | // Konfiguration der Outputs
|
23 | GPIOC -> MODER |= (1 << 22) + (1 << 24);
|
24 | GPIOD -> MODER |= (1 << 4);
|
25 |
|
26 | SD_SCLK_L;
|
27 |
|
28 | delay_us(2000); // TODO vielleicht mehr als 1000
|
29 |
|
30 | SD_CS_H;
|
31 | SD_WRITE_H;
|
32 |
|
33 | SD_toggle(148); // TODO vielleicht mehr als 74
|
34 |
|
35 | sendArray[0] = CMD0;
|
36 | sendArray[1] = 0x00;
|
37 | sendArray[2] = 0x00;
|
38 | sendArray[3] = 0x00;
|
39 | sendArray[4] = 0x00;
|
40 | SD_CS_L; // start
|
41 | SD_Command_Write(&(sendArray[0]));
|
42 | SD_Receive(1);
|
43 | SD_CS_H; // stop
|
44 | SD_toggle(8); // TODO Pruefen ob notwendig
|
45 | if (SD_readArray[0] == 0x01) // JA
|
46 | {
|
47 | sendArray[0] = CMD8;
|
48 | sendArray[1] = 0x00;
|
49 | sendArray[2] = 0x00;
|
50 | sendArray[3] = 0x01;
|
51 | sendArray[4] = 0xAA;
|
52 | SD_CS_L; // start
|
53 | SD_Command_Write(&(sendArray[0]));
|
54 | if (SD_Receive(5) == 0)
|
55 | {
|
56 | SD_CS_H; // stop
|
57 | SD_toggle(8); // TODO Pruefen ob notwendig
|
58 | SD_Version = 1;
|
59 | }
|
60 | else
|
61 | {
|
62 | SD_CS_H; // stop
|
63 | SD_toggle(8); // TODO Pruefen ob notwendig
|
64 | if (SD_readArray[0] & 0x7E)
|
65 | {
|
66 | SD_Version = 1;
|
67 | }
|
68 | if (SD_readArray[3] != 0x01 || (SD_readArray[4] != 0xAA))
|
69 | {
|
70 | SD_Version = 0;
|
71 | // power off card
|
72 | return;
|
73 | }
|
74 | }
|
75 | int errCounter = 0;
|
76 | SD_CS_L; // start
|
77 | int position = 0;
|
78 | do
|
79 | {
|
80 | SD_CS_H;
|
81 | SD_toggle(16); // TODO Pruefen ob notwendig (16)
|
82 | SD_CS_L;
|
83 |
|
84 | sendArray[0] = CMD55;
|
85 | sendArray[1] = 0x00;
|
86 | sendArray[2] = 0x00;
|
87 | sendArray[3] = 0x00;
|
88 | sendArray[4] = 0x00;
|
89 | SD_Command_Write(&(sendArray[0]));
|
90 | if (SD_Receive(1))
|
91 | {
|
92 | position = 1;
|
93 | }
|
94 |
|
95 | SD_CS_H;
|
96 | SD_toggle(16); // TODO Pruefen ob notwendig (16)
|
97 | SD_CS_L;
|
98 |
|
99 | sendArray[0] = ACMD41;
|
100 | if (SD_Version == 2) sendArray[1] = 0x40;
|
101 | else sendArray[1] = 0x00;
|
102 | sendArray[2] = 0x00;
|
103 | sendArray[3] = 0x00;
|
104 | sendArray[4] = 0x00;
|
105 | SD_Command_Write(&(sendArray[0]));
|
106 | if (SD_Receive(1))
|
107 | {
|
108 | position = 2;
|
109 | }
|
110 |
|
111 | errCounter++;
|
112 | } while ((SD_readArray[0] != 0x00) && (errCounter <= 100));
|
113 | SD_CS_H; // stop
|
114 | // TODO hier muesste eigentlich eine 00 statt einer 0xff stehen
|
115 | int test = SD_readArray[0];
|
116 | if ((SD_readArray[0] == 0x00) && (errCounter <= 1000))
|
117 | {
|
118 | if (SD_Version == 2)
|
119 | {
|
120 | SD_CS_H; // stop
|
121 | SD_toggle(16); // TODO Pruefen ob notwendig
|
122 | sendArray[0] = CMD58;
|
123 | sendArray[1] = 0x40;
|
124 | sendArray[2] = 0x00;
|
125 | sendArray[3] = 0x00;
|
126 | sendArray[4] = 0x00;
|
127 | SD_Command_Write(&(sendArray[0]));
|
128 | SD_Receive(4);
|
129 | if (SD_readArray[1] & 0x40)
|
130 | {
|
131 | SDHC = 1;
|
132 | return;
|
133 | }
|
134 | }
|
135 | if (!SDHC)
|
136 | {
|
137 | // Blocksize 512 Bytes
|
138 | SD_CS_H; // stop
|
139 | SD_toggle(16); // TODO Pruefen ob notwendig
|
140 | sendArray[0] = CMD16;
|
141 | sendArray[1] = 0x00;
|
142 | sendArray[2] = 0x00;
|
143 | sendArray[3] = 0x02;
|
144 | sendArray[4] = 0x00;
|
145 | SD_Command_Write(&(sendArray[0]));
|
146 | SD_Receive(1);
|
147 | }
|
148 | }
|
149 | else
|
150 | {
|
151 | SD_Version = 0;
|
152 | // power off
|
153 | return;
|
154 | }
|
155 | }
|
156 | else
|
157 | {
|
158 | SD_Version = 0;
|
159 | // power off
|
160 | }
|
161 | }
|