port to MMC/SD



Leider kann ich die Module pC/FAT sowie pC/FFS nicht frei zugänglich machen. Jedoch kann ich hier eine vereinfachte Form der MMC- und SD-Card Ports auf die SPI-Schnittstelle für diverser Controller bereit stellen.
Mittels dieser Ports kann man ein anderes FileSystem auf diese Schnittstelle, und damit auf MMC- und SD-Cards zugreifen lassen. Oder, wie als Test durch mich erfolgt, ein in Software realisierter MMC/SD-to-USB Adapter programmiert werden. Dieser meldet sich dann als MassStorage (removable media) USB-Device am PC und man hat Zugriff auf die MMC- und SD-Cards wie bei einem prof. Adapter (nur etwas langsamer, da SPI-mode und Softwarerealisierung).

Hier eine Übersicht zu den SD-Card Versionen:


SD card versions


Einschränkungen der vereinfachten MMC/SD-Ports:
- kein Interrupt- oder DMA-Mode
- keine ausführlichen Media-Infos
- kein Read / Write im CallBack Mode
- kein direkter RTOS-Support

pCFAT_Port_SPI.zip
download simplified pC/FAT Ports to MMC/SD (as ZIP)

(with MMCplus/HD-MMC/M-Bridge/SDHC/SDXC support)
(with optional McEx/ASSD-support)


Bei einer Portierung auf weitere Controller müssen neben der SPI-Speed Adaption nur einige Parameter der Hardware bekannt und entsprechend eingerichtet werden. Dazu gehören die verwendeten PIO-Pin's für WP (WriteProtect), CD (CardDetect) sowie die Einstellungen für MOSI, MISO, SCLK und /SS. Desweiteren muß der passende SPI-mode 3 eingestellt werden.

zu verwendender SPI-Mode des Controllers (Masters)
Nachfolgendes Diagramm zeigt den SPI-Mode, der für die Kommunikation mit MMC- und SD-Karten im SPI-Mode benötigt wird:
SPI-master mode

Zum Thema Geschwindigkeit
In der nachfolgenden Tabelle sind alle wichtigen Parameter der mir vorliegenden MMC/MMCplus/M-Bridge/SD/SDHC- Karten als Gegenüberstellung aufgeführt. Diese veranschaulicht recht gut, daß die SPI-Geschwindigkeit nur indirekt/relativ mit den Performanceangaben der Hersteller für MMC/SD-Modes im Zusammenhang bei SPI-Mode steht.
Dabei sind die Angaben Nac und Nbs von besonderem Interesse.
- Nac = max. Zyklen zwischen Read_CMD und Daten
- Nbs = max. Zyklen zwischen Write_CMD+Daten und End-of-Busy
Diese Angaben schwanken zwischen den verschiedenen Karten/Herstellern teils sehr stark. Sie geben eine Auskunft darüber, wie schnell der interne Speicher wirklich gelesen / geschrieben werden kann. ABER ! - auch diese Werte stellen den jeweiligen absoluten maximal-Wert dar. Das heißt aber auch wiederum, ein Speicher mit hohem Nbs kann trotzdem möglicherweise schneller mit einem Write-CMD fertig sein, als ein Speicher mit niedrigerem Nbs. Jedoch ergeben diese Angaben eine Tendenz über die vom jeweiligen Hersteller maximal möglichen/erwarteten/zulässigen Zyklen.


pC_FAT MMC_SD_Port_1.jpg
Card

MMC
16MB

Infineon

MMC
32MB

Infineon

MMC
64MB

Transcend

MMC
128MB

SanDisk

MMC
1GB

Hama

MMCmicro
512MB

X4store

RS-MMC
32MB

SanDisk

MMCmobile
64MB

Transcend

MID-OID

01-0000

01-0000

06-0000

02-0000

48-FFFF

6F-0000

02-0000

2C-0000

maxclk

20MHz

20MHz

20MHz

20MHz

20MHz

20MHz

20MHz

20(26)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

10.012

10.012

10.012

10.012

800.000

50.000

100.000

50.000

Nbs

40.048

40.048

40.048

40.048

102.400.000

1.600.000

400.000

1.600.000

maxsectors

31.424

62.720

125.440

250.880

2.007.040

1.003.520

62720

125.440

sectorsize

512

512

512

512

512

512

512

512


pC_FAT MMC_SD_Port_2.jpg
Card

MMCmobile
512MB

Transcend

MMCmobile
1GB

extreme

MMCmobile
2GB
green
memory

MMCmobile
2GB

Kingston

MMCplus
512MB

Transcend

MMC
1GB

extreme

MMCplus
2GB

Transcend

MMCplus
4GB

Pretec

MID-OID

15-0000

00-0000

6F-0000

70-0000

1E-FFFF

4B-4342

1E-FFFF

19-5944

maxclk

20(26)MHz

20MHz

20(52)MHz

20(52)MHz

20(52)MHz

20(?)MHz

20(52)MHz

20(52)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

15.012

30.000

10.000

200.012

50.000

