Donnerstag, Mai 28, 2020

Flash-Speicher als Massenspeicher-Gerät mit STM32 USB-Gerät-Bibliothek

Es ist das flash-Speicher-IC auf dem board, welcher mit meinem STM32F04 ARM-Prozessor. USB-port des Prozessors ist zugänglich für den Benutzer. Ich will, dass mein flash-Speicher werden erkannt als storage-Gerät, wenn an PC angeschlossen via USB.

Als ersten Schritt habe ich mein USB-Klasse als MSC in mein Programm, welches einwandfrei funktioniert. Seit Wann Verbinde ich mein board an den PC, erkennt er ein Massenspeichergerät angeschlossen ist, geben eine Fehlermeldung, dass „Man soll formatieren Sie die disc, bevor Sie Sie verwenden“.

Nun die Frage ist, wie ich definieren kann, meine flash als ’storage‘ zu meinem Prozessor. Die folgenden würde wahrscheinlich ein Teil Ihrer Antwort:
-usbd_msc_storage_template.c
-FAT-Dateisystem

Ich bin mit STM32F446 Prozessor.
FREERTOS und FATFS.
Windows 10 auf meinem PC.

Vielen Dank im Voraus 🙂

1 Kommentar

  1. 8

    Erste von alle – wenn Sie nur brauchen, ist der flash-Speicher, um sichtbar zu werden auf Ihrem PC als Massenspeicher Gerät, dann brauchen Sie nicht FatFS, wie es verwendet wird, um den Zugriff auf den Speicher in eine Datei-für-Datei-Weise von der MCU. Wenn der PC greift auf den Speicher-Geräte, verwaltet das Dateisystem(s) auf es wie von selbst und Sie können wählen, welche Art von Dateisystem wird verwendet, wenn die Formatierung der Festplatte. Unten auf dem niedrigen Niveau bei der Kommunikation mit dem Speicher selbst alle es tut, ist, erzählen, die Speicherung auf „Lesen/schreiben X bytes von der Adresse Y“. Das Gerät muss zum schreiben oder Lesen von Daten und das Ergebnis der operation.

    USB Mass Storage device class

    Dieser USB-Klasse macht Ihrem Gerät und dem host einem Speichergerät, so dass es zu Lesen oder zu schreiben angegebene Anzahl von bytes von/in angegebene Adresse. Bei STM32F4, die Sie erwähnt haben, die Funktionen, die Sie implementieren müssen, sind die folgenden (basierend auf STM32Cube-Bibliothek):

    typedef struct _USBD_STORAGE
    {
      int8_t (* Init) (uint8_t lun);
      int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
      int8_t (* IsReady) (uint8_t lun);
      int8_t (* IsWriteProtected) (uint8_t lun);
      int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
      int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
      int8_t (* GetMaxLun)(void);
      int8_t *pInquiry;
    }USBD_StorageTypeDef;
    

    Wie Sie erwähnt haben, es ist ein USBD_MSC_Template_fops.c /.h Dateien mit einer sample-leer-Vorlage für Sie zu implementieren, die die meisten wichtigen Funktionen Read und Write wo die eigentliche „Arbeit“ ist getan. Initialisieren Sie Ihr Gerät sind Vergangenheit gezeigt werden, wie ein USB-Massenspeicher-Gerät beim Anschluss an einen PC-host-alles, was übrig ist: bei der Initialisierung der USB selbst (USBD_Init), Registrierung der MSC-Geräte-Klasse (USBD_RegisterClass), die Registrierung von Sprach-Struktur im Treiber (USBD_MSC_RegisterStorage) und starten Sie das USB-Gerät Prozess für den Fahrer ( USBD_Start ), wenn eine Verbindung zu den host erkannt wird. Es gibt zahlreiche Beispiele, die genau das tun – finden Sie unter Referenz-Implementierungen für die Entdeckung oder Eval-boards. Sie scheinen gemacht zu haben, die korrekt, wie die host-Anwesen entdeckt Sie Ihr Gerät als USB-MSC-Gerät und berichtete, dass es als nicht formatiert.

    Der Grund, Ihr system sagt, dass das Laufwerk nicht formatiert ist, weil die leere Implementierung in die usbd_msc_storage_template.c Datei gibt erfolgreicher Ausführung (return code 0) für STORAGE_Read Funktion, aber nicht tatsächlich ausführen, Lesen – keine Daten zurück geschickt. Während dies kann variieren von host zu host, je nach Betriebssystem, die wahrscheinlichsten Szenarien sind, dass Sie entweder eine Meldung über Speicher nicht formatiert oder die Daten werden beschädigt.

    Schnittstellen USB Mass Storage device Rückrufe mit physischen Speicher

    Wie oben erwähnt, ruft USBD_MSC_RegisterStorage registrieren, wird Ihre Struktur in der USB-MSC-Gerät der Klasse Treiber. An dieser Stelle der Treiber selbst nennen Ihre zur Verfügung gestellten Funktionen in den passenden Momenten – jederzeit auf Anfrage vom host. Wenn der Zielspeicher wurde eine SD-Karte, die die Natürliche Schritt wäre zunächst Funktionen implementieren, den Zugriff auf Ihre SD-Karte. Sobald diese Funktionen sind getestet und bewiesen zu arbeiten, alles, was übrig wäre, steckte Sie in den USB-MSC-Gerät Read und Write – Funktionen und – bei korrekter interrupt-Prioritäten – es sollte in der Regel „out of the box“. Das system sollte in der Lage sein, die Karte zu formatieren und später Lesen und schreiben von Dateien, die alle durch Ihre MCU.

    Es funktioniert auf die gleiche Weise für jede Art von Speicher, den Sie wählen. Die einzige Voraussetzung ist die Umsetzung der USBD_StorageTypeDef callback-Funktionen genau so, wie Sie sind. Dies bedeutet, dass der host zu schreiben beliebige Anzahl von zufälligen bytes an eine beliebige Adresse innerhalb der gemeldeten Adresse Raum und Sie entweder vollständig gehorchen (schreiben alle Daten als es ist) und zurück „erfolgreiche Durchführung“ oder einen Fehler zurück, was wahrscheinlich bedeuten wird, dass Ihr Laufwerk bekommen wird ausgehängt, und der Benutzer wird aufgefordert, mit einer Fehlermeldung. Im Falle der liest dies bedeutet, dass wenn der host verlangt, dass X-Anzahl von bytes von der Adresse Y, das Gerät zurückgeben muss, genau diese Menge an Daten. Dies bedeutet, dass wenn der Speicher-Typ ist nicht perfekt geeignet für diese Art von Zugriff, es wird mehr Arbeit, die getan werden in der Ebenen-Zugriff auf den physikalischen Speicher, um zu gehorchen, die USB-MSC-Schnittstelle. Alle, natürlich führt uns zu dem letzten Punkt unten.

    Flash-Speicher als storage-Dateisystem

    Für den flash-Speicher, wo Sie Zugriff auf die raw-Daten direkt gibt es bestimmte Nachteile, dass Sie nicht perfekt geeignet für filesystem-Anwendungen. Diese kommen von der Art, wie diese Erinnerungen konstruiert werden. Obwohl erreichbar, gibt es zusätzliche Schritte, die noch getan werden muss, um sich zu verstecken diese Mängel:

    1. Schreiben von „1“s individuell – Flash-Speicher, wenn Sie direkt aufgerufen werden können Sie nur zum schreiben von „0“ bits, die unter einer bestimmten Adresse. Sobald bestimmte bit gekippt wurde zu „0“, kann es nicht mehr werden invidually wieder umgedreht auf „1“. Um dies zu tun, wird der gesamte Datenblock gelöscht werden muss, ersten. Je nach flash-memory-Teil, dies wird in der Regel Bereiche, 512, 4096, etc. bytes. Dies bedeutet, dass, wenn Sie ändern wollte bestimmtes byte aus 1 (Binär 0000 0001) bis 4 (Binär 0000 0100), Sie würden zu tun haben-Lesen-löschen-schreiben der gesamten Branche. Für Sie bedeutet dies, dass wenn auch nur einer von den bits, dass die Gastgeber-Anfragen zu schreiben, muss umgedreht werden und von „0“ auf „1“, müssen Sie löschen Sie zuerst diesen Bereich.

    2. Random-access – Abhängig von der Art der Speicher (NOR/NAND), die Sie möglicherweise oder möglicherweise nicht in der Lage sein, um access-Daten nach dem Zufallsprinzip. Insbesondere für NOCH blinkt, können Sie Daten Lesen oder schreiben einzeln, während für NAND-Erinnerungen durch, wie die Zellen miteinander verbunden sind und nur die Seite der Zugriff erlaubt ist. Dies bedeutet, dass Sie haben können, zu Lesen oder zu schreiben, die mehr Daten als notwendig.

    3. Write-endurance – flash-Speicher haben eine bestimmte Anzahl von Schreibzyklen für jede Zelle. Dies bedeutet, dass wenn Sie ständig schreiben Daten an die selbe Adresse können Sie sehr quicky zu überschreiten. Dies ist besonders wichtig für Dateisysteme, wie FAT, wo das FETT wird ständig geschrieben. Dieses Problem ist durch die Umsetzung in irgendeiner form von wear-leveling, bei denen die physikalische Sektor Schreibvorgänge gleichmäßig verteilt sind. Natürlich können Sie wählen, um es zu Lesen-nur durch Rückgabe von true aus IsWriteProtected, wenn das möglich ist für Ihre Anwendung.

    Nun als aktuelle SD-Karten erreichen – alle SD-Karten heutzutage, die ich bin mir dessen bewusst, enthalten einen einfachen mikrocontroller (eine Art 8081, ARM7 oder ähnlich), die setzt alles oben plus das SD-Protokoll. Wenn die Unterhaltung auf die Karte, die Sie nicht wirklich sprechen, um die raw-Speicher, sondern Sie kommunizieren mit der MCU sitzen zwischen Ihnen und Ihren Daten. Seine Aufgabe ist es, Ihnen eine illusion von der perfekten kontinuierlicher Daten.

    • Ich danke Ihnen sehr für Ihre schnelle Antwort Jacek. Ich würde versuchen, die Implementierung dieser API-Funktionen in usbd_msc_storage_template.c und sehen, was passiert.

Kostenlose Online-Tests