Home » MCUS

MCUS

제목[STM32] SDIO 4B + FATFS 사용 시 f_mount 에러 정리2024-11-26 11:56
작성자 Level 10
첨부파일BMG_Application.zip (3.8KB)로직아날라이저데이타.zip (142.73MB)
  • 개발 환경
    • STM32 CubeMX 6.12.1
    • STM32F429ViT6
    • STM32Cube FW_F4 V1.28.1
    • IAR EWARM 9.60.3
    • SDIO 4B MODE
    • FATFS
    • 로직아날라이저 : https://www.qdkingst.com/en LA5032 

 

  • 개요
    • 신규 프로젝트 수행을 위해 라이브러리를 비교적 최신 것으로 적용 하는 과정에서 예전에 겪었던 문제를 또 다시 겪었기에 이를 반복 하기 싫어 정리 합니다.
    • CubeMX 를 사용해서 SDIO 4B 모드를 적용 할 경우 f_mount 에서 에러가 발생 합니다.
    • 이를 확인하기 위해 로직 아날라이즈를 물려서 확인한 결과 아래 그림 처럼 초기화 과정 중에서 문제가 발생 해서 f_mount를 반복적으로 수행하고 있습니다. (제가 반복하도록 코딩 했습니다.)

 

4B 로 초기화 중

 

    • 다음의 그림은 1B 모드로 초기화 후 정상적으로 4B 로 동작하고 있을 때의 파형입니다.

 

1B 로 초기화 진행 후 4B 정상 동작

 

    • 정리하면 4B 모드라 하더라도 1B 로 초기화 완료 후 4B 로 동작 해야 하는데 CubeMX 가 생성해주는 코드는 Bug 로 인해 이 부분에서 문제가 발생합니다. (오래된 문제 인데 여전히 개선 안되고 있습니다.)

 

  • 수정 방법
    • CubeMX 에서 생성된 코드 중 (4B MODE 로 해서 생성)  아래 처럼 변경 합니다.
static void MX_SDIO_SD_Init(void)
{

  /* USER CODE BEGIN SDIO_Init 0 */
  HAL_SD_DeInit(&hsd);
  /* USER CODE END SDIO_Init 0 */

  /* USER CODE BEGIN SDIO_Init 1 */

  /* USER CODE END SDIO_Init 1 */
  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
//  hsd.Init.BusWide = SDIO_BUS_WIDE_4B;  // 이 부분을 Masking 하고 아래 부분을 추가
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 0;
  /* USER CODE BEGIN SDIO_Init 2 */

  /* USER CODE END SDIO_Init 2 */

}
    • 이렇게 하면 1B 모드로 초기화 과정을 진행 후 4B 로 정상 동작 합니다.
    • FatFS 초기화 과정 중 SD_Driver Loading 과정 중 "bsp_driver_sd.c" 의 "BSP_SD_Init" 함수를 호출 하게 되는데 여기서 4B Mode 로 변경 되어 정상적인 Access 가 됩니다.
__weak uint8_t BSP_SD_Init(void)
{
  uint8_t sd_state = MSD_OK;
  /* Check if the SD card is plugged in the slot */
  if (BSP_SD_IsDetected() != SD_PRESENT)
  {
    return MSD_ERROR;
  }
  /* HAL SD initialization */
  sd_state = HAL_SD_Init(&hsd);
  /* Configure SD Bus width (4 bits mode selected) */
  if (sd_state == MSD_OK)
  {
    /* Enable wide operation */
    if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
    {
      sd_state = MSD_ERROR;
    }
  }

  return sd_state;
}
  • 첨부 파일은 프로젝트에 적용된  ioc 파일과 로직아날라이즈의 wave 데이타 입니다, 위의 로직아날라이저 제작사에서 프로그램을 다운로드 받아 여시면 확인 가능합니다.
#stm32#sdio#fatfs
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)