35.000

200.000

200.012

Nbs

1.921.536

480.000

1.280.000

25.601.536

1.600.000

1.120.000

6.400.000

25.601.536

maxsectors

1.003.520

1.935.360

1.945.600

1.983.488

990.208

2.022.912

1.981.952

1.988.096

sectorsize

512

512

1024

1024

512

512

1024

2048


pC_FAT MMC_SD_Port_3.jpg
Card

M-Bridge
1GB

Hama

SD
16MB

Panasonic

microSD
128MB

Prima

SD
128MB

SanDisk

SD
512MB

Formel1

SD
1GB
133x
SanDisk

miniSD
1GB

SanDisk

microSD
1GB

Hama

MID-OID

04-4450

01-4150

13-474B

03-4453

02-4D54

03-4453

03-4453

1B-4D53

maxclk

25(50)MHz

25MHz

25(50)MHz

25MHz

25MHz

25MHz

25MHz

25(50)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

10.000

5.012

50.000

15.000

2.000

15.000

15.000

802.200

Nbs

320.000

160.384

1.600.000

240.000

64.000

240.000

240.000

12.835.200

maxsectors

1.990.656

29.120

249.344

246.016

1.000.448

1.984.000

1.984.000

1.995.776

sectorsize

512

512

512

512

512

512

512

512


pC_FAT MMC_SD_Port_4.jpg
Card

SD
1GB

Fuji

SD
1GB

premium

SD
1GB
80x
Transcend

SD
2GB
plus USB
ATTiA

microSD
2GB

SanDisk

microSD
2GB

Transcend

SD
2GB

Kingston

SD
2GB

Panasonic

MID-OID

1B-4D53

1B-4D53

1C-5653

29-4441

03-4453

1E-4241

02-4D54

01-4150

maxclk

25(50)MHz

25(50)MHz

25MHz

25(50)MHz

25MHz

25(50)MHz

25(50)MHz

25(?)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

802.200

802.200

50.000

10.000

15.000

200.000

400.000

5.012

Nbs

12.835.200

12.835.200

1.600.000

320.000

240.000

6.400.000

1.600.000

80.192

maxsectors

1.995.776

1.995.776

1.999.872

1.964.032

1.985.024

1.948.672

1.927.168

1.967.616

sectorsize

512

512

512

1024

1024

1024

1024

1024


pC_FAT MMC_SD_Port_5.jpg
Card

SD
2GB

premium

SD
2GB

Transcend

SD
2GB
Ultra-II
SanDisk

SD
4GB

memoQ

SD      /      SDHC
4GB

Transcend

SDHC
4GB

Transcend

SDHC
4GB

SanDisk

MID-OID

02-4D54

1B-4D53

03-4453

19-5944

1C-5653

1B-4D53

03-4453

maxclk

25(50)MHz

25(50)MHz

25MHz

25(50)MHz

25(?)MHz

25(50)MHz

25MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

20.000

200.000

15.000

20.012

30.000

100.000

100.000

100.000

Nbs

640.000

6.400.000

240.000

2.561.536

120.000

250.000

250.000

250.000

maxsectors

1.921.024

1.981.440

1.931.264

1.956.352

1.967.616

7.870.464

7.811.072

7.959.552

sectorsize

1024

1024

1024

2048

2048

512

512

512


pC_FAT MMC_SD_Port_6.jpg
Card

SDHC
4GB

Fuji

SDHC
4GB
green
memory

SDHC
4GB

Kingston

SDHC
4GB

Panasonic

SDHC
4GB
Ultra-II
SanDisk

SDHC
4GB

Toshiba

microSDHC
4GB

SanDisk

microSDHC
4GB

Hama

MID-OID

1B-4D53

03-6883

02-4D54

01-4150

03-4453

02-4D54

03-4453

27-4850

maxclk

25(50)MHz

25(50)MHz

25(50)MHz

25MHz

25MHz

25(50)MHz

25MHz

25(50)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

100.000

100.000

100.000

100.000

100.000

100.000

100.000

100.000

Nbs

250.000

250.000

250.000

250.000

250.000

250.000

250.000

250.000

maxsectors

7.811.072

7.913.472

7.729.152

7.741.440

7.744.512

7.741.440

7.959.552

7.843.840

sectorsize

512

512

512

512

512

512

512

512


pC_FAT MMC_SD_Port_7.jpg
Card

microSDHC
8GB

SanDisk

microSDHC
8GB

Transcend

SDHC
8GB

Reekin

SDHC
8GB
green
memory

SDHC
16GB

Panasonic

SDHC
16GB

Transcend

SDHC
16GB

takeMS

SDHC
16GB

PNY

MID-OID

03-4453

1E-4241

1D-4441

27-4850

01-4150

1E-4241

19-5944

02-4D54

maxclk

25MHz

25(50)MHz

25(?)MHz

25(50)MHz

25(50)MHz

25(50)MHz

25(50)MHz

25(50)MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

100.000

100.000

100.000

100.000

100.000

100.000

100.000

100.000

