Forum: Mikrocontroller und Digitale Elektronik China Board mit SDCard Adapter und Stm32xxx SDMMC


von Hans-Georg L. (h-g-l)


Lesenswert?

Hallo,
bei allen China STM32H7 Boards die ich habe ist der Card detect Schalter 
nicht verdrahtet und führt dazu, wenn keine SD Karte gesteckt ist, das 
SDMMCx_SD_Init nicht funktioniert und in der Error Loop landet.
Der Schalter ist am Adapter vorhanden, schaltet nach GND, und kann auf 
einen Eingang mit pullup, evtl. mit Schutzwiderstand, nach verdrahtet 
werden. Oder die HAL muss angepasst werden dann gibt es aber keinen 
Interrupt wenn Karte gesteckt/entfernt wird.

Betroffen sind die Boards von Fanke und DevEBox mit STM32H750 oder 
STM32H743 Controller und von WEACT mit STM32H7R3.
Ist das in China so üblich, den Pin nicht zu verdrahten ?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hans-Georg L. schrieb:

> Ist das in China so üblich, den Pin nicht zu verdrahten ?

Nicht nur in China. Fakt ist nämlich, dass dieser primitive Mechanismus 
zur presence detection eigentlich überflüssig ist. Das kann man auch auf 
andere Weise ermitteln.

von Hans-Georg L. (h-g-l)


Lesenswert?

Ob S. schrieb:
> Hans-Georg L. schrieb:
>
>> Ist das in China so üblich, den Pin nicht zu verdrahten ?
>
> Nicht nur in China. Fakt ist nämlich, dass dieser primitive Mechanismus
> zur presence detection eigentlich überflüssig ist. Das kann man auch auf
> andere Weise ermitteln.

Und wie unterscheide ich zwischen einer defekten und einer nicht 
gesteckten Karte ?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hans-Georg L. schrieb:

> Und wie unterscheide ich zwischen einer defekten und einer nicht
> gesteckten Karte ?

Wozu sollte das wichtig sein? Benutzbar ist die Karte in beiden Fällen 
nicht und eine Fehlermeldung á la "Keine Karte gesteckt oder gesteckte 
Karte defekt" überläßt dem Benutzer die Wahl. Der wird ja wohl wissen, 
ob er eine reingesteckt hat oder nicht. Oder kann zumindest nachschauen.

von Hans-Georg L. (h-g-l)


Lesenswert?

Ob S. schrieb:
> Hans-Georg L. schrieb:
>
>> Und wie unterscheide ich zwischen einer defekten und einer nicht
>> gesteckten Karte ?
>
> Wozu sollte das wichtig sein? Benutzbar ist die Karte in beiden Fällen
> nicht und eine Fehlermeldung á la "Keine Karte gesteckt oder gesteckte
> Karte defekt" überläßt dem Benutzer die Wahl. Der wird ja wohl wissen,
> ob er eine reingesteckt hat oder nicht. Oder kann zumindest nachschauen.

Wenn du davon ausgehst, das immer eine Anzeige vorhanden und jemand vor 
Ort ist mag das sein.

Wenn ich nun so etwas realisieren will  ...
1
if( detect_card() ) {
2
  
3
   if( connect_card() ) {
4
    do_A()
5
   else {
6
    call_service();
7
   } 
8
   
9
} 
10
else {
11
  do_B();
12
}}

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hans-Georg L. schrieb:

> Wenn du davon ausgehst, das immer eine Anzeige vorhanden und jemand vor
> Ort ist mag das sein.

Auch wenn das nicht der Fall ist. Denn wenn niemand vor Ort ist, muss 
bei Nichtverfügbarkeit in jedem der beiden Fehlerfälle der Service 
gerufen werden, wenn eine funktionsfähige Karte benötigt wird, um den 
Job der Gesamtsache erledigen zu können.

Was deinen Pseudocode betrifft: Was soll denn do_B() ausrichten? Den 
CD-Card-Einlegeroboter anwerfen?

von Hans-Georg L. (h-g-l)


Lesenswert?

Ob S. schrieb:
> Hans-Georg L. schrieb:
>
>> Wenn du davon ausgehst, das immer eine Anzeige vorhanden und jemand vor
>> Ort ist mag das sein.
>
> Auch wenn das nicht der Fall ist. Denn wenn niemand vor Ort ist, muss
> bei Nichtverfügbarkeit in jedem der beiden Fehlerfälle der Service
> gerufen werden, wenn eine funktionsfähige Karte benötigt wird, um den
> Job der Gesamtsache erledigen zu können.
>
> Was deinen Pseudocode betrifft: Was soll denn do_B() ausrichten? Den
> CD-Card-Einlegeroboter anwerfen?

Nö warum, die Karte ist nur Optional.
Wenn sie nicht da ist, ist es kein Fehler aber wenn sie da ist muss es 
die richtige sein und funktionieren. Plan B funktioniert immer ;-)

Vor Ort hast du oft nur angelerntes Personal oder auch einen Endkunden. 
Da funktioniert das genau so: "Lauf mal dahin und stecke die Karte rein, 
wenn die grüne LED weiter leuchtet ist alles Ok, wenn sie ausgeht und 
die rote LED angeht rufe den Service an". Dazu muss der Bediener auch 
nicht in den Kartenslot steigen ;-)))

Selbst die ganzen Arduino Adapter vom Chinesen haben den Kontakt 
herausgeführt, teilweise mit pullup und Längswiderstand.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Wer baut mit China Eval Boards Industrieprodukte mit Servicetechniker 
und Fernwartung?

von Hans-Georg L. (h-g-l)


Lesenswert?

Niklas G. schrieb:
> Wer baut mit China Eval Boards Industrieprodukte mit Servicetechniker
> und Fernwartung?

Das ist eine ganz andere Frage.

Es ging doch darum, das alle es angeblich so machen ...

Ob S. schrieb:
> Nicht nur in China. Fakt ist nämlich, dass dieser primitive Mechanismus
> zur presence detection eigentlich überflüssig ist. Das kann man auch auf
> andere Weise ermitteln.

Dafür habe ich Beispiele aus der Praxis genommen. Bei einer 
Eigenentwicklung würde ich diese Leiterbahn und die 2 Widerstände auch 
nicht einsparen.
Bisher ist auch noch nichts über alternative Methoden bekannt. Die 
Geschichte mit CD/D3 funktioniert nur mit 1Bit SPI. Die SDMMC benutzt 
aber 4 Bit Daten. Clock und CMD. Was wäre die Alternative ?. eine Menge 
clock Signale senden und schauen ob was an den anderen Pins wackelt und 
das im poll Modus ? . Da ist mir ein Pin mit Interrupt lieber.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hans-Georg L. schrieb:
> . Die Geschichte mit CD/D3 funktioniert nur mit 1Bit SPI. Die SDMMC
> benutzt aber 4 Bit Daten.

Nö, das 4bit Interface wird erst später aktiviert, die Karte startet im 
1bit SDMMC ("SD bus") Modus (CMD, CLK, D0).
Ist schon viele Jahre her, aber ich meine man kann die Karte wunderbar 
über D3 erkennen. Außer eben der Widerstand in der Karte ist defekt, das 
kann man dann nicht unterscheiden von "keine Karte drin".

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Niklas G. schrieb:
> Hans-Georg L. schrieb:
>> . Die Geschichte mit CD/D3 funktioniert nur mit 1Bit SPI. Die SDMMC
>> benutzt aber 4 Bit Daten.
>
> Nö, das 4bit Interface wird erst später aktiviert, die Karte startet im
> 1bit SDMMC ("SD bus") Modus (CMD, CLK, D0).
> Ist schon viele Jahre her, aber ich meine man kann die Karte wunderbar
> über D3 erkennen. Außer eben der Widerstand in der Karte ist defekt, das
> kann man dann nicht unterscheiden von "keine Karte drin".

ST scheint das aber nicht zu wissen. Die HAL schmiert bei der 
Initialisierung ohne Karte jedenfalls ab.
Müsste ich mir bei Gelegenheit mal näher anschauen, habe aber im Moment 
andere Prioritäten. Mein Post war nur dazu gedacht darauf aufmerksam zu 
machen das es bei den Boards an der Stelle Probleme geben kann.

von Manfred P. (pruckelfred)


Angehängte Dateien:

Lesenswert?

Hans-Georg L. schrieb:
> Vor Ort hast du oft nur angelerntes Personal oder auch einen Endkunden.
> Da funktioniert das genau so: "Lauf mal dahin und stecke die Karte rein,
> wenn die grüne LED weiter leuchtet ist alles Ok, wenn sie ausgeht und
> die rote LED angeht rufe den Service an".

Kommt auf das Produkt an, man kann Speicherkarten auch versenden.

Hans-Georg L. schrieb:
> Selbst die ganzen Arduino Adapter vom Chinesen haben den Kontakt
> herausgeführt, teilweise mit pullup und Längswiderstand.

Unsinn, zeige mir den Anschluß auf dem Foto.

Ich habe SD-Karten in selbst programmierter Umgebung im Einsatz, das ist 
es nicht schwierig, deren Abwesenheit oder Nichtbeschreibbarkeit zu 
erkennen.

von Thomas W. (datenreisender)


