Hallo Zusammen,
ich habe ein wenig Zeit und möchte die nutzen, um eine SD-Karte mit
einem AVR auszulesen. Dazu gibt es ja genügend Hinweise und Libraries.
Ich habe es auch einigermaßen zum Laufen gebracht, die Signale sehen
"eigentlich" gut aus. (125 kHz SPI-Clock) Da aber auch Fehler auftreten,
Folgendes:
Ich benutze die Library und die Verschaltung gemäß:
http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html
Dort sind bewußt die 1k Serienwidrtände weggelassen, die auf den
üblichen "Arduino" Display in den MOSI/CS/CLK vorhanden sind. Ich habe
diese entsprechend bei mir gebrückt.
Sind diese Widerstände zu irgendetwas nutze, soll ich sie also wiedr
einlöten?
Danke und mfg
Yogy
Unter anderem sind diese dafür da, dass andere SPI-Devices nicht
dazwischen reden, wenn der uC über ISP programmiert wird. In diesem Fall
kann die Programmierung oder der verify scheitern
@Hanns-Jürgen M. (yogy)
>Ich habe es auch einigermaßen zum Laufen gebracht, die Signale sehen>"eigentlich" gut aus. (125 kHz SPI-Clock)
Klingt nicht so vertrauenserweckend.
> Da aber auch Fehler auftreten,
Wie sieht dein REALER Aufbau aus? Ein Bild sagt mehr als 1000 Worte.
>http://www.dharmanitech.com/2009/01/sd-card-interf...>Dort sind bewußt die 1k Serienwidrtände weggelassen, die auf den>üblichen "Arduino" Display in den MOSI/CS/CLK vorhanden sind. Ich habe>diese entsprechend bei mir gebrückt.
Gut.
>Sind diese Widerstände zu irgendetwas nutze, soll ich sie also wiedr>einlöten?
NEIN! Sie sind kontraproduktiv und man braucht sie nicht. Wenn der AVR
per ISP programmiert wird ist die SD-Karte ruhig, denn das Chip Select
wird dann per Pull-Up auf HIGH gezogen.
Hast du am SPI-bus etwas anderes als den SD-Karte auch noch?
Man muss ja beachten dass die SD-Karten mal so mal so implementiert
sind. Zur Inizializiren starten die ja im SD-IO modus auf. Um
umzuschalten muss man glaube ich den CS High halten und Clock geben und
noch glaube ich den MOSI auch high (oder low). Wenn man hier gründlicher
guckt ist dass doch fast der gleiche Use-Case wenn man mit einer SPI
slave kommuniziert (wie zum Beispiel LCD). Daher am besten: SD-Karte
sollte den SPI allein haben. Oder erst SD-Karte initializieren und dann
alle weitere SPI slaves. Ich würde eher vorsichtig sein, wer weiss wie
die SD Karte entwickelt wurde. Kleine Unterschiede können hier immer
sein, die dann zu sehr sehr komische Fehler führen.
Benutzt du ein Steckbrett wie auf dem Foto?
Das gibt immer Störungen. Die Kabel dürfen nur wenige cm lang sein. Und
der kleinste Wackelkontakt bringt alles komplett durcheinander.
kyrk.5 schrieb:> Hast du am SPI-bus etwas anderes als den SD-Karte auch noch?>> Man muss ja beachten dass die SD-Karten mal so mal so implementiert> sind. Zur Inizializiren starten die ja im SD-IO modus auf. Um> umzuschalten muss man glaube ich den CS High halten und Clock geben und> noch glaube ich den MOSI auch high (oder low). Wenn man hier gründlicher> guckt ist dass doch fast der gleiche Use-Case wenn man mit einer SPI> slave kommuniziert (wie zum Beispiel LCD). Daher am besten: SD-Karte> sollte den SPI allein haben. Oder erst SD-Karte initializieren und dann> alle weitere SPI slaves. Ich würde eher vorsichtig sein, wer weiss wie> die SD Karte entwickelt wurde. Kleine Unterschiede können hier immer> sein, die dann zu sehr sehr komische Fehler führen.
Ja, der SPI-Bus dient bei mir auch zur Ansteuerung des TFT-Displays und
der Touch-Funkzion. Alles ist zusammenmit dem Kartenadapter auf einer
Platine (China). Funktional schalte ich jegliche Ansteuereung des
Displays und des Touchcontrollers während des SD-Kartenzugriffs ab. Das
funzt auch (kontrolliert mit Oszi).
Ja, zur Initialisierung einer "frischen" Karte muß mit CS-High eine
Anzahl von Clocks gegeben werden. Dies ist der Fall.
Zudem schalte ich die SPI-Taktrate nach der Initialisierung (noch) nicht
hoch, und 125 KHz sind eigentlich Peantus. Ich werre aber gleich einen
zusätzlichen Block-Kondensator spendiren...
Leider habe ich nur eine einzige SD-Karte (4 GB), so daß ich keine
andere testen kann.
Noch einer schrieb:> Benutzt du ein Steckbrett wie auf dem Foto?>> Das gibt immer Störungen. Die Kabel dürfen nur wenige cm lang sein. Und> der kleinste Wackelkontakt bringt alles komplett durcheinander.
Nein, kein Steckbrett, alles ist verlötet. Die Verbindung zwischen dem
Display/Touch/SD-Modul zur Arduino HZ ist allerdings gesteckt. Aber das
ist mit zieml. Sicherheit nicht das Problem.
Ich weiß auch nicht, ob ein HW-Problem vorliegt, ich werde später mal
die Routinen von Roland R. anpassen und testen.
Hanns-Jürgen M. schrieb:> Ich benutze die Library und die Verschaltung gemäß:>> http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html
Der gute Autor verwendet in seinem Schaltplan (in der 5V Version)
Zenerdioden 3.6V an den SPI-Leitungen um die Spannung an der
SD-Karte zu begrenzen.
Wenn es da keine Serienwiderstände gibt dann darf der Controller
mächtig Stom liefern. Das ist eine äusserst unsaubere Methode
die sogar zu Betriebsunsicherheit führen mag.
Ich würde auf jeden Fall Serienwiderstände vorsehen.
Hmmm, ich sehe in der Schaltung keine Zenerdioden.
Mein AVR läuft zwar auch mit 5 V, die Pegelanpassung mache ich mit
niederohmigen Widerständen.(390/560 Ohm, zusätzlich auf der 3,3 V Seite
wie im Beispiel 47 k nach plus 3,3 V. Die Flanken sind okay.
Ich löte jetzt gleich den Blockkondensator an.
Ach ja, Denkbar wäre auch ein Kontaktproblem im Sockel???
Falk B. schrieb:> NEIN! Sie sind kontraproduktiv und man braucht sie nicht. Wenn der AVR> per ISP programmiert wird ist die SD-Karte ruhig, denn das Chip Select> wird dann per Pull-Up auf HIGH gezogen.
Vorsicht!
Das hängt vom Design des Interface ab. Insbesondere bei laienhaft
designten Anbindungen an einen 5V-SPI-Bus neigt das CS-Interface zur
SD-Karte dazu, im Falle der Nutzung im Rahmen von ISP zum reinen
Pulldown zu mutieren...
Das passiert insbesondere dann, wenn man idiotischerweise ausgerechnet
den \SS-Pin der Hardware-SPI als CS für die SD-Card benutzt. Ja, ich
gebe zu, für den Laien ist das vermutlich naheliegend, insbesondere,
wenn er keine weiteren SPI-Devices am Bus hat. Nichtsdestotrotz führt
das dann zielsicher genau zu dem bewußten Problem...
Aber klar: der Angstwiderstand ist natürlich die denkbar schlechteste
Lösung des Problems...
c-hater schrieb:> Falk B. schrieb:>> Das passiert insbesondere dann, wenn man idiotischerweise ausgerechnet> den \SS-Pin der Hardware-SPI als CS für die SD-Card benutzt. Ja, ich
Bei mir nutz die SD-Karte als /CS Signal nicht den Standard /SS Pin.
So, Der Blockondensator hat nichts gebracht. Ich vermute mittlerweie, da
liegt ein Kontaktier-Problem der Kartenaufnahme vor. Ich werde mal
umbauen und auch die SPI-Signaladaptierung neu und sauberer aufbauen..
Ob das heute noch etwas wird, glaube ich nicht...
Einstweilen vielen Dank.
Hanns-Jürgen M. schrieb:> Bei mir nutz die SD-Karte als /CS Signal nicht den Standard /SS Pin.
Das ist schonmal gut, genügt aber nicht!
Das macht nur die korrekte Lösung zur Anbindung einer SD-Karte an einen
mit 5V betriebenen HW-SPI-Bus, der auch für 5V-ISP genutzt werden soll,
überhaupt erst möglich, ist also notwendige Voraussetzung für eine
Lösung. Es ist aber noch längst nicht die Lösung...
c-hater schrieb:> Hanns-Jürgen M. schrieb:>>> Bei mir nutz die SD-Karte als /CS Signal nicht den Standard /SS Pin.>> Das ist schonmal gut, genügt aber nicht!>> Das macht nur die korrekte Lösung zur Anbindung einer SD-Karte an einen> mit 5V betriebenen HW-SPI-Bus, der auch für 5V-ISP genutzt werden soll,> überhaupt erst möglich, ist also notwendige Voraussetzung für eine> Lösung. Es ist aber noch längst nicht die Lösung...
Wie sieht Dein Deiner Meinung nach die "ideale" Lösung aus?
BTW: Auch wenn ich den ISP-Adapter abziehe ändert das nichts an der
Teilfunktionalität.
Hanns-Jürgen M. schrieb:> BTW: Auch wenn ich den ISP-Adapter abziehe ändert das nichts an der> Teilfunktionalität.
Doch, natürlich: Dann ist nix mehr da, was den AVR in den Reset bringt
und damit seine sämtlichen Pins hochohmig macht. Was an sich nicht
schlimm ist, aber einen Spannungsteiler zur Anpassung an einen
3.3V-SPI-Busteilnehmer eben zu einem Pulldown macht, weil es dann keine
Spannung mehr zu teilen gibt, was den Busteilnehmer wiederum glauben
läßt, es wäre irgendwas zu tun und er müßte sein SPI-Interface auf den
Bus aufschalten. Womit dann wiederum MISO des 3.3V-Busteilnehmers gegen
MISO des AVR arbeitet...
> Wie sieht Dein Deiner Meinung nach die "ideale" Lösung aus?
Das liegt doch klar auf der Hand: für \CS eines 3.3V-Busteilnehmers darf
man eben keinen Spannungsteiler verwenden, sondern muß einen
"active-low" Ausgang (high ist für diesen Ausgang nicht erlaubt!) mit
einem Pullup hin zur 3.3V-Versorgung kombinieren.
Damit erklärt sich auch, warum der SS-Ausgang des Hardware-ISP nicht als
CS-Ausgang für einen 3.3V-Teilnehmer geeignet ist. Man kann den nämlich
nicht zwischen active-low und hochohmig toggeln lassen, ohne die
SPI-Hardware aus der Rolle des SPI-Masters zu schmeissen. Diese
Design-Entscheidung von Atmel ist sicher hochgradig fragwürdig, aber die
Hardware ist nunmal so, wie sie ist...
Praktischerweise haben SD-Karten übrigens für ihren CS-Eingang bereits
den nötigen Pullup eingebaut. Man muss also AVR-seitig bloß noch einen
Ausgang zwischen den Zuständen "active-low" (SD-Karte selektiert) und
hochohmig (SD-Karte nicht selektiert) umsteuern. Im Falle der
ISP-Programmierung ist damit quasi nebenbei sichergestellt, dass die
SD-Karte dann die Schnauze hält, denn der AVR-Ausgang wird ja in diesem
Falle ebenfalls hochohmig, also: SD-Karte nicht selektiert.
Und das Sahnehäubchen für die ideale Ansteuerung ist dann lustigerweise
ein zusätzlicher (ziemlich hochohmiger) Pull down. Baut man den auch
noch ein, kann man nämlich den in die SD-Karte eingebauten Pullup zu dem
Zweck nutzen, für den er eigentlich gedacht war: für einen
card-detect-Mechanismus. Sprich: der CS-Ausgang des AVR ist ohne Karte
hochohmig (also als Eingang konfiguriert). Ohne eingesteckte Karte zieht
der hostseitige Pulldown diesen Eingang auf Low. Steckt man eine Karte
ein, zieht der Pullup der Karte ihn hingegen auf High. Diese Flanke (in
der Realität ist es natürlich zuerst mal ein Gewitter von Flanken) kann
man detektieren und als Hinweis nehmen, dass jetzt eine Karte steckt und
es vielleicht sinnvoll wäre, sich das Teil mal näher anzuschauen...
Und als letzte Anmerkung: steckt die Karte erstmal und ist sie
initialisiert, kann man ihren internen Pullup per Kommando abschalten.
Das sollte man aber natürlich keinesfalls tun, wenn man das Interface
wie oben dargestellt umgesetzt hat...
Den 5 / 3V3-Spannungsteiler kann man auch nur als Serienwiderstand
realisieren, also ohne PullDown. Oder noch besser mit hochohmigen PullUp
nach 3V3 oder auch 5V. Die "überschüssige Spannung" fließt über die
Schutzdioden ab.
Außerdem haben Serienwiderstände dämpfende Wirkung gegen Ringing.
Das Ringing ist unabhängig von der SPI-Frequenz!
Das sieht man nur mit einem guten Oszi und kurzen Gnd-Clips.
eProfi schrieb:> Den 5 / 3V3-Spannungsteiler kann man auch nur als Serienwiderstand> realisieren, also ohne PullDown.
Das ist ziemlich gewagt. Klar, bei genauer Betrachtung ist auch das
irgendwie ein Spannungsteiler, aber schön ist das Konstrukt nicht
gerade...
> Oder noch besser mit hochohmigen PullUp> nach 3V3 oder auch 5V. Die "überschüssige Spannung" fließt über die> Schutzdioden ab.
Eben deshalb. Im SD-Standard wirst du keine Stelle finden, die
dokumentiert, welchen Strom die Schutzdioden dauerhaft aufnehmen können.
Das liegt einfach daran, dass sie halt Schutzdioden sind, deren Aufgabe
ist eigentlich nur, kurzzeitige ESD-Pulse von den Eingängen
fernzuhalten.
Ein Design, was funktional die Existenz von Schutzdioden voraussetzt,
ist also einfach nur eins: Bastlerscheisse. Kann durchaus funktionieren,
aber niemand kann eine dauerhafte Funktion garantieren.
@c-hater (Gast)
Danke für die ausführliche Beschreibung, insbesondere die Möglichkeit,
über das CS-Signal ein Card-Detect zu implementieren.
Zum Thema 3,3/5 Volt: Bislang hatte ich keine Probkemne mit dem 5V ISP,
dem 5V AVR und den über Sapnnungsteulker angeschlossenen 3,3 V TFT und
Touchcontroller.
Auch sehe ich kein Proebleme bezüglich des AVR-Resets OHNE ISP. Dafür
gibt es nicht nur den Power-Up Reset somdern auch eine RESET Taste.
Außerdem kann ich per SW-Befehl einen Watchdog-Reset erzwingen.
(Der gestrige Versuch mit einer anderen Kontaktiereinheit für die
SD-KArte hat ürbigens nichts gebracht.)
Nochmal zum Verstöndnis meines Problems:
Das AVR-System läuft.
Ich stecke die SD-Karte ein.
Ich rufe SD-INIT auf. Das gaht, manchmal aber nicht.
Ich wiederhole den INIT Befehl: Das geht dann, oder nicht.
Ich kann das beliebig wiederhoölen, und manchmal geht es, manchmal
nicht, ohne daß ein Muster erkennbar ist.
Hat der INIT geklappt, kann ich den DIR Befehl (Auslesen dfer
Dateiliste) starten. Das geht manchmal, manchmal aber auch bnicht.
Ursache: Keine Ahnung. Die Signale und die Signalsequenzen sehen alle
gut aus. Ich kann also nicht klar feststellen, liegt es an der HW oder
an der SW.
SW: Das System benutzt natürlich einen TIMER Interupt, der die Systemuhr
und andere Time-Out Zähler bedient. Die Uhrrouine im Interrupt geht
allerdings nur bis zum Sekundenzähler, der Rest der Uhr ist om
Hauptprogramm (Eventgesteuert). IRQ-Wiederholrate ist 1000 Hz.
Denkbar wäre es, daß während einer Befehlssequnz ein Timer-IQ
"zuschlägt" und somit eine Zeitlücke zwischen den SPI-Bytes entsteht.
Stellt das bei SD-Karten ein Probelem dar? (Time Out)
Ich will nun wie folgt vorgehen:
Ich werde mir in der Bucht aus China Pegelwandlerplatinchen bestellen
bzw SD-Adapter mit aktiven Pegelwandler und ein oder zwei SD-Karten.
Dann geht es weiter. Jetzt bringt weitere Bastelei eher nichts mehr, da
ich ab Montag für einige Wochen stark beanspricht bin und nicht basteln
kann.
Ich melde mich zurück, sobal ich Fortschritte melden kann.
Ach ja, noch eine Ergänzung:
Ich habe bei den Signalen ein leichtes Ringing, wie von
Autor: eProfi (Gast) erwähnt, festgestellt. Es sind Undershoots im
10...50mV mV Bereich zu sehen. (Könnte aber auch alles ein Messfehler
sein). Stellt das ein Problem für SD-Karten da?
Hanns-Jürgen M. schrieb:> Zum Thema 3,3/5 Volt: Bislang hatte ich keine Probkemne mit dem 5V ISP,> dem 5V AVR und den über Sapnnungsteulker angeschlossenen 3,3 V TFT und> Touchcontroller.
Für MOSI und SCK kann man durchaus Spannungsteiler verwenden, am besten
lastkompensierte, denn hier sind schnelle Signalwechsel gefragt, da käme
man mit einer OpenDrain-Lösung nicht sehr weit. Eben so weit, wie auch
I2C kommt, was etwas mau ist.
Nicht aber für CS, hier spielt Geschwindigkeit keine große Rolle, dafür
aber eben die Sicherheit gegen Buskollisionen. Zumal die Anpassungen auf
den von mir vorgeschlagenen Betrieb nur minimalen Aufwand erfordern:
Einen Widerstand durch 0Ohm ersetzen, den zweiten durch 1MOhm und zwei
Zeilen Software ändern...
> Auch sehe ich kein Proebleme bezüglich des AVR-Resets OHNE ISP.
Da hast du sicher Recht, ohne ISP funktioniert natürlich auch die
Variante mit Spannungsteiler für das CS-Signal problemlos. Aber wer gibt
schon ohne Not freiwillig den Vorteil der ISP-Programmierung auf?
> Nochmal zum Verstöndnis meines Problems:>> Das AVR-System läuft.> Ich stecke die SD-Karte ein.> Ich rufe SD-INIT auf. Das gaht, manchmal aber nicht.> Ich wiederhole den INIT Befehl: Das geht dann, oder nicht.> Ich kann das beliebig wiederhoölen, und manchmal geht es, manchmal> nicht, ohne daß ein Muster erkennbar ist.>> Hat der INIT geklappt, kann ich den DIR Befehl (Auslesen dfer> Dateiliste) starten. Das geht manchmal, manchmal aber auch bnicht.>> Ursache: Keine Ahnung.
Möglicherweise falscher SPI-Modus. Oder eine ungünstige Kombination von
Signallaufzeiten.
Was genau kommt denn von der Karte zurück (im Vergleich der Fälle, in
denen es geht mit denen, in denen es nicht geht)? Der Vergleich kann
schonmal zeigen, ob das Problem bei MOSI liegt (also Karte versteht erst
garnicht, was man von ihr will) oder bei MISO (AVR versteht die Antwort
der Karte nicht).
> Denkbar wäre es, daß während einer Befehlssequnz ein Timer-IQ> "zuschlägt" und somit eine Zeitlücke zwischen den SPI-Bytes entsteht.> Stellt das bei SD-Karten ein Probelem dar? (Time Out)
Nein, eigentlich nicht. SPI ist ein synchrones Verfahren. Allerdings
gibt es durchaus SPI-Slaves, die Untergrenzen für den Takt fordern. Ob
das bei SD-Karten der Fall ist, weiss ich jetzt nicht, da müsste ich
erst nochmal zielgerichtet nachlesen. Soweit ich mich erinnere, ist das
aber nicht der Fall.
Da fällt mir ein: Ich habe schonmal was gebaut, was ein Videosignal
mittels Zeileninterrupt produziert und in dieser Anwendung verwende ich
ebenfalls einen SD-Card-Reader und zwar ohne jegliche Probleme. D.h.:
Wenn es eine Untergrenze für den Takt geben sollte, dann muss diese auf
jeden Fall noch unterhalb von ca. 15kHz liegen, denn der Zeileninterrupt
blockierte den USI-Handler (war ein Tiny in der Anwendung) mit schöner
Regelmäßigkeit immer wieder ca. 60µs lang, während der ungebremste
USI-Takt ungefähr 4MHz beträgt. Also auch mit diesem extremen Wechsel
des SPI-Takts kommen SD-Karten offensichtlich problemlos klar.
> Ich werde mir in der Bucht aus China Pegelwandlerplatinchen bestellen> bzw SD-Adapter mit aktiven Pegelwandler
Das ist meiner Erfahrung nach nicht unbedingt nötig, kann aber
andererseits natürlich auch nicht schaden. Für ein kommerzielles Produkt
würde ich auf jeden Fall auch Spannungswandler einsetzen.
Bei privaten AVR-Projekten verzichte ich allerdings praktisch immer
darauf. Hier benutze ich für die schnellen Ausgangsleitungen MOSI und
SCK, wie oben erwähnt, lastkompensierte Spannungsteiler, also zwei
Widerstände, von denen der "obere" durch einen kleinen Kondensator
(wenige pF) gebrückt wird. Für CS die schon ausführlich beschriebene
Variante und für MISO kommt's drauf an, ob ISP nötig ist und/oder auch
5V-Busteilnehmer existieren oder nicht. Wenn nicht, gibt's garkeine
Schaltung zur Anpassung, wenn ja, gibt's einen 470Ohm Längswiderstand
zwischen 5V-MISO und 3.3V-MISO und eine 3.3V Z-Diode auf der
3.3.V-Seite. Nicht gerade schön, aber bei den SPI-Frequenzen, die man
mit dem AVR erreichen kann, gerade noch ausreichend schön. ;o)
Hallo zusammen,
wegen meines Urlaubes und des Wartns auf den China-Pegelwandler hat es
etwas :-) länger gedauert.
Gestern habe ich einee neue Adapterplatine mit den aktiven Pegelwandlern
zusammengelötet und heute heute dan getestet. Nun funktioniert das Ganze
einwandfrei.
Und das mit "zusammengeknoteten" MISO/MOSI/SCK Signalen. Die /CS Signale
natürlich alle getrennt...
So, damit ist das Prioblem gelöst. Ich danke Euche für Eure Komentare
und Tips.
Jetzt gebe ich mich an ein anderes Thema: Eine Stütze meines Baggers ist
offenbar festgerostet :-) Aber das gehört in ein anderes Forum...
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang