Skip to main content
trave.1
Associate II
November 30, 2022
Question

problems with STM32F405 SD Card 4wiresCubeMX

  • November 30, 2022
  • 3 replies
  • 2573 views

hello,

i work in STM32F405, create projet with cubeMx, SD 4 wires.

Pull up in the schematic D0..3 , CMD, no internal pull in cube MX

mount return FR_NOT_READY

when SD_WideBus_Enable() (in hal_sd) call:

in SD_FindSCR() after the cmd 51 , there is a polling wait

but i have SDIO_STA_STBITERR

and no data is return by the SD:

i will try to reduce clock:

clock init: 0x76: 400khz to 0xBA(400khz if the PLL output 48Mhz is 72Mhz) see in errata sheet STMF405

clock after SD_CLK: divider = 0x76 the same of init.

any idea?

thx

This topic has been closed for replies.

3 replies

trave.1
trave.1Author
Associate II
December 1, 2022

update:

  • i have old project with CubeMx 6.6.1 in STM32F405 with SD 4wire fatfs no DMA, clock divider 20 :

MxCube.Version=6.6.1

  • MxDb.Version=DB.6.0.60
  •  
  • old param default: NO HW control, rising...
  • f_mount with no force, and opendir after.

if i migrate to the new CubeMx 6.7.0, regenerated software and doesn't works.

i passed 3 days to search and i will continue to find problem.

0693W00000WJxeaQAD.png 

0693W00000WJxSUQA1.png 

with the new cube mx:

void MX_SDIO_SD_Init(void)
{
 
 /* USER CODE BEGIN SDIO_Init 0 */
 
 /* 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;
 hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
 hsd.Init.ClockDiv = 20;
 /* USER CODE BEGIN SDIO_Init 2 */
 /* USER CODE END SDIO_Init 2 */
 
}

//old
 hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
//new 
hsd.Init.BusWide = SDIO_BUS_WIDE_4B;

 /* Configure SDIO peripheral interface */
 (void)SDIO_Init(hsd->Instance, hsd->Init);
 
//so use CubeMx parameters for the first initialisation
//the first initialisation must be in 1 Wire. bug in last CubeMx.

Amel NASRI
Technical Moderator
December 9, 2022

Hi @trave.1​ ,

This looks like the same issue as described by @Brieuc​ in this question.

I let out STM32CubeMX expert @Semer CHERNI​ deeply review both cases. Meanwhile, you can try to with the old configuration (hsd.Init.BusWide = SDIO_BUS_WIDE_1B;) to check if it works properly.

-Amel

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
Visitor II
December 7, 2023

The better way to solve this for me wasn't changing the generated code but solving a bug (IMO it's a bug or bad  implementation).

From SD_InitCard() remove (void)SDIO_Init(hsd->Instance, hsd->Init);

Because that initialization is made with the final speed and wide parameters instead, and it's also redundant.

Commenting that line solves the issue.

 

And the generated code can be kept at SDIO_BUS_WIDE_4B as specified in the project.

 

In BSP_SD_Init  

 

if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)

 

SDIO_BUS_WIDE_4B should be replaced by   hsd.Init.BusWide (according to setting).

It is surprising this bug hasn't been fixed after quite a few CUBE releases.