PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD-Karte: SpgTeiler doch besser als Transistor-Levelshifter?



Jaecko
05.06.2008, 12:52
Moin.

Mal ne philosophische Frage:

Es gibt ja 2 "einfache" Möglichkeiten, das Problem mit der Logikspannung bei AVRs (5V) und SD-Karten (3,3V) zu umgehen.

1: Einfache Spannungsteiler von den AVR-Ausgängen, die die 5V auf 3,3V runterteilen.
2: Levelshifter mit 2 Transistoren, die eine direkte 3,3V-Spannung durchschalten.
(3: gleich nen fertigen Levelshifter verwenden im Stil eines MAX232)

Und es heisst auch, dass die 2. Möglichkeit die "bessere" ist.
Nun hab ich aber schon öfter gesehen, dass die Rechtecksignale nach der "Transistorstufe" verschliffen werden, was bei nem Spannungsteiler nicht der Fall ist.

Ist also die Lösung mit dem Spannungsteiler für die Datenrichtung Controller => Karte doch die bessere?
Für die Gegenrichtung (Karte => Controller) kann man sich ja darauf verlassen, dass auch 3,3V noch als "High" erkannt werden.

Würde eigentlich irgendwas dagegensprechen, einfach den Controller selbst nur mit 3,3V zu betreiben, sofern er da noch läuft?

Besserwessi
05.06.2008, 17:54
Den Controller mit 3,3 V zu betreiben ist in der Regel die beste Lösung. Oft kann man dann aber nicht mehr die volle Taktrate nehmen, aber die wird ohnehin selten gebraucht. Als Nebeneffekt hat man auch noch einen niedrigeren Stromverbrauch.

Die Lösung mit dem Spannungsteiler hat vor allen den Nachteil des hohen Stromverbrauchs. Wenn man den Spannungsteiler zu hochohmig macht werden nähmlich die Flanken auch verschliffen. Notfalls nüßte man zu den Widerständen noch Kondensatoren parallel schalten um das Signal schneller zu machen.

Es gibt verschiedene Möglichkeiten für den Levelshifter mit Transistoren aufzubauen, nicht alle sind wirklich schnell. Fertige Levelschifter sind da die deutlich bessere Wahl.

Die 3,3 V werden sind als high signal auch nicht so sicher. Bei den älteren Chips werden zum Teil mindestens 3 V für ein High Signal gebraucht, da ist dann nicht mehr viel Reserve drin.

wassermann
06.06.2008, 06:19
Ich betreib den Chip auch mit 3,3V und läuft prächtig. Einziger "Nachteil" ist nur, dass du evtl. zwei Spannungsregler brauchst (LCD, MAX232, ...).

gruss,
wassermann

Jaecko
06.06.2008, 07:20
Hm, und schon ist das nächste Problem da... die Anbindung an andere 5V-Systeme z.B. I2C-Bus, AT-Tastatur, ...
Bleibt wohl nichts anderes übrig, als doch irgendwo nen Pegelwandler o.ä. einzubauen.

Angenommen ich verwende jetzt für den SD-Slot einen eigenen AVR auf 3,3V (z.B. ATMega32); wie weit würde sich der dann "einfach so" an nen 5V I2C-Bus anschliessen lassen? Einziges Problem, das ich dabei sehe ist, dass die SCL/SDA-Leitung statt dem erwarteten VCC-Pegel von 3,3V die 5V der Pullups abkriegen.

Besserwessi
06.06.2008, 08:33
Wenn die Pullups nicht zu klein sind ( über 1,5 K Ohm) können die internen Schutzdioden die Spannung auf etwa 3,7 V begrenzen. Die anderen ICs am I2C Bus werden also auch nur etwa 3,7 V sehen.
Eventuell kann man ja auch gleich die ganze Schaltung auf 3,3 V umstellen.


Wenn die Schaltung ohnehin relativ viel Strom ( >10 mA) braucht (LCD, I2C, Tastatur etc.) dann man auch den Spannungsteiler nehmen.
Wenn die Schaltung aber sparsam sein soll und mit einer eher kleinen Batterie laufen soll, dann ist es besser den Controller mit 3V oder 3,3 V laufen zu lassen. Dann sollte man auch den Rest besser mit 3,3 V laufen lassen wenn es irgendwie geht. Selbst OPs und AD Wandler gibt es für 3,3 V, einige Controller dagegen schon nicht mehr für 5 V.