Nbs

250.000

250.000

250.000

250.000

250.000

250.000

250.000

250.000

maxsectors

15.954.944

15.661.056

15.332.352

15.720.448

31.645.696

31.387.648

31.776.768

31.116.288

sectorsize

512

512

512

512

512

512

512

512


pC_FAT MMC_SD_Port_8.jpg
Card

microSDHC
16GB

SanDisk

SDHC
32GB
green
memory

microSDHC
32GB
SanDisk /
ADATA

microSDHC
32GB

Samsung

SDXC
64GB

Transcend

microSDXC
64GB
SanDisk /
Team

SDXC
128GB
Komputer
Bay

microSDXC
128GB

SanDisk

MID-OID

03-4453

02-4D54

03-4453

1B-4D53

1E-4241

03-4453

74-454A

03-4453

maxclk

25MHz

25(50)MHz

25MHz

25(50)MHz

25(50)MHz

25MHz

25(50)MHz

25MHz

usedclk*

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

8MHz

Nac

100.000

100.000

100.000

100.000

100.000

100.000

100.000

100.000

Nbs

250.000

250.000

250.000

250.000

500.000

500.000

500.000

500.000

maxsectors

31.116.288

63.700.992

62.333.952

61.315.072

124.925.952

124.735.488

251.394.048

249.736.192

sectorsize

512

512

512

512

512

512

512

512


pC_FAT MMC_SD_Port_9.jpg
Card

microSDXC
200GB

SanDisk

microSDXC
400GB

SanDisk

nm-card
128GB

UTHAI-J39/
YAOMAISI
?

MID-OID

03-4453

03-4453

FF-0000

maxclk

25MHz

25MHz

50MHz

usedclk*

8MHz

8MHz

8MHz

Nac

100.000

100.000

100.000

Nbs

500.000

500.000

500.000

maxsectors

384.503.808

769.277.952

246.988.800

sectorsize

512

512

512


* Um vergleichbare Werte für Nac und Nbs zu erhalten, wurden die Parameter mittels des STR-H711 Boards
gelesen, da dort die maximal nutzbare CLK für SPI (bei MMC und SD Karten) 8MHz beträgt.






BoardMMCMMCplus
(HS-MMC)
SDxxHS-SDxx
ATMega1287,3728MHz (MCLK/2)
STR-H7118MHz (MCLK/6)
LPC1114 und LCP134319,2MHz48MHz24MHz48MHz
LCP176912,5MHz50MHz25MHz50MHz
LPC-H214812MHz24MHz
STM32-H10318MHz (PCLKx/2)
AT91SAM7xxx15,9744MHz47,9232MHz23,9616MHz47,9232MHz
AT91SAM3SxA Stick16(24)MHz48MHz24MHz48MHz
SAMD21..16(24)MHz48MHz24MHz48MHz




Nicht unterstützte Karten:

pC_FAT MMC_4GB-Transcend.jpg

Die Transcend 4GB MMCplus lässt sich nicht in den SPI Idle-state versetzten (GO_IDLE_STATE)
(card 394426 01 03)




Ein Blick in eine Karte? Warum nicht ...


inside Panasonic SD 16MB


inside memoQ SD 4GB


Was gibt's da so besonderes?
Der Schreibschutzschalter hat keine meldende Verbindung zum Innenleben. Das heißt, ignoriert der Adapter / der Host den Schalter, kann (wenn kein WriteProtect per Software gesetzt wurde) trotzdem geschrieben werden.



Warum unterschiedliche Angaben von maxsectors bei gleichem Brutto-Speicher ?
In eigendlich allen MMC- und SD-Karten wird Wear-Leveling betrieben, um den physikalischen Speicher gleichmäßig (max. Erase-/Schreibzyklen der Pages) zu belasten. Dabei werden die Nutzer- (logischen) Pages, z.B. mittels einer Art Tabelle, physikalischen Pages zugeordnet. Diese Verwaltung / Tabelle braucht natürlich auch eine Teil des Flash-Speichers (und darf selbst auch nicht ständig die selben phys. Pages verwenden).
Zum Wear-Leveling gibt es reichlich Patente weltweit und seit der Übernahme von M-Systems durch SanDisk liegen diese sehr zentral (->Lizenzen). Aber einige wenige gute Ideen / Alternativlösungen sind patentfrei...


Und hier noch einige hilfreiche Links zum Thema MMC/SD , SDHC sowie Wear-Leveling:



X

SD card versions


X

NM-card pinout


X

ATMega128_DevMaster


X

STR-H711


X

LPCXpresso LPC1114


X

LPCXpresso LPC1343


X

LPCXpresso LPC1769


X

LPC-H2148


X

STM32-H103


X

MCBSTM32


X

SAM7Sxx_DevMaster


X

SAM7XCxx_DevMaster


X

SAM7SExx_DevMaster


X

SAM3SxA_Stick Board


X

SAMD21 group


X

GD32VF103 Longan Nano


X

inside Panasonic SD 16MB


X

inside memoQ SD 4GB