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
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
Hallo, an die SD-CARD wird doch die Blockadresse übergeben, und nicht die Byteadresse, so das du dir die Berechnung *512 sparen kannst. Sascha
>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.
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
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
>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?
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ß
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.