Forum: Mikrocontroller und Digitale Elektronik Daten werden an falscher Adresse auf SD-Card abgelegt


von Guest (Gast)


Lesenswert?

Salu zusammen

Ich habe hier ein ganz komisches Phänomen und bin kurz vor dem 
Verzweifeln...

Folgendes: Ich will Daten auf eine SD-Card ablegen. Funktioniert auch 
alles, dass heisst, die Daten werden gespeichert. NUR, leider nicht an 
der vorher eingestellten Adresse und ich finde zum Teufel einfach nicht 
woran es liegt.

Habe eine 1GB Karte von PNY und sonst noch ein paar, aber momentan bin 
ich mit der am probieren. Der erste Sektor für Daten ist 519. Also 
ergibt sich die Startadresse zum Daten schreiben zu 519*512 = 265728 
Dies wir in einer unsigned long Variable abgelegt.

Ich setzte dann einen Char Buffer zusammen, welchen ich am Schluss an 
die Karte schicke. (Command zum Schreiben / Block) Der sieht 
folgendermassen aus:

temp_buffer[0] = 0x58
temp_buffer[1] = 0x0
temp_buffer[2] = 0x4
temp_buffer[3] = 0xe
temp_buffer[4] = 0x0
temp_buffer[5] = 0xff

0x58 = CMD24 Write Block
Dann kommt die Adresse die eben 265727 sein sollte (40E00 = 265728) und 
am Schluss die CRC welche ich nicht benötige. So, der liebe Kerl fängt 
nun die Daten bei der Adresse 138240 an zu schreiben. Ich schnall 
einfahc nicht wieso??

Hier noch meine Routine wie ich die umrechnung mache zwischen DEZ 
Adresse und HEX Adresse.

int i;
char temp_buffer[6];
char temp;

temp_buffer[0] = (cmd);// Schreibe Command an erste Position
for(i = 3; i >= 0; i--)
{
    temp = (char)(data >> (8*i));  // Casten der Daten
    temp_buffer[4 - i] = (temp);  // abfüllen der Daten
}
temp_buffer[5]=(crc);    // Schreibe CRC an letzte Position
for(i = 0; i < 6; i++)    // Sende Command mittels temp_buffer
sd_spi_send_byte(temp_buffer[i]);

Hat hier vielleicht jemand eine Idee an was das liegen könnte?

Achja, habe noch eine 16MB Karte mit FAT12 formatiert. Nun, dort ist die 
Startadresse 28672 und da funktioniert alles tadellos. Daten werden also 
an der korrekten Adresse abgelegt. nur wenn die Adresse "grösser" wird, 
gibts probleme.

Steh echt auf dem Schlauch. Denke es ist was ganz einfaches, aber komm 
einfach nicht drauf. Vielleicht kann mir jemand helfen, wäre echt toll

Gruss Guest

von Wolfgang Mües (Gast)


Lesenswert?

265728 ist 0x40E0.
265728 ist 0x10E0.

Es sieht also so aus, als ob ein Bit von der Karte falsch empfangen 
wird.

Hast Du die Aussendung mal mit dem Scope kontrolliert?

Gruß

Wolfgang

von Sascha (Gast)


Lesenswert?

Hallo,

an die SD-CARD wird doch die Blockadresse übergeben, und nicht die 
Byteadresse, so das du dir die Berechnung *512 sparen kannst.

Sascha

von holger (Gast)


Lesenswert?

>an die SD-CARD wird doch die Blockadresse übergeben, und nicht die
>Byteadresse, so das du dir die Berechnung *512 sparen kannst.

Das können nur die SDHC Karten.

von Guest (Gast)


Lesenswert?

Das Problem ist, dass er eben immer an dieser Adresse beginnt, auch wenn 
die HEX-Werte sehr unterschiedlich sind. Byte falsch empfangen fällt 
also aus. CLK ist sowieso nicht schnell und ich habe auch bei der 
Datenübertragung keine Fehler. Da werden ein paar 1000 Messwerte 
gespeichert und die Stimmen alle...

Beispiel: Ich habe noch eine 512MB Sandisk Karte. Dort ist die 
Startadresse irgendwas mit 140xxx aber auch dort beginnt er bei 138240. 
Die einzige Karte die geht ist eben wie gesagt die kleine, FAT12 
formatierte mit 16MB. Gehe ich mit der Adresse über einen gewissen Wert 
kommt nur noch murks.

Umgebung: MSP430F149  Eclipse mspgcc

:o((

Gruss

von termite (Gast)


Lesenswert?

Hallo

Du kannst auch mal ein kleines testprogramm schreiben, das einfach nur 
auf definierte sektoren auf der SD - card schreiben soll. z.B. sektor 0, 
sektor 1 , ... und dann die karte am pc auswerten. der inhalt auf der 
karte ist danach zwar schrott, aber wenn der inhalt des sektors bekannt 
ist, lässt sich der auch finden. ggf einfacher fur die fehlersuche.

Hab ich damals auch gemacht, als der olle dma und das sd-card Interface 
so dumme zicken gemacht hat beim schreiben der SD - Card. grrr

von holger (Gast)


Lesenswert?

>Gehe ich mit der Adresse über einen gewissen Wert
>kommt nur noch murks.

Lass dir doch mal temp_buffer[1 bis 4]
ausgeben. Steht dort auch drin was du möchtest?

von Jean P. (fubu1000)


Lesenswert?

Guest wrote:
> Ich setzte dann einen Char Buffer zusammen, welchen ich am Schluss an
> die Karte schicke. (Command zum Schreiben / Block) Der sieht
> folgendermassen aus:

Tja nen char Buffer kannste vergessen, benutzte unsigned char !!!
Ansonsten läuft dein char bei Zahlen grösser 128 über.

Zeig mal deine Rechnung mit deinem unsigned long Wert. Vielleicht ist da 
schon der Fehler begraben.

Gruß

von jl (Gast)


Lesenswert?

der char buffer ist schon OK, auch wenn unsigned eleganter wäre, bezogen 
auf die zu versendenden Daten. Machst ja keine Berechnungen mehr damit.

Berechnest du die Adresse (wert in data)? Wenn poste mal den Code dazu. 
Eventuell rechnest du noch mit signed int bevor das Ergebniss einem long 
zugewiesen wird.

Ansonsten ist das einfachste im temp_buffer[1 bis 4] nachzuschauen ob da 
noch das richtige steht (siehe Holgers post).

JL

von Sascha (Gast)


Lesenswert?

@Guest

wie stellst du überhaupt fest, das deine Daten an der Adresse 138240 
stehen?
Mit deinem Controller der die Daten geschrieben hat oder mit einem Prog. 
am PC - wenn ja mit welchem.

Sascha

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.