-
        

Ergebnis 1 bis 2 von 2

Thema: Atmega644 & Fat von Holger Klabunde

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.12.2006
    Beiträge
    26

    Atmega644 & Fat von Holger Klabunde

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    So nun nach anfänglichen Startproblemen in C komm ich einigermasen mit dem Syntax klar.

    Jetzt habe ich eine kleine Testroutine gebaut die per obiger Lib aine Datei mit 10000 Datensätzen schreibt.

    Jetzt das Problem.

    Hier liegen 10 SD KArten rum.
    Folgende Karten funtkionieren:
    1 x 2 GB HAMA Secure Digital Card
    3 x 1 GB CNMemory First Class

    Folgende Karten funktionieren nicht:
    1 x 2 Gb Verbatim
    3 x 512 MB Sandisk
    2 x 256 TakeMS

    Laut Scope sieht man auch, dass das Signalverhalten komplett verschieden ist.

    Letzten Endes sind alle Karten per Windows in FAT16 formatiert.

    Hier die beiden Ausgaben der Debugfunktion der Lib.

    Code:
    Send CMD58
    
     0x80 0xFF 0x80 0x00
    
    Read CSD
    
     0x00 0x2F 0x00 0x32 0x5F 0x59 0x83 0xBD 0xED 0xB7 0xFF 0x9F 0x96 0x40 0x00 0xA9
    
    
    CSD done
    
    CSD_STRUCT 0
    SPEC_VERSION 0
    SD card
    
    c_size 3831 , c_size_mult 512
    DriveSize 980992 kB , maxsect 1961984
    mmc_init() ok
    
    FAT16
    
    bootSecOffset 255
    Reserved Sectors 1
    FAT Sectors 240
    Num. of FAT's 2
    secPerCluster 32
    BytesPerCluster 16384
    FATFirstSector 256
    FirstRootSector 736
    RootDirSectors 32
    FirstDataSector 768
    maxsect 1961984
    FirstDirCluster 0
    maxcluster 61290
    
    Send CMD58
    
     0x80 0xFF 0x80 0x00
    
    Read CSD
    
     0x00 0x2F 0x00 0x32 0x5F 0x5A 0x83 0xB7 0x6D 0xB7 0xFF 0xBF 0x96 0x80 0x00 0xE9
    
    
    CSD done
    
    read_bl_len is 1024 !
    CSD_STRUCT 0
    SPEC_VERSION 0
    SD card
    
    c_size 3805 , c_size_mult 512
    DriveSize 1948672 kB , maxsect 3897344
    mmc_init() ok
    
    FAT16
    
    bootSecOffset 0
    Reserved Sectors 4
    FAT Sectors 238
    Num. of FAT's 2
    secPerCluster 64
    BytesPerCluster 32768
    FATFirstSector 4
    FirstRootSector 480
    RootDirSectors 32
    FirstDataSector 512
    maxsect 3897344
    FirstDirCluster 0
    maxcluster 60890
    Ich werde nochmal Testen, inwieweit versch. Partitionierungen und Formatierungen Einfluß auf die Lesbarkeit haben.

    Ach ja, ich nutze die FATSingleopt.zip von Holgers Seite. Kleine Änderungen wie das Entfernen der SPI Register Definitionen (sind wohl schon in AVRGCC definiert) muß man noch machen.

    Wenn es dann läuft, ist der Zugriff wirklich flott. Die 10 000 Recordsets werden so in ca. 18 Sekunden geschrieben.

    Hat mal jemand einen Tipp wie ich evtl. alle Karten ans laufen bekomme.


    Gruß,

    Stephan

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.12.2006
    Beiträge
    26
    Laut SD Card Beschreibung gibt die SD Karte nach einem CMD0 Befehl ein 0x01 zurück.
    Also wie schon beschrieben, ein Großteil meiner SD Karten machen das auch. Der Rest gibt sowas zurück:

    • Cmd 00: 0x9F

      Cmd 00: 0xFF 0x05


    oder sowas
    • Cmd 00: 0x1F

    oder das noch
    • Cmd 00: 0xBF

      Cmd 00: 0xFF 0xC1


    Nun dachte ich mir, mmh, es ist immer das erste Bit gesetzt. Ignorieren wir mal den Rest und sehen was passiert.
    Die mmc_spi.c wie folgt geändert.
    Originalversion:
    Code:
     for(i=0; i<CMD0_RETRYS; i++)
      {
       //send CMD0 for RESET
       by=MMCCommand(MMC_CMD0,0);
       if(by  ==  IN_IDLE_STATE) break;
      }  
    
    #ifdef MMC_DEBUG_CMD0_TIMEOUT
     printf("CMD0 retrys %u\n", (U16)i);
    #endif
    
     if(by  == IN_IDLE_STATE )
    Teständerung:
    Code:
    for(i=0; i<CMD0_RETRYS; i++)
      {
       //send CMD0 for RESET
       by=MMCCommand(MMC_CMD0,0);
       if(by && IN_IDLE_STATE  ==  IN_IDLE_STATE) break;
      }  
    
    #ifdef MMC_DEBUG_CMD0_TIMEOUT
     printf("CMD0 retrys %u\n", (U16)i);
    #endif
    
     if(by && IN_IDLE_STATE == IN_IDLE_STATE )
    Ich habe also per AND den rest "rausgefilter".

    Siehe da, ich bekomme per Debugmeldung die kompletten SD Kartendaten.
    ->

    • CSD done

      CSD_STRUCT 0
      SPEC_VERSION 0
      SD card

      c_size 3919 , c_size_mult 128
      DriveSize 250880 kB , maxsect 501760
      mmc_init() ok

      RS 0 0x00000000
      Cmd 17: 0xFF 0x00

      FAT32

      bootSecOffset 0
      Reserved Sectors 38
      FAT Sectors 977
      Num. of FAT's 2
      secPerCluster 4
      BytesPerCluster 2048
      FATFirstSector 38
      FirstRootSector 1992
      RootDirSectors 0
      FirstDataSector 1992
      maxsect 501760
      FirstDirCluster 2
      maxcluster 124944
      RS 38 0x00000026
      Cmd 17: 0xFF 0x00


    Sieht ja erstmal gut aus. Allerdings haut er dann beim Beschreiben der Karte div. Fehler mit rein.
    Ist natürlich die Strafe für das ignorieren der anderen Rückgabeflags.

    Ich bekomme zwar die Kartendaten raus, bei einer 256MB Karte kann ich auch dann Daten schreiben. Die anderen bleiben jedoch "Schreibresistent".Kann mir mal jemand einen Tipp geben wo mein Denkfehler liegt.

    Und eine Sache verstehe ich erst recht nicht, warum arbeitet Bascom mit allen Karten ohne Probleme?

    Gruß,

    Stephan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •