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.
@ Marco G. (grmg2010) >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 Nur dann, wenn man es vermurkst! https://www.mikrocontroller.net/articles/AVR_In_System_Programmer#ISP-Pins_am_AVR_auch_f.C3.BCr_andere_Zwecke_nutzen
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.
Okay, verstehe ich, ich habe aber keinen Probs bislang (Diamex Programmer)
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???
Hanns-Jürgen M. schrieb: > Hmmm, ich sehe in der Schaltung keine Zenerdioden. Mitlesa schrieb: > Der gute Autor verwendet in seinem Schaltplan (in der 5V Version) -------------------------------------------------^^^^^^^^^^^^^^^^ Hanns-Jürgen M. schrieb: > http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html
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...
Mitlesa schrieb: > Hanns-Jürgen M. schrieb: >> Hmmm, ich sehe in der Schaltung keine Zenerdioden. > > Mitlesa schrieb: >> Der gute Autor verwendet in seinem Schaltplan (in der 5V Version) > -------------------------------------------------^^^^^^^^^^^^^^^^ > > Hanns-Jürgen M. schrieb: >> http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html Sry, ich hatt die als "normale" Dioden gesehen. Brauche wohl ne Brille.. :-)
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...
Falk B. schrieb: > ie sieht dein REALER Aufbau aus? Ein Bild sagt mehr als 1000 Worte. > >>http://www.dharmanitech.com/2009/01/sd-card-interf... Page you are looking for is either removed or temporarily down
Chris F. schrieb: > Page you are looking for is either removed or temporarily down Verwende den Link des TO und du wirst gücklich.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.