2018-10-24 03:15 PM
Hi, pretty sure this is a newbie type question. I'm using the SDMMC interface on an STM32L476. Right now it is just wired to a Nucleo board so I can do some benchmarking before committing it to a layout. I'm using STM32CubeMX and following the example in section 3.3 of UM1721 (Fatfs on CubeMX). After learning the hard way pullup resistors *are* necessary (some other posts said not), I am able to talk to a card, but only if I use polled mode ("Use DMA Template" set to disable in STM32CubeMX Fatfs settings). When enabled, the code hangs in the sd_diskio_dma.c SD_Read() routine right after the BSP_SD_ReadBlocks_DMA() call.
The note for "Use DMA Template" says to ensure that DMAs are properly configured but no more info. In the SDMMC configuration I've tried tried selecting SDMMC1 and then both SDMMC1_TX_SDMMC1_RX. I always get the stall. I am sure there i something basic I'm missing, but been at it for a couple days now and deciding to ask. Since this seems a very basic "follow the app note", rationalizing it might be useful for others too.
I've only recently migrated from the basic StcPeriph libraries to STMCube, starting with the LL routines, this is my attempt using HAL.
will
2018-10-25 01:18 PM
check out these videos, they helped me when setting up SDMMC using CubeMX
https://www.youtube.com/watch?v=Y5UMTGQDmog&t=141s
His channel is very helpful
2018-10-26 05:25 AM
Bojan:
Thanks for the link. Good watching. I've tried a few of the suggestions short of going all the back to the 1.21 release (the firmware is up to 1.27 now). I'll report back once I find a way to get things working.
will
2018-10-26 07:08 AM
Np Will
Also if you think the issue might be hardware related I would suggest using breakout boards similar to this one
https://www.sparkfun.com/products/13743?_ga=2.202773905.1818468449.1540488118-2054388973.1537370868
These are really cheap and speed up prototyping alot.
The newer firmware shouldn't really be much of an issue, I just recently set up SDMMC with the new firmware on the STM32L476 just by following his videos
2018-10-26 08:48 AM
Thanks Bojan, just need to do some more fiddling. The release notes for CubeMX 4.24 claim to have fixed the issue which is after the videos were made. I'm running 4.26 now, just behind the current 4.27 release. I need to do some timeline unraveling to see what parts of the video may still be needed. I'm pretty confident on the hardware (6 wires and 5 resistors!) especially given all works well in polled IO mode. I did have the same issue of comms not working well at 24MHz as noted in the videos.
I did run my performance test in polled mode and it looks good. I need a sustained 1Mbps and am getting close to 17Mbps even with a 6MHz clock. Hopefully I can get the full 24MHz once I get a real board layout and not wires wire-wrapped to a Nucleo board! :)
I'll note how it goes as I get it figured out.
will
2018-10-26 02:34 PM
>>Hopefully I can get the full 24MHz once I get a real board layout and not wires wire-wrapped to a Nucleo board!
Should be able to get north of 50 MHz on any given MicroSD card
Don't recall the numbers for the L4/L4+, but gotten 30 MB/s (240 Mbps) read speeds off materially similar socket/wiring arrangements.
Write big aligned blocks.
2018-10-27 06:23 AM
Bojan:
The board I got a while back was the Adafruit one that had an SPI-wired SD card and LCD to warm me up for another project for which SPI-based SD card comms was fine. They are handy. For this test I already had reader sockets left over from that project so opted to just sky-wire it (see picture in post to Clive below). I didn't have pullups on any lines after reading some posts saying they wern't necessary. Seeing scope traces made me wonder. It took a couple days to get to the right combination of pullups plus non-DMA to finally see things working. I'm getting there, just taking a bit longer than I had expected.
will
2018-10-27 06:33 AM
Clive:
That is some serious speed. My sky wires are even shorter (see picture) and I was seeing some not-so-great signals and errors at 24MHz. I'm not terribly worried just yet, I'm sure a good layout will help considerably. That is good to know, though.
I've been wondering if my DMA-not-working issue may be something that STMCube32MX didn't have quite right specifically with the STM32F476, but see that you are using the exact same chip/board? Can I ask what revision CubeMX software/drivers you are using and FatFS/SDMMC settings you used? I'm sure there is something simple I am overlooking as a new CubeMX user. I'm mostly a hardware guy and only recently moved up from the bare bones SdtPeriph class libraries.
will
2018-10-27 07:52 AM
One can certainly do a much better job with a PCB design. The trace lengths on some of ST's EVAL boards are longer than I'd like. @Community member is working on some socket dongles for the NUCLEO-144 series that plug in compactly on the back-side. @Community member made a eMMC dongle when we were working on that.
Keeping trace lengths short and equal is desirable. For short runs, 27 or 33R series resistors should be used to stop ringing (backing off slew rate also helps), and 33 or 47K pull-up at the socket for the data and command lines.
In retrospect I should have used the shorter schmartboard wires for the SDMMC rather than the SPI, but it photographs well, works well, and can be handed around a conference table without getting broken, or in a car ride to/from home in a box. I've used wire-wrap a lot in the past, and that is more reliable than the dupont wires people use for bread boarding.
https://schmartboard.com/wire-jumpers/
2018-10-27 08:49 AM
Clive:
The jumper set I have doesn't look as nice as those. Wire wrap has worked well for me and I stockpiled a lot a long time ago, so still using it! If I can use jumpers I do, but often the thing I'm trying to wire up doesn't have posts like the SD card connector, so wire wrapping one end and soldering the other works out nicely. The hardware guy in me says use series resistors for slew rate control, but probably should listen to the firmware guy and use built-in slew rate control of the micro! :)
Back to the original problem though, could you please share your CubeMX settings for FatFS and SDMMC? Are you using DMA mode and/or RTOS maybe? I'd really like to get DMA mode working.
will