Forum: Mikrocontroller und Digitale Elektronik sd-card SDIO Initialisierung


von Grundschüler (Gast)


Angehängte Dateien:

Lesenswert?

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??

von Grundschüler (Gast)


Lesenswert?

jetzt gefunden:
4.1.2 Karte in den Idle-Modus versetzen (CMD0)
Als erstes muss man der Karte das Kommando CMD0 (GO IDLE STATE) senden. 
Hier
ist ausnahmsweise die CRC-Prufsumme doch von Bedeutung, aber da der 
Befehl keine ¨
Parameter hat kann diese als Konstante gespeichert werden. Es empfiehlt 
sich fur die ¨
Parameter Nullbytes zu senden, da man dann die unten angegebene CRC 
benutzen kann.
Die SD-Karte pruft beim Empfang von CMD0 den Pegel der ¨ SS-Leitung. Ist 
diese auf
Low gezogen (wie bei einer normalen SPI-Ubertragung vorgesehen), startet 
die Karte ¨
in den SPI-Modus, in dem sie bleibt bis die Stromzufuhr unterbrochen 
wird. Ist die
SS-Leitung an dieser Stelle High, wird die Karte in den SD-Bus-Modus 
starten.
Als Antwort auf dieses Kommando sollte man ein Byte im R1-Format 
empfangen, das
anzeigt, dass die Karte sich jetzt im Idle-Modus befindet.

von Grundschüler (Gast)


Lesenswert?

1
static
2
void rcvr_mmc (
3
  uint8_t *buff,  /* Pointer to read buffer */
4
  uint16_t bc    /* Number of uint8_ts to receive */
5
)
6
{
7
  uint8_t r,i;
8
9
if(sd_spi0_sdio1_select==0){
10
  DI_H();  /* Send 0xFF */
11
  r=0;
12
  do {
13
    for (i=0;i<8;i++){
14
    r <<= 1; if (DO) r++;  // bit7
15
    CK_H(); CK_L();
16
    }
17
    *buff++ = r;      /* Store a received uint8_t */
18
  } while (--bc);
19
}else{
20
  SD_CMD_DI_IN;
21
//  pinPULLUP(D,2,1);//cmd
22
//  _delay_us(100);
23
  r=0;
24
  do {
25
    for (i=0;i<8;i++){
26
    r <<= 1; if (SD_CMD_DI_VALUE) r++;  /* bit6 */
27
    CK_H(); CK_L();
28
    }
29
    *buff++ = r;      /* Store a received uint8_t */
30
  } while (--bc);
31
  SD_CMD_DI_OUT;
32
//  SD_CMD_DI_HIGH;
33
34
}//
35
36
}
Die Karte wird jetzt mit dem foolproof-code von elm chan erkannt. Die 
Hardware ist also zumindest auch für den sd-1bit-modus in Ordnung.

Wenn ich jetzt Dat3/Cs auf high lasse, müsste die Karte Eigentlich auf 
cmd/Di antworten. Klappt aber nicht. Warum?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Grundschüler schrieb:
> Wenn ich jetzt Dat3/Cs auf high lasse, müsste die Karte Eigentlich auf
> cmd/Di antworten. Klappt aber nicht. Warum?

  Init nicht komplett.
  1. Card deselect
  2. 80 SPI clock pulses
  3. Send CMD0  [ Reset to idle state = 0x00]
  4. Wenn Answer gleich R1_IDLE
     4a. Send CMD1 [ initialise card internally = 0x01]
     4b. Warten auf R1_NOERROR
     4c. Return True
  5. Return False

von Jim M. (turboj)


Lesenswert?

Marc Vesely schrieb:
> 2. 80 SPI clock pulses

Das Wichtigste, nämlich das CMD/DI High sein muss, fehlt.
Da es hier um SDIO und nicht um SPI geht, ist auch

> 1. Card deselect

falsch. Der CS muss high Pegel haben - das ist aber select bei SDIO und 
grade nicht deselect.


