AVR32-Problem: sd_mmc_spi_get_cid() sd_mmc_spi_get_csd()

OP #1386234
Ich versuche gerade die CID der MMC auszulesen (sd_mmc_spi_get_cid()) 
und bekomme lauter 0x00 zurück. sd_mmc_spi_get_csd() liefert dagegen ein 
einwandfreies Ergebnis.

Ich frag mich: ist das ein Fehler im Framework oder werden die CSDs und 
CIDs nicht immer vom Hersteller gesetzt? Da ich vier versch. Karten mit 
demselben Ergebnis (CID) habe, tippe ich eher auf das erste.

µC: AVR32 UC3A
Framework: UC3A Software-Framework 1.4.0.

Karte Nr.1 XMore 1GB
 - keine CID: 16 x 0x00
 - CSD: OK

Karte Nr.2 Fujuitsu 256MB
 - keine CID: 16 x 0x00
 - CSD: OK

Karte Nr.3 Sandisk 128MB
 - keine CID: 16 x 0x00
 - keine CSD: 16 x 0x00

Karte Nr.4 Panansonic 16MB
 - keine CID: 16 x 0x00
 - keine CSD: 16 x 0x00
OP
Bin jetzt einen halben Schritt weiter. die Fkt. wird an der Stelle --> 
verlassen. Jemand eine Idee?

Bool sd_mmc_spi_get_cid(U8 *buffer)
{
U8 retry;
unsigned short data_read;
  // wait for MMC not busy
  if (KO == sd_mmc_spi_wait_not_busy())
    return KO;

  spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS);  // select SD_MMC_SPI
  // issue command
  r1 = sd_mmc_spi_command(MMC_SEND_CID, 0);
  // check for valid response
  if(r1 != 0x00)
  {
    spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS);  // unselect 
SD_MMC_SPI
    sd_mmc_spi_init_done = FALSE;
-->    return KO;
  }
  // wait for data block start
  retry = 0;
  while((r2 = sd_mmc_spi_send_and_read(0xFF)) != MMC_STARTBLOCK_READ)
  {
    if (retry > 8)
    {
      spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS);  // unselect 
SD_MMC_SPI
      return KO;
    }
    retry++;
  }
  // store valid data block
  for (retry = 0; retry <16; retry++)
  {
   spi_write(SD_MMC_SPI,0xFF);
   spi_read(SD_MMC_SPI,&data_read);
   buffer[retry] = data_read;
  }
  spi_write(SD_MMC_SPI,0xFF);   // load CRC (not used)
  spi_write(SD_MMC_SPI,0xFF);
  spi_write(SD_MMC_SPI,0xFF);   // give clock again to end transaction
  spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS);  // unselect SD_MMC_SPI
  return OK;
}

U8 sd_mmc_spi_command(U8 command, U32 arg)
{
U8 retry;

  spi_write(SD_MMC_SPI,0xFF);            // write dummy byte
  spi_write(SD_MMC_SPI,command | 0x40);  // send command
  spi_write(SD_MMC_SPI,arg>>24);         // send parameter
  spi_write(SD_MMC_SPI,arg>>16);
  spi_write(SD_MMC_SPI,arg>>8 );
  spi_write(SD_MMC_SPI,arg    );
  spi_write(SD_MMC_SPI,0x95);            // correct CRC for first 
command in SPI (CMD0)
                                  // after, the CRC is ignored
  // end command
  // wait for response
  // if more than 8 retries, card has timed-out and return the received 
0xFF
  retry = 0;
  r1    = 0xFF;
  while((r1 = sd_mmc_spi_send_and_read(0xFF)) == 0xFF)
  {
    retry++;
    if(retry > 10) break;
  }
  return r1;
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.