Forum: Mikrocontroller und Digitale Elektronik ARM [STM32] microSD SPI USB Massenspeicher


von Freddy M. (felix_r763)



Lesenswert?

Moin und Guten Tag an alle Leser,

ich komme momentan bei meinem Projekt nicht weiter und benötige Hilfe!
Es geht um folgendes:
Ich habe eine eigene Platine mit einem STM32F205RET6 entworfen, auf dem 
eine microSD Karte per SPI mit dem Controller verbunden ist. Des 
Weiteren habe ich eine USB Schnittstelle für die Verbindung zum PC. Da 
ich wenig Erfahrung mit STM32 habe, habe ich das Programm mit CubeMX 
angefangen und bin der folgenden Anleitung zum Lesen/Schreiben von/auf 
der SD Karte gefolgt: https://blog.naver.com/eziya76/221188701172

Auf diese Weise bin ich nun so weit, dass ich .txt Dateien (Messdaten) 
wie gewünscht auf der SD Karte ablegen kann. Nun fehlt mir aber die USB 
Massenspeicherfunktion um direkt per USB-A Stecker auf die SD Karte 
zugreifen zu können, ich brauche quasi einen integrierten SD 
Kartenleser.
In CubeMX habe ich unter dem Reiter USB_OTG_FS Device_Only 
vorkonfiguriert und und unter dem Reiter USB_DEVICE die Mass Storage 
Class.
In der durch CubeMX generierten Datei usbd_storage_if.c habe ich die 
STORAGE_GetCapacity_FS Funktion erfolgreich angepasst, die 
STORAGE_Read_FS/STORAGE_Write_FS Funktionen scheinen leider nicht zu 
funktionieren und ich denke das genau hier das Problem liegt.
Wenn ich die Platine an meinen Rechner stecke, erscheint das "Laufwerk 
muss formatiert werden" Fenster. Wenn ich dann weiter klicke erscheint 
im Formatieren Fenster sogar die korrekte Kartenkapazität. Wenn ich aber 
dann auf Formatieren klicke dauert es eine Weile bis es letztendlich zu 
einer Fehlermeldung kommt.
Ich habe dann stundenlang verschiedene Beiträge gelesen und immer wieder 
andere Ansätze getestet, leider ohne Erfolg. Es scheint mir so als gäbe 
es im ganzen Internet einfach kein Lösungsbeispiel um eine SD Karte via 
SPI per USB zu lesen, deswegen nun dieser Beitrag.
Am liebsten wäre mir eine einfache Lösung in der usbd_storage_if.c. Ich 
bin für jede Hilfe dankbar.

: Bearbeitet durch User
von Mike R. (thesealion)


Lesenswert?

Du kannst nicht parallel mit dem µC und per USB auf der Karte arbeiten.

Ein einfaches nutzen der SD Karte als "USB Stick" müsste sogar bei den 
Beispielen von ST dabei sein.

von Freddy M. (felix_r763)


Lesenswert?

Mike R. schrieb:
> Du kannst nicht parallel mit dem µC und per USB auf der Karte arbeiten.

Ich möchte ja gar nichts parallel machen, ich möchte entweder Messwerte 
aufnehmen und diese auf der Karte speichern, ODER mich per USB mit dem 
PC verbinden um die Daten von der Karte zu lesen.

>Ein einfaches nutzen der SD Karte als "USB Stick" müsste sogar bei den
>Beispielen von ST dabei sein.

Habe nichts gefunden für die Verbindung via SPI..

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Anscheinend glaubst du, man könne sich funktionierende Programme einfach 
so zusammen klicken und sie würden dann schon ganz alleine das tun, was 
du gerne hättest.

So läuft das aber nicht.

Im Prinzip hast du nun zwei halbfertige Schnittstellen von Cube MX 
bekommen:

1) Für den Zugriff auf die SD Karte
2) Für die Verbindung zum PC

Jetzt musst du aber die Verbindung dazwischen selbst programmieren. Das 
wird CubeMX mit Sicherheit nicht automatisieren.

von Pieter (Gast)


Lesenswert?

moin,

der PC legt auf der SD z.B. ein FAT32 an, nur damit kann er arbeiten.
Der MC kann bei Dir nur Blockzugriffe von 512 Bytes, nix mit FAT32.
Das musst Du dem MC beibringen.

