MMC- und SD-Karten
MMC- und SD-Speicherkarten lassen sich im SPI-Modus relativ einfach mit einem Mikrocontroller ansteuern. Prinzipiell gibt es zwischen SD-Card und MMC nicht viele Unterschiede, allerdings sind SD-Karten weiter verbreitet, in der Regel schneller als MMCs, und haben ein besser implementiertes SPI-Interface. Es existieren diverse Varianten (miniSD, microSD), die zur normalen SD-Card weitgehend kompatibel sind.
Die Karte liest das anliegende Datenbit mit der steigenden Taktflanke ein, als SPI-Modi eignen sich somit Mode 0 (CPOL=0, CPHA=0) und Mode 3 (CPOL=1, CPHA=1) (siehe auch Serial Peripheral Interface). Bei MMCs ist der SPI-Modus nicht genau spezifiziert, somit kommt es durchaus mal vor dass der SPI-Modus je nach Karte unterschiedlich gewählt werden muss, oder dass die Karte überhaupt nicht zuverlässig funktioniert (siehe Beitrag im Forum).
DOs und DON'Ts bei der Ansteuerung
- Lasst euch nicht verrückt machen wenn es einfach nicht funktioniert, sondern probiert zu allererst mal eine SD-Karte eines anderen Herstellers aus. Die MMC-Implementierung für AVR von Elm Chan z. B. funktioniert mit SanDisk problemlos hat aber mit Platinum Karten ein Problem.
- Taktfrequenz bei der Initialisierung nicht höher als 400kHz
- Ein Pullup-Widerstand am Ausgang der MMC/SD Karte (DO) ist für eine saubere Initialisierung per SPI notwendig! (Thread mit Erklärung dazu). Bei manchen Karten sogar, um überhaupt ein Signal auf DO zu bekommen.
- Ein Pullup-Widerstand an der Select-Leitung (/CS) schadet nicht und stellt sicher, dass die Karte erst mit Absicht selektiert wird.
- Nachdem die Karte deselektiert wurde (/CS auf high), die Taktleitung noch einige Male pulsen, damit die Karte DO hochohmig/tri-state schaltet (vgl. Chans Erläuterungen).
- Im SPI-Mode die nicht benutzten SD-Datenleitungen mit Pull-Ups versehen ([1])
- Saubere Versorgung: Kein Dioden-Pfusch, mit dem eine vorhandene 5V Versorgung mittels in Reihe geschalteter Dioden auf irgendwas im Bereich 3V "geregelt" wird. Stattdessen einen guten 3,3V-Regler verwenden. Die Karte mag es nicht, wenn mehr als 60mV Ripple auf Vcc ist. LM317 oder LM1117-ADJ/-3.3 mit entspechenden Kondensatoren reicht zumindest bei Basteleien allemal.
- Sauberer Anschluss der Digitalschnittstelle: Spannungsteiler "verschleifen" die Signale bei hohen Frequenzen und die Übertragungsrate muss dann begrenzt werden. Also entweder ein Pegelwandler oder gleich an ein 3,3V I/O anschließen.
- Die Karten verfügen weder über einen Reset- noch einen Sleep-Anschluss. Moderne Karten reduzieren bei Nichtbenutzung ihren Stromverbrauch, einen vollständigen Reset kann man jedoch nicht per Software auslösen. Daher sollten die Karten per P-Channel-FET oder Spannungsregler/-wandler mit Enable-Funktion so angeschlossen werden, dass über Versorgung an/aus ein (Power-On-)Reset ausgelöst werden kann. Dabei darauf achten, dass vorhandene Pull-Up-Widerstände bei abgeschalteter Versorgung ebenfalls deaktiviert werden (vgl. z. B. Schaltplan für den Anschluss von SD-Card/MMC per SPI an AVR in Chans Beispielen. Link unten).
- Ist beabsichtigt die Speicherkarte im Betrieb auszutauschen, sollte darauf geachtet werden, dass einige Karten beim Einstecken einen relativ hohen Strombedarf haben. Dies kann einen kurzzeitigen Zusammenbruch der Spannungsversorgung verursachen, der zu undefinierten Zuständen führt (z. B. Reset eines Mikrocontrollers durch Ansprechen des Unterspannungsschutzes/Brown-Out-Detection). Abhilfe schafft eine Spule in Reihe zum Versorgungsanschluss (VDD) der Karte. In vielen Boards von Olimex werden dazu 470 nH Festinduktivitäten verwandt.
- Guter Kontakt im Steckplatz, sehr gut eignen sich mit der Zange verbogene Stiftleisten, oft sieht es aus als ob es "passt", aber es gibt doch keinen Kontakt, daher bei Fehlern: Immer Durchmessen! Auch zu erwähnen wären da alte ISA-Bus Buchsen, die auf jedem alten PC Mainboard drauf sind. Um sicher zu gehen, dass der Kontakt wirklich gut ist, sollte man aber trotzdem SD-Slots benutzen. Diese bekommt man u.a. bei CSD (günstig), Reichelt (teuer) oder aus alten Kartenlesern.
- Guter Kontakt #2: Was sich im übrigen auch sehr gut eignet sind Adapter von MiniSD auf normales SD-Format, um dann MiniSD zu benutzen. Wenn man eine Stiftleiste im 2.54mm-Format oder Lötnägel im selben Format auf der Platine hat, kann man daran wunderbar den SD-Kartenadapter anlöten. Das ist mechanisch recht stabil. Ein kleines Manko ist allerdings, daß dann eine Gold-Lötzinn-Legierung durch die vergoldeten Kontakte entsteht und das soll ja dem Lötzinn langfristig nicht sehr zuträglich sein. Aber für's Hobby funktioniert das wunderbar.
- Speziell PIC: Wird der C18 Compiler benutzt, so hat man in der Bibliothek die Funktion ReadSPI(). Diese darf nicht benutzt werden, da sie SSPBUF vor dem Lesevorgang mit 0x00 initialisiert. Die SD-Karte erwartet aber 0xff !! Man kann die Funktion aus der Bibliothek kopieren und SSPBUF = 0xff schreiben, dann gehts.
(Liefere Bild in besserer Qualität nach!) |
Bibliotheken zur Ansteuerung
- ELM ChaN FatFs FAT(12,16,32)-Dateisystem. Klein und übersichtlich, hochoptimiert, frei auch für kommerzielle Anwendung. Beispiele für AVR, H8, LPC2k mit MCI u.a. enthalten ("samples"), neuere Versionen mit LFN-Unterstützung. Beispiel für AT91SAM7 inkl. DMA im Projekt ARM MP3/AAC Player. (siehe auch M. Thomas' ARM+SD/MMC Seite)
- ELM ChaN Petit FatFS FAT(12,16,32)-Dateisystem. Sehr klein. Beispiele für AVR.
- EFSL FAT16/32-Dateisystem, unterstützt Partitionen und Superfloppys, Beispielcode für AVR, LPC2000 und AT91SAM7 enthalten (siehe auch M. Thomas' ARM+SD/MMC Seite)
- Holger Klabundes FAT16/32 mit Beispielen für AVR MMC/SD und CF, LPC2k mit SPI
- libfat aus dem devkitpro-Projekt u.a. LFN-Unterstützung.
- MMC-Ansteuerung mit FAT16 von Ulrich Radig
- DOSFS Free FAT12/FAT16/FAT32 Filesystem "DOSFS is a free FAT-compatible filesystem intended for fairly low-end embedded applications. Intended target systems would be in the ballpark of 1K RAM, 4K ROM or more".
- MMC/SD-Karte mit FAT16 an AVR von Roland Riegel
- Circuit Cellar FAT16 MMC/SD mit MMC/SD Hardwaretreiber für MSP430
- "Implementing FAT32 File Systems on ADSP-BF533 Blackfin Processors" Application Note und Code von ADI
- FAT-Code in Atmel's AVR32 UC3 Software-Library
- AVR FAT16/32 Bibliothek mit Wiki. Unterstützt LFN und Ordner Rekursiv löschen. SVN für neuste Version.
- pC/FAT driver "using SPI for sector read/write to MMC/MMCplus/HD-MMC/M-Bridge/SD/SDHC/SDXC-cards on different platforms"
- SD Card Interfacing with ATmega8 (FAT32 implementation) by CC Dharmani
- OpenFAT: "OpenFAT is a FAT filesystem implementation intended for use with embedded microcontrollers in small systems. (...) OpenFAT is licensed under the GPL, version 3."
Allgemeine Informationen
- Datenblätter ( SD Card Product Manual 2.2 )
- ELM ChaN - How to Use an MMC
- ELM ChaN - FatFs Generic FAT File System Module
- Weiter unten im Text (runterscrollen) gibt es interessante Oszi-Bilder zu den oft genannten Spannungsteilern oder Transistorlösungen als Pegelwandler
- Lösung zu ISP Problemen bei SPI-SD-Modulen mit Pegelwandler
- Microchip Memory Disk Drive System mit FAT32 und SDHC Unterstützung
- Gute Beschreibung der SDIO-Architektur und wie man eine SD-Karte mit ARM bzw. AVR benutzt
Bauteile
- DIY SD-Card Fassung aus einem alten Floppy Kabel
- Halter für SD-Karten
- günstige Komplettlösung mit bidirektionalem Pegelwandler, Spannungsregler, Kartenhalter
Siehe auch
- Beiträge zum Thema MMC/SD im Forum (ca. 200 Threads)
- Forumsbeitrag: Hinweise zur Anpassung von FatFs an individuelle Hardware
- Forumsbeitrag: Hinweise zur Anpassung von FatFs an ATXmega mit UART im SPI-Modus (FIFO-Problem!)
- Forumsbeitrag: Geschwindigkeitsmessung mit SD-Karte am AVR
- Forumsbeitrag: Anpassung von FatFs an einen seriellen Flash-Speicher incl. Formatierung
- Forumsbeitrag: Eure Erfahrungen mit SD-Karten
- Forumsbeitrag: Beispielprojekt mit FATfs für ATmega328
- Forumsbeitrag: Lange Initialisierungszeiten bei SD-Karten
- Forumsbeitrag: Raspberry Pi langlebigere SD-Karte, wie?
- Forumsbeitrag: Raspberry Pi Read-Only SD-Karte einschränkungen?
Projekte
- Ultimate Floppy Emulator von Retromaster (PIC32 @ 80 Mhz, 16 Mb SDRAM)