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
BYTEresponse_R(BYTEs)
2
{
3
BYTEa=0,b=0,c=0,r=0,crc=0;
4
BYTEi,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)return2;
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
elsei++;
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
returnr;
44
}
Gibt es irgendwo eine nachvollziehbare Anleitung über die
Initialisierung der sd-card per sdio??
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.
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?
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.
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.
>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.
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.
>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.
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.
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.
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.