cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H745 SDMMC block reads returning empty

Matt__
Associate II

Hello, 

I am working on trying to get the SDMMC1 on the stm32h745 to function properly. Currently I have this for my current initialization of the SDMMC and it does not return any errors. 

hsd1.Instance = SDMMC1;
hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B; 
hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
hsd1.Init.ClockDiv = 0;

if (HAL_SD_Init(&hsd1) != HAL_OK) {
Error_Handler();
}
if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK) {
Error_Handler();
}

 

After this is done, I try to use the HAL_SD_ReadBlocks_IT(); and also this does not return any errors. The issue I am having is the return data buffer has no data in it when this function finishes. Currently I am not sure what the issue might be, the clocks and appear as they are sending data but I am getting nothing in my return data. Any thoughts or ideas on what might resolve this problem? 

Thanks 

12 REPLIES 12
AScha.3
Super User

Hi,

so you want use sdcard - right ?

And no file system , no fatfs , no mount  ?

Anyway - at first stay on 1 bit mode . (After working fine, can try 4 bit ..more critical)

If you feel a post has answered your question, please click "Accept as Solution".

Yes I am using a sd card and will eventually implement fatfs, but was trying to get the SDMMC to work first. I am currently having no luck in getting the system to get any data running in 1 bit mode. 

Ok, i can only tell, how i did (always):

install/set in Cube fatfs , sdcard ...etc. (no dma );

then first use a working sdcard , try mount . If this working...you win the price . :)

fresult = f_mount(&SDfs, (TCHAR const*)SDPath, 1);	// SD card mount, 1 = now !

fresult = 0 =  no error . (As long this is not working, you have a hardware problem.)

First important thing: hardware ->

(in Cube) sd-pins setting : set on all pins : pullup , speed medium ; clk (i use ) 100MHz , div 1 (-> 50MHz for card).

And short lines to card , cpu -- card : max. 50mm (otherwise...good luck. )

If you feel a post has answered your question, please click "Accept as Solution".
Saket_Om
ST Employee

Hello @Matt__ 

 

Please refer to the example STM32H743I-EVAL/Examples/SD/SD_ReadWrite_IT  to check what is missing in your application. 

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.
Saket_Om
EXUE.2
ST Employee

Hello @Matt__ 

1.for your code, since you configure BisWide to 1B by  "hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B; ", why you configure BisWide to 4B later by "if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)"?

below is my code:

/* uSD device interface configuration */
hsd->Instance = SDMMC1;
hsd->Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
hsd->Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
hsd->Init.BusWide = SDMMC_BUS_WIDE_4B;
hsd->Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
// (SD ker CLK: 200M) SDMMC_HSpeed_CLK_DIV(2) or SDMMC_NSpeed_CLK_DIV(4)
hsd->Init.ClockDiv = 4;
#if (USE_SD_TRANSCEIVER != 0U)
// 1V8 Transceiver/Switcher not present
hsd->Init.TranceiverPresent = SDMMC_TRANSCEIVER_NOT_PRESENT;
#endif /* USE_SD_TRANSCEIVER */

/* HAL SD initialization */
if(HAL_SD_Init(hsd) != HAL_OK)
{
     ret = HAL_ERROR;
}

if(HAL_SD_ConfigWideBusOperation(&hsd_sdmmc[Instance], SDMMC_BUS_WIDE_4B) != HAL_OK)
{
    ret = BSP_ERROR_PERIPH_FAILURE;
}

(void)HAL_SD_ConfigSpeedBusOperation(&hsd_sdmmc[Instance], SDMMC_SPEED_MODE_HIGH);

2. I have met similar problem before, the root cause is that the SD card have several kinds, high-speed and low-speed, when I insert the low-speed SD card, it didn't work, but when I insert high-speed card, it worked, so can you check if your problem is same as mine?

So I was able to get the f_mount to succeed but only at low speeds. Currently I cannot figure out how to get past 6Mhz at 4 bits bandwidth and have the f_mount succeed. I have tried adjusting the clocks in the cubemx but can't seem to get any faster. Any ideas of what might be limiting this? 

Good ! First success ... :)

Any ideas of what might be limiting this? 

Hardware !

Still no statement : And short lines to card , cpu -- card : max. 50mm (otherwise...good luck. )

How long is distance cpu -- card ?

The cpu/sdmmc can work at 50M /4bit with sdcard - i have it here, running every day .

And only (!) use 1bit mode , until this working up to 50M without any problem.

If you feel a post has answered your question, please click "Accept as Solution".

So the lines are only 45mm long, they are not shorted. There is a series resistor on all lines to help clean up the signal and pull up resistors to 3.3v on all lines except clk. I have an oscilloscope on the lines and the signals look clean coming across to the card

 

Ok,

so value of pullups, series r ?

And cpu port/speed setting ?

If you feel a post has answered your question, please click "Accept as Solution".