Lesenswert?

Hans-Georg L. schrieb:
> Niklas G. schrieb:
>> Hans-Georg L. schrieb:
>>> . Die Geschichte mit CD/D3 funktioniert nur mit 1Bit SPI. Die SDMMC
>>> benutzt aber 4 Bit Daten.
>>
>> Nö, das 4bit Interface wird erst später aktiviert, die Karte startet im
>> 1bit SDMMC ("SD bus") Modus (CMD, CLK, D0).
>> Ist schon viele Jahre her, aber ich meine man kann die Karte wunderbar
>> über D3 erkennen. Außer eben der Widerstand in der Karte ist defekt, das
>> kann man dann nicht unterscheiden von "keine Karte drin".
>
> ST scheint das aber nicht zu wissen. Die HAL schmiert bei der
> Initialisierung ohne Karte jedenfalls ab.

Es wird Dir nicht helfen, aber Du bist nicht allein:

https://community.st.com/t5/stm32-mcus-products/stm32h755-stalls-when-sdmmc-interface-is-enabled/td-p/207968

https://community.st.com/t5/stm32-mcus-products/sd-init-failure-on-stm32h743i-eval2-with-example-code/td-p/317214

https://stackoverflow.com/questions/78894967/sdmmc-not-working-on-stm32h7-ucontrollers

Es scheint auch eine Abhaengigkeit von Firmware-Staenden zu geben. Ich 
erinnerte mich (an einem STM32F407) dass ich die MX_SDMMC1_SD_Init(void) 
veraendern musste (Start der Card in 1B-Bit, dann manuell auf 4Bit 
umschalten). Ob Dir bei einem H7 hilft, weiss ich nicht.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hans-Georg L. schrieb:
> ST scheint das aber nicht zu wissen

Das heißt nichts. Ich hatte damals meinen eigenen Treiber für SDIO/SDMMC 
implementiert. Ist nicht so schwierig.

von Hans-Georg L. (h-g-l)


Lesenswert?

Habe mir nochmal das RM durchgelesen, von der SDMMC Hardware wird bei 
der Karteninitialisierung der D3 pin nicht abgefragt. Man kann aber eine 
Bootsequenz schicken und einen acknowledge Interrupt mit Timeout 
aktivieren.
Das könnte man der HAL Initialisierung vielleicht davor schalten. Aber 
bei all diesen Methoden muss ich in Abständen pollen ob eine Karte 
gesteckt oder gezogen wird. Den detect pin kann ich beim booten abfragen 
und später bekomme ich einfach einen Interrupt und kann sogar schneller 
reagieren. Die Karte dann initialisieren und mounten oder unmounten. 
Finde ich einfacher und den extra pin kann ich verschmerzen ;-).

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hans-Georg L. schrieb:
> von der SDMMC Hardware wird bei der Karteninitialisierung der D3 pin
> nicht abgefragt

Ja, das macht man einfach per GPIO.

Hans-Georg L. schrieb:
> Den detect pin kann ich beim booten abfragen

Den D3 Pin kann man exakt genau so abfragen.

Hans-Georg L. schrieb:
> später bekomme ich einfach einen Interrupt und kann sogar schneller
> reagieren

Der D3 Pin lässt sich sicher auch als Interrupt konfigurieren... Wenn 
man unbedingt auf die Mikrosekunde genau auf das Einstecken reagieren 
muss... Entprellen nicht vergessen.

Hans-Georg L. schrieb:
> Aber bei all diesen Methoden muss ich in Abständen pollen ob eine Karte
> gesteckt oder gezogen wird

Musst du sowieso immer, auch beim Detect Pin. Jeder Befehl kann schief 
gehen, das musst du erkennen können. Ob die Ursache Wackelkontakt oder 
Karte gezogen ist, ist für die Software egal.

von Hans-Georg L. (h-g-l)


Lesenswert?

Langsam klärt sich die Sache ...
Nach etlichen erfolglosen Versuchen mit Oszi und einem Adapter habe ich 
folgendes gefunden:

Die SDCard hat intern an D3 einen 50kOhm pullup, und kann mit einem 
externen (hochohmigen) pulldown detektiert werden.
Quelle:
https://community.st.com/t5/stm32-mcus-products/how-to-check-from-firmware-whether-sd-card-inserted-in-slot/td-p/370237
Das ist auch mit dem Oszi nachvollziehbar.

Die von mir genannten Boards haben einen 10kOhm pullup auf D0,D1,D2,D3, 
also parallel zu den 50kOhm und daher funktioniert das bei den Boards 
nicht.

Die HAL Funktion MX_SDMMC1_SD_Init initialisiert nicht nur das SDMMC 
Peripheral, sondern auch die "nicht" vorhandene Karte und geht deshalb 
in die Error Loop.

