Forum: Mikrocontroller und Digitale Elektronik SD Karte gibt immer nur 0x01 zurück, CMD0 und SPI geht


von µluxx .. (uluxx) Benutzerseite


Lesenswert?

Hallo,
ich versuche jetzt schon seit 1 1/2 Wochen eine SD Karte mit dem 
MSP430F2013 anzusteuern. CMD0 funktioniert, Karten antworten, nur eine 
1GB Sandisk macht Probleme, weiß nicht warum, alle 3 anderen 
funktionieren, und jetzt versuche ich schon ewig, mal mit CMD1 mal mit 
CMD55+ACMD41 die karten zu initialisieren.
Nur irgendwie wird das nichts. Die Karten antworten zwar mit R1, aber 
sie werden nie fertig. Ich bekomme immer 0x01.
Mein Hardwareaufbau: SD Karte an 3,3V, genauso wie MSP, beide einzeln 
mit 100nF, SPI Leitungen mit 33K Pullup(MOSI,MISO,CLK), CS PushPull, 
ungenutzte IOs mit 50K auf Vcc.

Hier mal mein Code, ich weiß nicht an was es noch liegen könnte, ich 
habe schon diverse experimente mit Dummies vor bzw. nach Commands 
gemacht, mal mit CS high, mal mit low, manchmal delay zwischen die 
Abfragen, Nichts ging, bzw. NIE antwortete die Karte mal mit 0x00...
1
        MOV.W #1, R4       ; Nach erfolgreichen CMD0 noch 1Dummy mit CS low
2
        CALL #SD_Dummy_CSH
3
        
4
        MOV.W #200, R4     ; Noch 200 Dummies mit CS high
5
        CALL #SD_Dummy 
6
        
7
        ; CMD55 rausgeben
8
SD_CMD55:        
9
        MOV.B #0x77, R5     ;CMD laden
10
        MOV #0x0000, R6
11
        MOV #0x0000, R7
12
        CALL #SD_CMD_R1     ; CMD rauslassen
13
        PUSH R5
14
        MOV.B #0x01, R4
15
        CALL #SD_Dummy_CSH   ; 1 dummy bei CS low hinterher
16
        MOV.B #0x02, R4
17
        CALL #SD_Dummy       ; 2 dummy bei CS high hinterher
18
        POP R5
19
        CMP.B #0x00, R5
20
        JEQ SD_ACMD41       ; Antwort prüfen
21
        CMP.B #0x01, R5
22
        JNE SD_Init_Error
23
        
24
SD_ACMD41:
25
        
26
        MOV.B #0x69, R5     ;CMD laden
27
        MOV #0x0000, R6
28
        MOV #0x0000, R7
29
        CALL #SD_CMD_R1     ; CMD rauslassen
30
        
31
        PUSH R5
32
        MOV.B #0x01, R4
33
        CALL #SD_Dummy_CSH   ; 1 dummy bei CS low hinterher
34
        MOV.B #0x02, R4
35
        CALL #SD_Dummy       ; 2 dummy bei CS high hinterher
36
        POP R5
37
        CMP.B #0x00, R5
38
        JEQ SD_ACMD41_       ; Antwort prüfen
39
        CMP.B #0x01, R5
40
        JNE SD_Init_Error
41
        
42
        JMP SD_CMD55
43
         
44
        
45
SD_ACMD41_: 
46
        
47
        ;StatusLED flackern lassen ; Karte kommt hier nie an
48
        BIS.B #00000010b, &P1SEL
49
        MOV.W #07A1h, &TACCR0   ; 250ms Intervall
50
        BIS.W #MC1+MC0, &TACTL  ; Timer aktivieren(Up/Down)
51
        
52
        
53
        JMP $
54
55
SD_CMD_R1:
56
        MOV.B R5, &USISRL
57
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
58
SD_CMD_R1a:        
59
        BIT.B #USIIFG, &USICTL1    ; Fertig?
60
        JZ SD_CMD_R1a
61
        