Jaecko
16.06.2008, 12:34
Also ich hab jetzt mal ne Schaltung aufgebaut, die eine Kombination aus Spannungsteiler und Levelshifter ist:
http://cihome.kilu.de/_forendaten/sdcard.gif
Sollte soweit gehen.

Wenn ich jetzt versuche, z.B. mit Bascom und eingen schon oft hier vorgeschlagenen Codes auf die Karte zuzugreifen, erhalte ich bei einer SD-Karte schon beim DriveInit einen Fehler.
Bei einer MMC klappt zwar DriveInit, sobald ich aber versuche, einen Sektor zu lesen, kommt der Fehler 229 (sinngemäss: Keine Antwort beim lesen)

Stimmt da nun was mit der Schaltung doch nicht oder hackts (wie so oft) an der Software? Der Fehler tritt komischerweise bei so ziemlich allen gefundenen Codebeispielen auf.

Nachtrag: Es ist auch unabhängig davon, ob nun Hardware-SPI oder Software-SPI an beliebigen Pins verwendet wird. (Letzteres wäre bevorzugt)

Besserwessi
16.06.2008, 17:21
Der Wandler mit den 2 Transitoren könnte etwas langsam sein. Wie schnell der Wandler sein muß, hängt vom Programm ab.
Wenn kein hardware SPI benutzt wird, solle das eigentlich reichen, zumindest wenn der Code gut gemacht ist. Bei hardware SPI sollte es reichen wenn das takt relativ niedrig (z.B. 500 kHz) ist. Ist ein Oszilloskop zum testen der Signale Vorhande ?


Die Transistorschaltung könnte man sonst durch zwei Gatter aus einem 74HCT04 oder ähnliches ersetzen. Um die Schaltung schneller zu machen könnte man sonst shottky-dioden hinzufügen von Basis zum Kollector (so wie bei den LS-TTL). Alternativ könnte man auch einen Transistor in Basisschaltung als Pegelwandler nehmen, das wäre sogar einfacher als die jetzige Schaltung.

Jaecko
18.06.2008, 10:42
Oszi ist vorhanden; werd am Wochenende auch mal nachmessen. Diesmal mit nem C-Programm; wenns dann geht, liegt der Fehler wohl irgendwo in Basic.

Kanns eigentlich sein, dass die ganzen Versuche mit der SD-Karte sowieso sinnlos sind?
Wenn die Ansteuerroutinen auf MMC ausgelegt sind, dann funktioniert doch da auch nur eine MMC. Wären die für SD, würden SD und MMC gehen.
Oder seh ich da was falsch?

Jaecko
20.06.2008, 16:49
So... getestet mit C: Nix geht.
Hab dann mal s'Oszi angesteckt und gleich mal recht doof geschaut... Sowohl an MOSI als auch MISO ergibt sich ne sehr bizarre Kurvenform...(Bild ist im Anhang).
Amplitude des Signals ist ca. 18V, Periodendauer 20ms (50Hz).
Störquellen sind aber keine zu finden... Stromversorgung ist ein 12V-Netzteil mit 7805; Oszi zeigt aber hier keine Störungen.

Ne Idee?


Edit: Anhang aus Platzgründen entfernt

Besserwessi
20.06.2008, 19:28
Die 18 V 50 Hz sind wohl irgendwie Störungen aus der Netzspannung. ICh würde mal vermuten die Masse ist irgrndwie nicht angeschlossen. Am Controller können solche spannungen eigentlich nicht anliegen, denn durch die internen Schutzdioden wird die Spannung auf etwa 5,5 V begrenzt.

Jaecko
20.06.2008, 19:40
Man fasst es nicht... Murphy hat wohl was gegen dieses Projekt... Stichwort Masse war das richtige... grad mal geschaut: Im Tastkopf ist die Masseleitung gerissen... geflickt und schon sieht man was plausibles.

Aber geht trotzdem nicht.

Aus der AVRLib hab ich in C mal den Code für MMCs übernommen; Init bzw. Reset klappt; wenn ich dann versuche, einen Sektor zu lesen, steht das Programm und die Clock-Leitung tickt ununterbrochen dahin, ohne dass sich auf MISO was tut. Wenn ich MISO dann von Hand auf Masse leg, läuft das Programm wieder und gibt mir als Ergebnis 512x ne 0 aus.

Dass MISO jedoch eine Rückmeldung bringt entnehme ich aus der Tatsache, dass ja der Reset der Karte klappt (Rückgabewert 0), während ein Fehler (z.B. Keine Karte) 0xFF ausspuckt.
Also irgendwo hackt da noch was.