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
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.
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.
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
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).
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.