jetzt sind wir hoffentlich wieder beieinander ;-)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Hans-Georg L. schrieb:

> Die SDCard hat intern an D3 einen 50kOhm pullup, und kann mit einem
> externen (hochohmigen) pulldown detektiert werden.

Genau.

> Die von mir genannten Boards haben einen 10kOhm pullup auf D0,D1,D2,D3,

Schrott. Sollte sich aber mit Hilfe eines gewöhnlichen Lötkolbens 
innerhalb kürzester Zeit beheben lassen.

Warum Schrott? Weil die Datenleitungen Push-Pull sind und Pullups bei 
hoher Geschwindigkeit störend wirken können. U.a. deswegen ist sogar der 
interne Pullup der Karte an D3 per Software-Kommando abschaltbar.

von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

Ob S. schrieb:
> Hans-Georg L. schrieb:
>
>> Die SDCard hat intern an D3 einen 50kOhm pullup, und kann mit einem
>> externen (hochohmigen) pulldown detektiert werden.
>
> Genau.
>
>> Die von mir genannten Boards haben einen 10kOhm pullup auf D0,D1,D2,D3,
>
> Schrott. Sollte sich aber mit Hilfe eines gewöhnlichen Lötkolbens
> innerhalb kürzester Zeit beheben lassen.
>
> Warum Schrott? Weil die Datenleitungen Push-Pull sind und Pullups bei
> hoher Geschwindigkeit störend wirken können. U.a. deswegen ist sogar der
> interne Pullup der Karte an D3 per Software-Kommando abschaltbar.

Damit ist das Problem noch nicht ganz gelöst. Der Pulldown fehlt dann 
noch. Der interne Pulldown liegt auch bei ca. 50kOhm das ist zu wenig. 
Da ist ein Kondensator in der Nähe da müsst man GND abgreifen können.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ob S. schrieb:
> Warum Schrott? Weil die Datenleitungen Push-Pull sind und Pullups bei
> hoher Geschwindigkeit störend wirken können. U.a. deswegen ist sogar der
> interne Pullup der Karte an D3 per Software-Kommando abschaltbar.

So ist es, mit ACMD42.

Hans-Georg L. schrieb:
> Da ist ein Kondensator in der Nähe da müsst man GND abgreifen können.

Wenn du einen Pull-Down einlötest wird der wieder die Datenübertragung 
stören. Also wenn schon einen abschaltbaren externen Pulldown 
benutzen, oder den internen benutzen und per ADC prüfen ob die Spannung 
> 1V ist oder so...

von Hans-Georg L. (h-g-l)


Lesenswert?

Niklas G. schrieb:
> Ob S. schrieb:
>> Warum Schrott? Weil die Datenleitungen Push-Pull sind und Pullups bei
>> hoher Geschwindigkeit störend wirken können. U.a. deswegen ist sogar der
>> interne Pullup der Karte an D3 per Software-Kommando abschaltbar.
>
> So ist es, mit ACMD42.
>
> Hans-Georg L. schrieb:
>> Da ist ein Kondensator in der Nähe da müsst man GND abgreifen können.
>
> Wenn du einen Pull-Down einlötest wird der wieder die Datenübertragung
> stören. Also wenn schon einen abschaltbaren externen Pulldown
> benutzen, oder den internen benutzen und per ADC prüfen ob die Spannung
>> 1V ist oder so...

Das ganze war ein Missverständnis, ich bin davon ausgegangen die 10k 
Pullups sind ok und man muss die SD karte irgendwie anschubsen damit sie 
D3 auf 0 zieht. Deshalb haben wir auch wegen dem pollen aneinander 
vorbei geredet. Hat sich aber jetzt geklärt.

Dann ist es wohl einfacher die Widerstände aus löten und den 
mechanischen Schalter zu benutzen. Bisher hatte noch keine Probleme ein 
paar Bytes in File zu schreiben und sie zurück zu lesen. Aber wenn man 
Probleme vermeiden kann sollte man es tun ...

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Niklas G. schrieb:

> Also wenn schon einen abschaltbaren externen Pulldown
> benutzen

Ich mache das ganz ohne Pulldown. Sehr kurzen Low-Puls auf den 
µC-Ausgang, dann umschalten auf Eingang und ein paar Mal in gewissen 
Zeitabständen (µs) nachschauen, ob da jeweils immer noch Low zu sehen 
ist. Falls das durchgängig bei den letzten drei Messungen nicht so ist, 
ist es recht wahrscheinlich, dass der Pullup einer eingelegten Karte 
seine Hand im Spiel hat.

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.