> 4. Wenn Answer gleich R1_IDLE
>     4a. Send CMD1 [ initialise card internally = 0x01]

Das funktioniert bei SDHC Karten so auch nicht mehr.

von Grundschüler (Gast)


Lesenswert?

Erst mal Danke für die beiden Antworten. Ich quäle mich nun erstmal mit 
dem Stm-Spi-Modus ab. Wenn das irgendwann funktioniert probiere ich es 
noch einmal mit bitbanging-sdio.

von holger (Gast)


Lesenswert?

>Wenn das irgendwann funktioniert probiere ich es
>noch einmal mit bitbanging-sdio.

Wozu um Himmels Willen? Entweder SPI oder gleich SDIO.
bitbanging-sdio so ein Unsinn.

von Grundschüler (Gast)


Lesenswert?

holger schrieb:
>>Wenn das irgendwann funktioniert probiere ich es
>>noch einmal mit bitbanging-sdio.
>
> Wozu um Himmels Willen? Entweder SPI oder gleich SDIO.
> bitbanging-sdio so ein Unsinn.

wenn sdio klappen würde, würde ich  den Aufwand sicher nicht betreiben. 
Solange die Karte mit bitbanging nicht anspricht klappt das auch mit 
sdio nicht.

von holger (Gast)


Lesenswert?

>sdio-Schnittstelle des stm32f429

Auf dem STM32F429I-Disco?
Da ist SDIO vom SDRAM oder dem Display blockiert.
Welches von beiden weiss ich nicht mehr.

USB Host geht dort aber. Nimm doch nen USB Stick.
Aussdem muss man mit der Taktrate aufpassen.
USB geht nur wenn die CPU mit 168MHz getaktet wird.
Vieleicht ist das auch ein Problem bei SDIO wenn die
CPU mit 180MHz läuft.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jim Meba schrieb:
> Das Wichtigste, nämlich das CMD/DI High sein muss, fehlt.
> Da es hier um SDIO und nicht um SPI geht, ist auch
>
>> 1. Card deselect
>
> falsch. Der CS muss high Pegel haben - das ist aber select bei SDIO und
> grade nicht deselect.

 Falsch. CS ist immer negative logic, also ist deselect = (CS = HIGH).


>> 4. Wenn Answer gleich R1_IDLE
>>     4a. Send CMD1 [ initialise card internally = 0x01]
>
> Das funktioniert bei SDHC Karten so auch nicht mehr.
 Ja, es funktioniert, oder alle Karten mit denen ich bisher gearbeitet
 habe, müssen einen Fabrikationsfehler haben.

: Bearbeitet durch User
von Grundschüler (Gast)


Lesenswert?

holger schrieb:
> Da ist SDIO vom SDRAM oder dem Display blockiert.

Das Lcd habe ich seriell angeschlossen, ansonsten wäre PC10 für Lcd_R2 
belegt. Ich hatte einen enc28j60 über spi3 an den Pins der 
sdio-Schnittstelle schon am laufen. Die Pins für 1bit-sdio sind also 
definitiv frei.

von Grundschüler (Gast)


Lesenswert?

sdio funktioniert jetzt im 1bit-modus mit diesem code:
Nemui Trinomius (http://nemuisan.blog.bai.ne.jp)
1,8MByte/sec sind im Vergleich zu spi gar nicht so schlecht.

von Dieter F. (Gast)


Lesenswert?

Grundschüler schrieb:
> Nemui Trinomius (http://nemuisan.blog.bai.ne.jp)

Spaßvogel - übersetz das mal

von grundschüler (Gast)


Lesenswert?

Dieter F. schrieb:
> Spaßvogel

schaust du hier:
https://github.com/nemuisan/STM32Primer2_GPS_Tracker/tree/master/lib/ff

Der thread ist drei Jahre alt. Irgendwo hab ich den code gefunden. Viel 
anderes gab es in der Zeit nicht. Heute gibt es hal.

von Äxl (geloescht) (Gast)


Lesenswert?


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.