von Stefan F. (Gast)


Lesenswert?

Pieter schrieb:
> moin,
>
> der PC legt auf der SD z.B. ein FAT32 an, nur damit kann er arbeiten.
> Der MC kann bei Dir nur Blockzugriffe von 512 Bytes, nix mit FAT32.
> Das musst Du dem MC beibringen.

Ein FAT32 Treiber ist aber IMHO unter "Middlewares" in Cube MX enthalten 
(fatfs). Nur wird der nicht automatisch mit dem Mass-Storage USB Treiber 
verbunden.

von Mike R. (thesealion)


Lesenswert?

Wie sieht den z.B. deine Funktion
1
SD_disk_write(1,buf,blk_addr,blk_len);
denn aus mit der du versuchst Daten auf die Karte zu schreiben?

von Freddy M. (felix_r763)


Lesenswert?

>Anscheinend glaubst du, man könne sich funktionierende Programme einfach
>so zusammen klicken und sie würden dann schon ganz alleine das tun, was
>du gerne hättest.

Nein, ich glaube nicht das man so einfach jedes Problem lösen kann, aber 
einige eben schon. Wenn du gerne jede Zeile selber schreibst ist das ja 
ok.
Ich verwende gerne libs oder code beispiele in meinen Projekten um Zeit 
zu sparen.


> Ein FAT32 Treiber ist aber IMHO unter "Middlewares" in Cube MX enthalten
> (fatfs). Nur wird der nicht automatisch mit dem Mass-Storage USB Treiber
> verbunden.

Ja ganz genau da liegt doch mein Problem, fatfs funktioniert, ich kann 
ja auch schon Daten auf der SD Karte ablegen, diese dann in einen Card 
Reader stecken und am PC anschauen. Es geht mir hier wirklich nur um die 
Verbindung zum Mass-Storage USB Treiber.

von Stefan F. (Gast)


Lesenswert?

Freddy M. schrieb:
> Ich verwende gerne libs oder code beispiele in meinen Projekten um Zeit
> zu sparen

Mein Chef benutzt gerne das Wort "Glue-Code". Wir benutzen so weit wie 
möglich fertige Bibliotheken und schreiben nur den "Glue-Code" 
dazwischen. Ganz so einfach ist es natürlich nicht, aber es verdeutlicht 
schon, wie sich die Softwareentwicklung in den vergangenen 50 Jahren 
verändert hat.

Wenn der PC auf die SD Karte zugreift, musst den fatfs Treiber 
"abmelden". Ich denke/hoffe das war dir bereits klar.

von Freddy M. (felix_r763)


Angehängte Dateien:

Lesenswert?

Mike R. schrieb:
> Wie sieht den z.B. deine Funktion
>
1
> SD_disk_write(1,buf,blk_addr,blk_len);
2
>
> denn aus mit der du versuchst Daten auf die Karte zu schreiben?

Ich habe die Datei mal angehängt. Sie stammt allerdings wie oben 
beschrieben nicht von mir sondern von:
https://blog.naver.com/eziya76/221188701172

von Mike R. (thesealion)


Lesenswert?

Stefan ⛄ F. schrieb:
> Freddy M. schrieb:
>> Ich verwende gerne libs oder code beispiele in meinen Projekten um Zeit
>> zu sparen
>
> Mein Chef benutzt gerne das Wort "Glue-Code". Wir benutzen so weit wie
> möglich fertige Bibliotheken und schreiben nur den "Glue-Code"
> dazwischen.

Und genau das fehlt hier, der Code, der die funktionierenden  SD Karten 
Routinen mit dem USB MSC verbindet.

Dafür muss man aber die Interfaces der beiden Bibliotheken verstehen um 
den passenden Code zu schreiben, oder Glück haben, dass jemand schon 
vorher genau diese beiden verheiratet hat.

von Mike R. (thesealion)


Lesenswert?

Auf den ersten Blick sehen die Routinen und die Verbindung nicht 
komplett falsch aus.
Vielleicht solltest du mal die Rückgabewerte der SD_* Funktionen 
auswerten um zu sheen, ob die denn tatsächlich erfolgreich ausgeführt 
werden.

Und eine weitere Frage: Wie ist USB_OK definiert?

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.