62
        SWPB R6
63
        MOV.B R6, &USISRL
64
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
65
SD_CMD_R1b:        
66
        BIT.B #USIIFG, &USICTL1    ; Fertig?
67
        JZ SD_CMD_R1b
68
        
69
        SWPB R6
70
        MOV.B R6, &USISRL
71
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
72
SD_CMD_R1c:        
73
        BIT.B #USIIFG, &USICTL1    ; Fertig?
74
        JZ SD_CMD_R1c
75
        
76
        SWPB R7
77
        MOV.B R6, &USISRL
78
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
79
SD_CMD_R1d:        
80
        BIT.B #USIIFG, &USICTL1    ; Fertig?
81
        JZ SD_CMD_R1d
82
        
83
        SWPB R7
84
        MOV.B R6, &USISRL
85
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
86
SD_CMD_R1e:        
87
        BIT.B #USIIFG, &USICTL1    ; Fertig?
88
        JZ SD_CMD_R1e
89
90
SD_CMD_R1g:        
91
        MOV.B #0x00, &USISRL
92
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start
93
SD_CMD_R1f:        
94
        BIT.B #USIIFG, &USICTL1    ; Fertig?
95
        JZ SD_CMD_R1f
96
        MOV.B &USISRL, R5
97
        CMP.B #0xFF, R5
98
        JEQ SD_CMD_R1g
99
        
100
        RET
101
        
102
        
103
        
104
105
106
107
108
        
109
SD_Init_Error:
110
        BIS.B #00000010b, &P1SEL       
111
        MOV.W #0x02FF, &TACCR0
112
        BIS.W #MC1+MC0, &TACTL  ; Timer aktivieren(Up/Down)
113
      
114
SD_Init_Error_:        
115
        JMP SD_Init_Error_
116
        
117
             
118
Wait_Timeout:
119
        BIC.B #00000010b, &P1SEL
120
        BIS.B #00000010b, &P1OUT
121
        
122
        JMP $
123
    
124
        
125
SD_Dummy:
126
        BIS.B #00010000b, &P1OUT  ; CS loslassen
127
        NOP
128
        NOP 
129
SD_Dummy_CSH:
130
        CMP #0, R4
131
        JEQ SD_Dummy_
132
        
133
        MOV.B #0FFh, &USISRL
134
        MOV.B #00001000b, &USICNT  ; 8-Bit Transfer > Start        
135
SD_Dummy_Wait:
136
        BIT.B #USIIFG, &USICTL1 ; Ist das modul schon fertig?
137
        JZ SD_Dummy_Wait
138
        MOV.B &USISRL, R5      
139
        
140
        DEC R4
141
        JMP SD_Dummy_CSH
142
SD_Dummy_:
143
        BIC.B #00010000b, &P1OUT  ; CS nehmen
144
        NOP
145
        RET

von basti (Gast)


Lesenswert?

lass mal beim senden mehrerer cmd41 die select leitung auf low, also die 
karte aktiviert

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

meinst du ich soll mehrmals CMD55+ACMD41 senden, und dazwischen CS low 
lassen, kann ich machen, meisnt du ich soll nach jedem Kommand ein paar 
Dummies (auch bei CS low) mitschicken, und wenn ja, wieviele?

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

so, also auch das CS Leitung auf Low lassen bringt nichts, ich habe auch 
versucht mal keine Dummies nach dem Befehl zu senden, mal 8, mal 
1....bringt alles nichts...woran kann das nur liegen?? Ich kapiers echt 
nicht!

von Sebastian H. (baddy)


Lesenswert?

Ich habe das gleiche Problem wie du. Vor den Ferien konnte ich 
einwandfrei schreiben und lesen und nun geht fast gar nix mehr. Gestern 
hat nochmal ein Schreibvorgang geklappt, aber danach war schon wieder 
Ende im Gelände.

Bei mir ist es so, dass die Karte entweder 0x01 zurück gibt oder sich 
irgendwann mit 0xFF verabschiedet.

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.