
In diesem Artikel werde ich den Grund für die Erfindung und Entwicklung eines Testers für microSD-Speicherkarten beschreiben, mit dem einige interessante Eigenschaften von Karten überprüft werden.
Ursache des Aufbaus
MMC, SD, microSD-Karten werden neben ihren natürlichen Anwendungen auch von Fans von Mikrocontrollern aus mehreren Gründen geschätzt:
• kann als zusätzlicher Speicher mit sehr großer Kapazität verwendet werden (sowohl zum Auslesen, z. B. beim Anzeigen von Fotos, wenn der Mikrocontroller den digitalen Bilderrahmen steuert, als auch zum Speichern von z. B. Messergebnissen eines Thermometers
• Vereinfachen den Austausch dieser Daten mit einem PC oder Telefon
• Kommunikation mit der Außenwelt entweder über das SD- oder das SPI-Protokoll (letzteres ist extrem einfach zu implementieren)
Am Anfang gab es MMC-Karten (bis zu 128 MB, glaube ich), später wurden sie durch SD-Karten (identisch in der Größe) ersetzt, und dann wurden Mini- und Micro-SD-Karten erstellt. Es gab ,,normale", ,"SDHC"- und "SDXC"-Karten. Das Erkennen des Kartentyps (und damit der Adressierung) kann schwierig sein. Dies ist im folgenden Artikel perfekt beschrieben:
http://elm-chan.org/docs/mmc/mmc_e.html
und dies wird durch das folgende Diagramm perfekt veranschaulicht:

Das SPI-Protokoll ist ein serielles Vollduplex-Datenübertragungsprotokoll, bei dem:
• auf der MISO-Leitung (Master Input Slave Output) gehen die Daten von der Karte zum Host (z. B. PC),
• Auf der MOSI-Leitung (Mater Output Slave Input) gehen die Daten vom Host zur Karte.
• und all dies geschieht im Takt des vom Host erzeugten SCLK-Taktsignals.
• Es gibt auch eine vierte Zeile (nCS), die... das war's
Theoretisch soll es die Verbindung mehrerer Karten zu einem Host ermöglichen, indem dieselben MISO/MOSI/SCLK-Leitungen verwendet werden. Jede Karte hätte ihr eigenes separates nCS-Signal, das beim Senden mit ihr aktiv wäre:
VCC VCC
| |
SCLK ---+----------+----------+ R R
MISO ---|+---------|+---------|+--------+ |
SCLK ---||+--------||+--------||+-----------+
||| ||| |||
+-------+ +-------+ +-------+
|Karta 1| |Karta 2| |Karta 3|
+-------+ +-------+ +-------+
| | |
nCS1-----+ | |
nCS2-----------------+ |
nCS3----------------------------+
In der Praxis wird es jedoch wahrscheinlich nicht von vielen Menschen verwendet, und meistens haben wir es mit einer einzelnen Karte zu tun. Was ist also mit der nCS-Linie? Theoretisch sollte es nur während der Übertragung von 8 Bit niedrig (aktiv) sein, dann hoch gehen (was die Übertragung des gesamten Bytes signalisieren würde)
SCLK __--__--__--__--__--__--__--__--________--__--__--__--__--__--__--__--______
MISO ------------
nCS --______________________________--------______________________________------
In der Praxis kann diese Leitung jedoch die ganze Zeit auf Low-Zustand sein und die Karte macht keinen Unterschied (und unser Mikrocontroller hat dann einen Pin mehr für andere Zwecke). Ist es aber wirklich so?
Nun, gemäß dem oben genannten Diagramm sollte man direkt nach dem Anlegen der Stromversorgung an die Karte einen Moment warten und ihr mindestens 74 Taktzyklen zum "Starten" schicken. Während dieser Aufwärmzyklen sollte die nCS-Leitung inaktiv sein und kann dann nach dem "Aufwärmen" bis zum Ausschalten niedrig sein. Und so konnte ich problemlos mit jeder Karte kommunizieren.
In einem Gerät, das ich einmal entworfen habe, war die nCS-Leitung jedoch dauerhaft geerdet (spart Pins und Ressourcen). Mit der Karte, die ich damals hatte, funktionierte es. Dann habe ich ein Dutzend anderer Karten gekauft und es stellte sich heraus, dass einige "nicht kommunizieren wollen". Das war eine schlechte Nachricht, denn ich hatte bereits mehr Platinen zum Aufbau des Geräts auf meinem Tisch - Nacharbeiten würden umständlich werden (also keine Option). Ich habe versucht, eine Regel zu finden - z. B. Sandisk-Karten haben immer funktioniert, und andere Hersteller oder sogar No-Name hatten manchmal Launen). Ich wollte eine 100 % effektive Bestimmungsmethode, die es mir ermöglicht, die Karte vor dem Kauf herauszufinden, vorzugsweise allein durch ihr Aussehen. Naja, Karten wie diese Karten, nach dem Herstellerlogo sind doch die gleichen. Allerdings nicht wirklich - ich habe eine interessante Eigenschaft entdeckt:

Die Karten auf der linken Seite (die mit der nCS-Linie immer auf der Masse) sind auf der Rückseite "glatt" (entweder ganz schwarz oder mit einigen Aufschriften), und die Karten auf der rechten Seite (launisch) haben entweder einen Aufkleber oder seltsame Kontaktflächen. Immer beim Kartenkauf habe ich den Verkäufer gebeten, "glatt" zu wählen. Da ich mir jedoch nicht sicher war, ob es sich um eine 100 % effektive Methode handelt, entschied ich mich für einen einfachen Gerätetester mit: einem Kartensteckplatz, einem Knopf und zwei LEDs, die nach dem Drücken des Knopfes eine Überprüfung durchführen und abhängig davon aufleuchten davon, ob die Karte OK oder launisch ist. Ich wollte das Gerät vor dem Kauf an den Verkäufer schicken.
Entwurf
Um die Kosten zu senken, basiert das Gerät auf einem Miniatur-Attiny13-Mikrocontroller. Er hat nur 8 Beine. Durch Abnehmen von VCC, GND und RESET bleiben 5 Pins für den eigenen Gebrauch übrig:
- Das Programm ist so einfach, dass es keine Interaktion des Benutzers erfordert (daher kann die Testtaste mit dem RESET-Pin verbunden werden)
- zwei LEDs, geschickt verbunden, um einen der drei Zustände (0/1 / Z) auszuwählen, welche der LEDs (jeweils: rot/grün/keine) leuchten sollen,
- MMC/SD-Karten benötigen eine 3,3-V-Stromversorgung, daher ist ein Stabilisator nützlich.
- und eine Schaltung 74LVC245 zum Umwandeln der Spannungspegel auf den zur Karte führenden Leitungen (MOSI/SCK/nCS); MISO (ausgehend von der Karte erfordert keine Konvertierung)
- Die Mikrocontroller, die ich habe (ATTINY13V), können mit nur 3,3 V betrieben werden, sodass der 74LVC245-Konverter redundant wäre, aber... der von mir verwendete USBASP-Programmierer wird mit 5 V betrieben, und dies ist auch der Signalpegel auf den Leitungen während des Programmierens verwendet, so dass es das Attiny-Ego beschädigen könnte.
- Kartensteckplatz und Mini-USB-Buchse zur Stromversorgung


Die Platine war wie immer ganz schön:


Software
In attiny haben wir nur 1024 Bytes pro Code, also kein Wahnsinn. Das Programm führt nacheinander 2 identische Tests durch:
• TEST1 - Versuch, ständig mit der nCS-Karte an Masse zu kommunizieren
• TEST2 - Einstellen des nCS auf einen hohen Zustand, Starten von 80 Aufwärmzyklen, Zurückbringen des nCS auf Masse und Versuch der Kommunikation
Jeder der Tests:
• entweder wird es fehlschlagen,
• oder wir schaffen es, mit der Karte zu kommunizieren - dann bestimmt es, mit welcher Karte wir es zu tun haben.
Wyświetlanie wyniku testu:
dioda | dioda | wynik
zielona | czerwona |
--------+----------+-------
- | miga | TEST1 fail, TEST2 fail (błąd komunikacji)
miga (*)| miga (*) | TEST1 fail, TEST2 pass (karta kapryśna)
miga (*)| - | TEST1 pass, TEST2 pass (karta ugodowa)
(*) - ilość mignięć oznacza:
1 -> karta SD VER.2 (block address)
2 -> karta SD VER.2 (byte address)
3 -> karta SD VER.1
4 -> MMC VER.3
Von den Karten habe ich:
• 4 GB- und 2 GB-Karten sind SD VER.2 (Byte-Adresse)
• eine Karte mit einer Kapazität von 32 GB ist SD VER.2 (Blockadresse) - kein Wunder, denn auf 4 Bytes (32 Bit) kann man maximal 4 GB adressieren
Die Präsentation
Kod
Code: text
Cool? DIY-Rangliste