Forum: Mikrocontroller und Digitale Elektronik STM32F4 SDIO missbrauchen - geht das?


von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Hallo zusammen,

ich möchte einfach 6 Bits parallel mit einem gemeinsamen Takt-Signal 
seriell per DMA in sechs Schieberegister-Kaskaden (je 4 x STP16CPC26) 
schieben.

Ich brauche kein MISO, aber 6 x MOSI.

Das SDIO vom STM32F4 kann ja auch einen 8-Bit-Modus und wäre dafür 
optimal, die zwei Bits Overhead würden mich nicht stören. ABER:

Im STM32F4 Reference manual steht zum Secure digital input/output 
interface (SDIO):

> "The SDIO does not have an SPI-compatible communication mode."

Was heißt das? Wo ist die Einschränkung?

Nach zwei Stunden Lektüre blicke ich noch nicht durch.

Kann man den ganzen Kram mit SD_Command() und SD_Response() weglassen 
und einfach den DMA-Controller initialisieren, so wie man das bei SPI 
auch macht, und dann wird gesendet?

Vielleicht kennt sich ja jemand genauer mit dem SDIO aus.

Vorzugsweise würde ich gern einen STM32F411 nutzen.

VG Torsten

: Bearbeitet durch User
von Detlef K. (adenin)


Lesenswert?

Nein, das geht nicht.
SDIO benutzt ist ein komplexes Protokoll um sich zB. mit SD-Katen zu 
verständigen. Da werden Datenpackete mit Kommandos und CRC gesendet, und 
es werden bestimmte Antworten erwartet, und das auch noch in einem 
bestimmten Zeitfenster.

Aber es hindert dich ja niemand, diese Bits und das Clock (auch nur ein 
zusätzliches Bit) mit doppelter Clockfrequenz (weil, Clock muss ja 
togglen) über DMA auf einen Port auszugeben.

von Pd G. (pdg)


Lesenswert?

Wenn du in besagtem Reference Manual weiterliest, steht da:
"Several commands required for SD memory devices are not supported by 
either SD I/O-only cards or the I/O portion of combo cards. Some of 
these commands have no use in SD I/O devices, such as erase commands, 
and thus are not supported in the SDIO. [...]" etc.

Weiterhin ist dort ein Verweis auf die SDIO-Spec Rev 1 enhalten, die du 
z.B. hier findest:
http://www.sandisk.com/media/File/OEM/Manuals/SD_SDIO_specsv1.pdf

Daraus geht i.W. hervor, dass SDIO und SAD-Cards dasselbe Interface 
nutzen und nur einige Funktionen SD-Card-spezifisch sind und von 
SDIO-Modulen ignoriert werden.

Da du eh nicht standardkonform sein und das SDIO fremdnutzen willst, 
spricht m.E. nichts gegen den Einsatz des SDIO-Ports für SPI-Anwendungen 
unter Benutzung von MISO/MOSI.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Detlef Kunz schrieb:
>  … und CRC gesendet, und es werden bestimmte Antworten erwartet, und
> das auch noch in einem bestimmten Zeitfenster.

Und das kann man nicht deaktivieren? Schade.

Unter Figure 218 "Data path state machine (DPSM)" steht: "In stream 
mode, the DPSM sends data to a card while the enable bit is high and the 
data counter is not zero. It then moves to the Idle state."

Vielleicht geht es damit auch ohne CRC. Aber ich bin halt unsicher.

Detlef Kunz schrieb:
> Aber es hindert dich ja niemand, diese Bits und das Clock (auch nur ein
> zusätzliches Bit) mit doppelter Clockfrequenz (weil, Clock muss ja
> togglen) über DMA auf einen Port auszugeben.

Wenn ich DMA Bit-Banging richtig verstehe, muss ich für jeden Takt 32 
Bits im DMA-Buffer für das BSRR verbraten. Der Overhead wäre "32 zu 6" 
oder bei doppelter Clockfrequenz "64 zu 6". Richtig?

Was nicht erst erwähnt habe, da erst in diesem Zusammenhang relevant:

