Hallo,

Ik ben weer ven wat aan het prutsen met mijn sd kaart interface. Voor het debuggen heb ik een routine gemaakt die de gehele inhoud van het kaartje (16mb) uitleest en verstuurd via RS232 (wat overigens behoorlijk lang duurd ;)). Mij leek het logisch dat het aantal bytes gewoon 1024*1024*16 = 16777216 zou zijn, maar het hele rare is dat het programma volledig vastloopt na 14909440 bytes. Het lijkt erop dat de kaart dan een error terug geeft dat het address niet bestaat.

Klopt het dat het kaartje maar 14909440 bytes heeft? Ik hoop dat iemand dit weet (Free_electron misschien?), want ik kan het echt nergens vinden...

iig bedankt!
Wouter Sijm

Ohjah, als ik exact dezelfde routine gebruik, maar dan de lijnen code die ik gebruik voor het verhogen van het adres als comment zet, loopt ie hem wel 16777216 keer, het ligt dus niet aan een verkeerd ingesteld loop. Ook heb ik de routine voor het verhogen van het address in de simulator getest, en de getallen die hieruit kwamen rollen klopte precies.

waarchijnlijk heb je geen toegang tot het controle blok van de SD kaart / of je hebt een slechte sector.

het controleblok bevat de gemetrie van de kaart en de informatie over eventuele slechte paginas in de flash.
je moet dat eerst lezen en verwerken voor je ander eoperaties gaat uitvoeren opde kaart.

De grootte van de kaart kun je berekenen met behulp van de gegevens in het CSD register. Plug de kaart eens in een card reader en kijk hoeveel plaats er is, of post de 128-bits van het CSD register eens.

Of de SD kaart zelf een bad sector tabel of zo heeft weet ik niet (volgens free_electron hierboven dus wel). Het kan ook zijn dat het filesysteem op de kaart hiervoor zorgt.

Ook bij USB-sticks is het werkelijke geheugen altijd minder dan het aangegeven geheugen, waarschijnlijk ligt het daaraan.

Op 13 oktober 2005 07:28:42 schreef Nicondrio:
Ook bij USB-sticks is het werkelijke geheugen altijd minder dan het aangegeven geheugen, waarschijnlijk ligt het daaraan.

Niet geheel waar.
Als je een image van een floppy maakt is die precies
1.40 Mb
1440 kb
1474560 bytes
De informatie die je erop kwijt kan is echter 1.38 MB.
Deze 0.02 Mb wordt gebruikt voor het FAT systeem.
Zo is dat met USB drives ook.

Hoe groter de opslagcapacitiet, des te groter de overhead voor het Filesystem.

Op lowlevel niveau moet je gewoon 1474560 bytes kunnen benaderen.(Even van een floppy uitgegaan)

Op 13 oktober 2005 08:26:43 schreef Willie Worteltje:
[...]

Niet geheel waar.
Als je een image van een floppy maakt is die precies
1.40 Mb
1440 kb
1474560 bytes
De informatie die je erop kwijt kan is echter 1.38 MB.
Deze 0.02 Mb wordt gebruikt voor het FAT systeem.
Zo is dat met USB drives ook.

Hoe groter de opslagcapacitiet, des te groter de overhead voor het Filesystem.

Op lowlevel niveau moet je gewoon 1474560 bytes kunnen benaderen.(Even van een floppy uitgegaan)

Het is iets ingewikkelder. Een floppy heeft een aantal kanten, cylinders en sectors. Een sector heeft een aantal bruikbare databytes. En de capaciteit is dus sectors grootte * aantal sectoren per cylinder * aantal cylinders. Omdat je de o.a. de sectorsize kan varieren kan de hoeveelheid data verschillen, denk b.v. aan de 1.8 Mb bootfloppen van LINUX of de 1.2 Mb Japanse DOS floppies (waar je trouwens een multimode drive voor nodig hebt). Google vindt hier vast wel meer uitleg over.

Zo is het bij USB sticks gedeeltelijk. Je hebt gelijk dat het 'management' gedeelte van het filesysten op je stick plaats in neemt, maar dan haal je vaak nog steeds niet de orinele grootte.

Voorbeeld: Ik heb een USB stick van 256MiB. Als ik hiervan een raw-image maak onder linux, krijg ik een image van 257949696 bytes, 246 MiB (deze grootte is trouwens ook onder windows bij disk management te zien). Van deze 246MiB is een gedeelte gebruikt voor de FAT en het bootrecord, de rest is beschikbaar voor data.

Nu missen er echter nog 10MiB om tot de volle 256MiB te komen. Mijn USB stick heeft een doorzichtige behuizing waardoor je de IC's erin kan zien zitten: een USB controller chip van M-Systems en een NAND flash IC van Samsung.

Het flash IC heeft in totaal 2112Mbit (264 MiB) geheugen, hiervan worden 8MiB gebruikt voor gegevens over de pages/sectoren (o.a. of een page kaduuk is), waardoor je in totaal 256MiB voor je data zou hebben. Echter: omdat sectoren in het flash geheugen kapot kunnen gaan, is er door het controller IC een gedeelte van het geheugen gereserveerd als 'hot-spare'. In mijn geval is dat dus 10MiB, waardoor ik 246MiB effectief over houd.

Hoe dit geheel nu zit bij SD kaarten weet ik niet, misschien is er wat te vinden op de site van de maker van je SD-kaart. Voor de rest is SD redelijk lastig aangezien een heel beperkt gedeelte van de specificatie openbaar is. De rest wordt door de SD sekte Group streng geheim houden (waarschijnlijk omdat hiet ook de security mogelijkheden van de SD kaarten in beschreven zijn, oftewel 'security by obfuscation'), tenzij je veel geld hebt.

Bedankt voor de replies!
Ik heb even het CSD register uitgelezen, en dit kwam eruit:

 00 5D 01 32 13 59 80 E3 76 D9 CF FF 16 40 00 4F 

Verder heb ik ook nog even in de windows verkenner gekeken naar de grootte. Er stond dat het aantal beschikbare ruimte 14880768 bytes was. De kaart is hiervoor geformatteerd als FAT (geen idee welke fat, ik heb het gedaan via de windows verkenner-->rechtklikken op verwisselbare schijf-->formatteren, en dan stond er alleen fat)

Edit: Zat een foutje in CSD data, ff juiste CSD data neergezet. Hoe kan ik uit deze data bekijken hoe groot dat mijn kaartje is?

[Bericht gewijzigd door Wouter Sijm op ]

De structuur van het CSD register is beschreven in 'The
MultiMediaCard System Specification'. Hierin staat ook beschreven hoe je de grootte van de kaart met behulp van de velden in dit register kan vinden. Wel hierbij oppassen: enkele registers wijken af tussen SD en MMC.

Ik heb net effe naar je gegevens uit het CSD register gekeken. Als ik daarmee de grootte uitreken kom ik inderdaad op 14909440 bytes: 512 [READ_BL_LEN] * 910 [C_SIZE] * 32 [C_SIZE_MULT].

Op 13 oktober 2005 13:59:32 schreef H3AsO4:
De structuur van het CSD register is beschreven in 'The
MultiMediaCard System Specification'. Hierin staat ook beschreven hoe je de grootte van de kaart met behulp van de velden in dit register kan vinden. Wel hierbij oppassen: enkele registers wijken af tussen SD en MMC.

Ik heb net effe naar je gegevens uit het CSD register gekeken. Als ik daarmee de grootte uitreken kom ik inderdaad op 14909440 bytes: 512 [READ_BL_LEN] * 910 [C_SIZE] * 32 [C_SIZE_MULT].

Oke, harstikke bedankt voor het posten (en uitrekenen) van de formule. Ik was hem wel in een word document tegengekomen, maar ik kon deze dus nergens meer terug vinden.

Bedankt allen! Nu zit er iig geen bug in mijn debug code ;)