ich versuche mich an der sdio-Schnittstelle des stm32f429. Fertiger code von UB funktioniert bei mir nicht. Da dieser code relativ kompliziert ist, fällt die Fehlersuche schwer. Ich wollte meine Hardware deswegen zuerst mit einem einfachen software-sdio-code testen: Beitrag "Sd-Card endlich im 4-Bit-Mode! -> Init Read Write" Auch das gestaltet sich schwierig. Die Initialisierung von spi ist bei elm chan gut erklärt. Entsprechendes für sdio habe ich leider nicht gefunden. Nach meinem Verständnis müsste die Initialisierung von sdio-mode und spi-mode erst einmal gleich erfolgen. Es wird dann irgendwann auf spi umgestellt. -Wann und womit? Also 80 dummy-clocks, dann comand0 für reset, dann comand1 für idle Da bis dahin nicht auf spi umgeschaltet ist -?- müssten die gleichen Leitungen für spi und sdio verwendet werden: Daten in die Karte mit cmd/=DI, Die Antwort der Karte auf Dat0/=DO ????? In dem oben angegebenen Beispielcode wird aber nicht Dat0 sondern Cmd abgefragt:
1 | BYTE response_R(BYTE s) |
2 | {
|
3 | BYTE a=0,b=0,c=0,r=0,crc=0; |
4 | BYTE i,j=6,k; |
5 | while(1) |
6 | {
|
7 | SD_CLK_LOW; |
8 | SD_CLK_HIGH; |
9 | if(!(SD_TEST_CMD)) break;//<<==???????kk |
10 | if(crc++ >254) return 2; |
11 | }
|
12 | crc =0; |
13 | if(s == 2) j = 17; |
14 | for(k=0; k<j; k++) |
15 | {
|
16 | c = 0; |
17 | if(k > 0) //for crc culcar |
18 | b = response_buffer[k-1]; |
19 | for(i=0; i<8; i++) |
20 | {
|
21 | SD_CLK_LOW; |
22 | if(a > 0) c <<= 1; |
23 | else i++; |
24 | a++; |
25 | SD_CLK_HIGH; |
26 | if(SD_TEST_CMD) c |= 0x01; |
27 | if(k > 0) |
28 | {
|
29 | crc <<= 1; |
30 | if((crc ^ b) & 0x80) |
31 | crc ^= 0x09; |
32 | b <<= 1; |
33 | crc &= 0x7f; |
34 | }
|
35 | }
|
36 | if(s==3) |
37 | if( k==1 &&(!(c&0x80))) r=1; |
38 | response_buffer[k] = c; |
39 | }
|
40 | if(s==1 || s==6) |
41 | if(c != ((crc<<1)+1)) r=2; |
42 | |
43 | return r; |
44 | }
|
Gibt es irgendwo eine nachvollziehbare Anleitung über die Initialisierung der sd-card per sdio??