Da wird noch mit "1/8-Scan" gemultiplext, es sind also 3072 Bits pro 
Update und dann noch ca. 8 Zeitschlitze, um die LEDs per BAM (wie PWM) 
ein- und auszuschalten. Insgesamt wären es 3072 x 8 Bits also 3KByte 
Netto-Rohdaten im RAM.

Bild siehe Beitrag "billige Matrix-Module 1/16-Scan = schlechte Qualität"

Bei einem Overhead von "8 zu 6" mit SDIO käme ich mit 4 KByte RAM aus.

Beim DMA Bit-Banging mit "64 zu 6" bräuchte ich aber 32 KByte RAM.

Ungern, ginge aber auch. Und eventuell könnte man für das Clock-Signal 
einen Timer nehmen, um Speicher zu sparen.

Pd G. schrieb:
> spricht m.E. nichts gegen den Einsatz des SDIO-Ports für SPI-Anwendungen

Sicher? Detlef schrieb oben, was ich befürchtet hatte.

: Bearbeitet durch User
von Detlef K. (adenin)


Lesenswert?

Torsten C. schrieb:
> Wenn ich DMA Bit-Banging richtig verstehe, muss ich für jeden Takt 32
> Bits im DMA-Buffer für das BSRR verbraten. Der Overhead wäre "32 zu 6"
> oder bei doppelter Clockfrequenz "64 zu 6". Richtig?

Falsch.

Du nimmst zB. PORTA[0..5] für die MOSI PORTA6 für CLK.
PORTA7 kannst Du als frei verfügbaren Input benutzen, aber nicht als 
frei verfügbaren Output, weil das vom DMA gesteuert werden wird.
Du schreibts so in diesem Beispiel mit der DMA ins unterste Byte vom 
ODRA gleichzeitig die 6 DatenBit und 1 ClkBit (und ein Bit was keine 
Bedeutung hat).

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Detlef Kunz schrieb:
> Du schreibts so in diesem Beispiel mit der DMA ins unterste
> Byte vom ODRA

Ah, cool. Beim STM32F1 galt noch:

> "These bits can be … accessed in Word mode only."

Wenn ich für das Clock-Signal einen Timer-OC nehme (vielleicht sogar den 
gleichen, wie für DMA, falls das geht), käme ich ja auch auf einen 
Overhead von nur "8 zu 6". Cool!

Oder hat es Nachteile, den Clock per Timer-OC zu erzeugen, die ich nicht 
sehe?

Dann lasse ich das wohl besser mit dem SDIO und bedanke mich für die 
Hinweise. :-)

Danke, Detlef!

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Torsten C. schrieb:
> Vielleicht geht es damit auch ohne CRC. Aber ich bin halt unsicher.

Es geht wohl beides (SDIO und BIT-BLIT), auch Clock per Timer-OC.

Zufällig jetzt erst gefunden, wo ich eigentlich ein BIT-BLIT-Beispiel 
gesucht habe:

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FMisuse%20SDIO%20interface%20to%20drive%20parallel%208bit%20graphics%20LCD

von Detlef K. (adenin)


Lesenswert?

Torsten C. schrieb:
> Torsten C. schrieb:
>> Vielleicht geht es damit auch ohne CRC. Aber ich bin halt unsicher.
>
> Es geht wohl beides (SDIO und BIT-BLIT), auch Clock per Timer-OC.
>
> Zufällig jetzt erst gefunden, wo ich eigentlich ein BIT-BLIT-Beispiel
> gesucht habe:
>
> https://my.st.com/public/STe2ecommunities/mcu/List...

Wenn Du's genau liest, wirst Du feststellen, das für SDIO keine 
(miß)brauchbare Lösung gefunden wurde.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Detlef Kunz schrieb:
> Wenn Du's genau liest, wirst Du feststellen, das für SDIO keine
> (miß)brauchbare Lösung gefunden wurde.

Stimmt:
> "the clock will start 2 bits earlier, and it will stop only
>  about 50 bits later"

Wahrscheinlich hätte ich noch ewig versucht, das irgendwie hinzukriegen, 
womöglich noch mit 'nem Timer und 'nem Und-Gatter oder wie auch immer.

Der Hinweis, dass beim STM32F4 unterste Byte vom ODRA einzeln 
adressierbar ist, war echt gut! Das hat mir viel Arbeit erspart. :-)

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.