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

- 다음의 그림은 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 데이타 입니다, 위의 로직아날라이저 제작사에서 프로그램을 다운로드 받아 여시면 확인 가능합니다.
|