Skocz do zawartości

Podłączenie karty SD do STM32F411E, błąd FR_DISK_ERR


witek117

Pomocna odpowiedź

Witam,

męczę się z tym już bardzo długo. Zgodnie z różnymi opisami i filmami w internecie próbuję podłączyć kartę SD do płytki discovery. Podłączenie samo w sobie jest łatwe, bo to tylko kilka kabli, jednak uruchomienie już nie. Korzystam z biblioteki HAL i CUBEMX, więc co może pójść nie tak? No właśnie nie wiem. Niezależnie czy podłącze kartę na 1B wire czy 4B, to problem jest dokładnie ten sam, przy f_mount wywala FR_DISK_ERR. W opisie doczytałem, że oznacza to A hard error occurred in the low level disk I/O layer, jednak dalej to nie pomaga. Czy komukolwiek udało się uruchomić kartę SD na płytce STM32F411E?

Podłączenie mam na przewodach 15cm, każdy z lini d0 ... d3 oraz CMD podciągnięte do zasilania (3.3V) przez rezystor 47k przy samej karcie. Próbowałem dwa różne adaptery, jednak efekt ten sam. Na oscyloskopie widzę jak komendy na linii CMD są nadawane, a później leci odpowiedź na D0 (lub dodatkowo D1, D2, D3). 

Kod to jest tyle, co wygenerował CUBEMX, więc chyba nie ma sensu go tu wstawiać.  

Pozdrawiam

Link do komentarza
Share on other sites

Sprawdziłem i wywala się przy SD_TIMEOUT, jakby oczekiwało na odpowiedź, a ona nie następuje, chociaż karta wysyła dane.

Jest to w pliku sd_diskio.c, linijka 193, w tym wypadku co podałem:

DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_ERROR;
  ReadStatus = 0;
  uint32_t timeout;
#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)
  uint32_t alignedAddr;
#endif

  if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                           (uint32_t) (sector),
                           count) == MSD_OK)
  {
    /* Wait that the reading process is completed or a timeout occurs */
    timeout = HAL_GetTick();
    while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
    {
    }
    /* incase of a timeout return error */
    if (ReadStatus == 0)
    {
      res = RES_ERROR;
    }
    else
    {
      ReadStatus = 0;
      timeout = HAL_GetTick();

      while((HAL_GetTick() - timeout) < SD_TIMEOUT)
      {
        if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
        {
          res = RES_OK;
#if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)
            /*
               the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address,
               adjust the address and the D-Cache size to invalidate accordingly.
             */
            alignedAddr = (uint32_t)buff & ~0x1F;
            SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr));
#endif
           break;
        }
      }
    }
  }

  return res;
}
while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
    {
    }

Tu się wiesza, a później ReadStatus nadal jest równy 0 więc wywala błąd.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.