STM32 SDMMC & SDIO - warum nur maximal 1 SD-Karte?

Ich schreibe einen SDMMC-Treiber für mein C++-RTOS für Mikrocontroller und es gibt eine Sache, die mich wirklich verwirrt, die es schwierig macht, eine Entscheidung über die Klassenhierarchie zu treffen. Im Referenzhandbuch für STM32F7 (dasselbe gilt aber auch für andere Chips, sowohl für SDMMC- als auch für SDIO-Peripherie) können Sie ganz am Anfang Folgendes lesen:

Die aktuelle Version des SDMMC unterstützt jeweils nur eine SD/SDIO/MMC4.2-Karte und einen Stapel von MMC4.1 oder früher.

Woher kommt diese Einschränkung? Soweit ich SD-Karten verstehe (was angesichts der "Qualität" der SD-Dokumentation schwierig ist), sollte die Verwendung einer Karte genau so aussehen wie die Verwendung von zehn - aus Sicht des SDMMC-Peripheriegeräts sendet dies nur Befehle, empfängt Antworten und Datenblöcke übertragen. Um mehr als eine Karte zu verwenden, müssen Sie nur sicherstellen, dass Sie mit CMD7 die richtige "auswählen", bevor Sie mit der ausgewählten Karte sprechen, und das war's. Aber dieser Auswahlprozess wird vollständig in der Software durchgeführt, in der höheren Schicht als der SDMMC-Treiber.

Auch wenn auf der ersten Seite des Kapitels über SDMMC-Peripheriegeräte steht, dass nur 1 SD-Karte verwendet werden kann, können Sie Folgendes weiterlesen:

39.4.4 Kartenidentifizierungsprozess

...

Für die SD-Karte beginnt der Identifizierungsprozess bei der Taktrate F od , und die SDMMC_CMD-Leitungsausgangstreiber sind Push-Pull-Treiber anstelle von Open-Drain. Der Registrierungsprozess wird wie folgt durchgeführt:

  1. Der Bus ist aktiviert.
  2. Der SDMMC-Kartenhost sendet SD_APP_OP_COND (ACMD41).
  3. Die Karten antworten mit den Inhalten ihrer Betriebszustandsregister.
  4. Die inkompatiblen Karten werden in den inaktiven Zustand versetzt.
  5. Der SDMMC-Kartenhost sendet ALL_SEND_CID (CMD2) an alle aktiven Karten.
  6. Die Karten senden ihre eindeutigen Kartenidentifikationsnummern (CIDs) zurück und treten in den Identifikationszustand ein.
  7. Der SDMMC-Kartenhost gibt SET_RELATIVE_ADDR (CMD3) an eine aktive Karte mit einer Adresse aus. Diese neue Adresse wird relative Kartenadresse (RCA) genannt; sie ist kürzer als die CID und adressiert die Karte. Die zugewiesene Karte wechselt in den Standby-Zustand. Der SDMMC-Kartenhost kann diesen Befehl erneut ausgeben, um den RCA zu ändern. Der RCA der Karte ist der zuletzt zugewiesene Wert.
  8. Der SDMMC-Kartenhost wiederholt die Schritte 5 bis 7 mit allen aktiven Karten.

SDMMC unterstützt also nur eine Karte, aber sie beschreiben, wie man viele erkennt ...

Ich habe einen Hinweis in der erwähnten SD-Dokumentation gefunden:

4.3.11 Hochgeschwindigkeitsmodus (25 MB/s Schnittstellengeschwindigkeit)

...

Da es nicht möglich ist, zwei oder mehr Karten zu steuern, falls jede von ihnen einen anderen Timing-Modus (Standard- und Hochgeschwindigkeitsmodus) hat, und um strenges Timing zu erfüllen, soll der Host nur eine Karte steuern. Das CLK/CMD/DAT-Signal muss 1-zu-1 zwischen dem Host und der Karte verbunden werden.

Aber dies betrifft (nach meinem Verständnis) nur den Hochgeschwindigkeitsmodus, Sie können den Standardgeschwindigkeitsmodus beibehalten, der (überraschenderweise (; )) der Standardmodus nach dem Einschalten der Karte ist.

Der Grund, warum ich diese Frage stelle, ist, dass ich mich nicht entscheiden kann, ob ich die Klassenhierarchie mit der Annahme modellieren soll, dass das SDMMC-Peripheriegerät die Speicherkarte ist , oder ob dieses SDMMC-Peripheriegerät durch die dedizierte Klasse „SD/MMC-Host“ dargestellt werden sollte. die später einem Speicherkartenobjekt zugeordnet werden können. Das zweite Modell ist viel näher an der Situation, die möglich ist, wenn Speicherkarten im SPI-Modus verwendet werden, wo Sie beliebig viele an denselben SPI-Bus anschließen können.

Vielen Dank im Voraus für alle Informationen (;

Aller Wahrscheinlichkeit nach wurde der Treibercode einfach nicht so geschrieben, dass er mehr als eine gleichzeitige Instanz unterstützen kann. Wie Sie festgestellt haben, gibt es anscheinend keinen hardwaretechnischen Grund.
@brhans - das Problem hier ist, dass das von mir erwähnte Referenzhandbuch für STM32F7 nur für den Hardwareteil gilt und nichts mit dem Softwareteil zu tun hat (der ausschließlich auf der Entwicklerseite liegt).
Ich habe den Teil verpasst, wo Sie die Treiber selbst schreiben ... in diesem Fall keine Ahnung.
Wenn Sie nur die Klassenhierarchie festlegen müssen, würde ich einfach die flexibelste Lösung wählen. Möglicherweise möchten Sie Ihr System später auf andere Arten von Mikrocontrollern portieren, die diese Einschränkung nicht haben.

Antworten (1)

Meine bescheidenen 50 ct (da ich gerade ein Problem mit dem CMD-Signal der SD-Karte untersuche): SD-Karten haben keinen Open-Drain-Modus, daher besagt die Spezifikation, dass (mindestens) CMD-Leitungen für mehrere Karten getrennt werden müssen. Daher ist es möglich, mehrere Karten anzusteuern, wenn Sie die CMD-Signal-Multiplexer-Logik extern bereitstellen, die Sie auf jedem Kartenschalter steuern müssen.

Ich weiß nicht, ob IO-Leitungen miteinander verbunden werden können. Vielleicht.

Der Busaufbau erfolgt grundsätzlich im MCI-Treiber während Initialization(), gefolgt von mehreren Aufrufen von Control() (ausgelöst durch den fmount()-Aufruf des Dateisystems). Dort werden Busgeschwindigkeit, Betriebsart etc. in den Prozessorregistern eingestellt. Wenn Sie also auf mehrere Karten zugreifen möchten, müssen Sie die jeweilige Karte zwischen den Schaltern ein- und aushängen, damit die Register korrekt eingestellt sind.

Nur ein paar Gedanken...

Obwohl es schwierig ist, die neueste vollständige Spezifikation zu finden, können Sie nach einem geleakten Produkthandbuch für sichere digitale Karten wie diesem suchen , das eine alte Version der vollständigen Spezifikation enthält. Darin finden Sie die weggelassenen Abschnitte 3.2 „SD Bus Topology“ und 3.4.3 „Bus Signal Line Load“. Das Diagramm in 3.2 zeigt separate CMD- und DAT-Leitungen, aber es ist auch möglich, einen einzigen DAT-Bus im SD-Modus (nicht UHS oder PCIE) zu verwenden, solange die Signalintegritätsprobleme behoben werden.