cancel
Showing results for 
Search instead for 
Did you mean: 

SDIO and SD fat access example?

natblist
Associate
Posted on February 09, 2012 at 01:06

Hi Chaps,

Going slowly mad trying to get Chan Fat working with the sdio libs on a stm32f4.

I'm using the most recent (1.0.0) library for the F4, and the low level access demo within that library builds and (at least appears to ) work OK. 

I've spent many, many hours attempting to patch in 0.9 version of fatfs from chan (thks chan, you're a hero) - but I can't get it to work.

If possible, I'd really really appreciate a demo project/source (or direction to - though I've scoured the web and can't find anything that works!)

I'll post separately about the current problems I'm having with the my current build, but a working example would sort it.

Many thanks,

nat.

#hse-sdio-stm32 #stm32-fat-chanfat-fatfs-sdio #sdcard-stm32f4-sdio-fatfs #sdcard-stm32f4-sdio-fatfs
84 REPLIES 84
Posted on August 21, 2013 at 14:22

Any idea ...? I have heard about a fixed version of ReadMultiBlocks but i'm not sure that the problem is here, what do you think ? Anyway, i will try to find it and test it.

I implemented, and posted, a version that supports SD, SDHC and cards >2GB, you might want to start there.

The ST versions use linear byte addresses, not block addresses, this is important for large cards, and SD cards use a different mechanism than MMC for blocking.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
julien23
Associate II
Posted on August 21, 2013 at 14:50

That's what i've done and - good news - it is finally functionnal. I am not sure of what i could have done wrong but finally, it's ok.

[EDIT] As i had mixed some of your code with some ST code, problems due to the way the cards are adressed may have happened.

Again, thanks for your help.

Julien
hitsumen
Associate II
Posted on November 17, 2013 at 10:25

Hi 

clive1,

 

Thank you for sharing your code and lot of information about SDIO.

I have tried to use the example from ST, but have some problems with my STM32F4DISCOVERY board:

STM32F4xx_SDIO_Example

so from terminal i have this: 

 Debug Module Init 

Open a test file (message.txt) 

not exist the test file (message.txt)

Create a new file (hello.txt)

Create a new file error

rc=1 FR_DISK_ERR

I have checked the pins are correct, I formatted my sd card with fat32 and copied message.txt to micro sd card. This error occurs with both, microsd 8gb sdhc 4 class card and, microsd 2gb card.

I tried your example then i have this:

ÿFatFs Testing

res = 1 f_open MESSAGE.TXT

res = 1 f_open DIR.TXT

Maybe problem is with my microsd card module, I have checked they use the 10k resistors instead of 30k-50k resistors for data, clock and other signals?

Thank you,

//Nikolaj

hitsumen
Associate II
Posted on November 18, 2013 at 19:07

clive1

Finally I found the mistake, my cards do not want to work with 4 bit mode.. In 1 bit SDIO works fine.

And the speed in 1 bit mode is 50kB/s.. So slow..

Can you suggest me something about 4 bit mode and slow speed? Maybe it is resistors?

Thank you.

Posted on November 18, 2013 at 22:35

Not sure, my wires were very short and of even length. I guess I would double check the pin assignments. 10K should likely work, though my example was weaker 33K on the wire-wrapped example, and 47K on the production board. I'd have to double check what was used on the STM32F4DIS-BB board, I suspect 47K.

When it initial brings up the card in 1-bit, it uses a clock of 400 KHz, and later switches to 24 MHz and 4-bit. You might want to check if you can select the higher speed, or if in fact you have.

The cards you mention should support 4-bit mode, so double check length, continuity, etc.
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
hitsumen
Associate II
Posted on November 20, 2013 at 11:50

Hi clive1,

I checked my wires million times I use 20cm wires, changed them to different ones, etc.. Nothing helped..

I will try to change them to something like 5cm wires, then I will try to resolder resistors to 47k, maybe that will help.

What speed you have in 1 bit mode? If I would have something like 500kb/s that would be enough for my task.

Thank you,

//Nikolaj

Posted on November 20, 2013 at 13:51

20 CM seems rather excessive, my signal wires were closer to 30 MM

Suggest you scope the clock pin, look at SDIO_TRANSFER_CLK_DIV, used in SD_Init(), presumably you left that, and deprecated the call to SD_EnableWideBusOperation(SDIO_BusWide_4b)
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
hitsumen
Associate II
Posted on November 20, 2013 at 14:30

clive1,

 

These settings does not impact the speed..

#define SDIO_INIT_CLK_DIV                ((uint8_t)0x76)

#define SDIO_TRANSFER_CLK_DIV            ((uint8_t)0x1)

I have tried to change them to 0 or to 0x76, speed is the same, even if i change this in SD_Init() and SD_PowerON():

SDIO_InitStructure.SDIO_ClockDiv = 0x00;

Only if I will change this to 4bit microSD card does not work...

SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_4b;

Can you please measure the card speed in 1 bit mode..

Strange stuff happens, if I use the slower card it goes for 70kb/s

If I use SDHC 4class card it goes 50kb/s. 

Thank you,

//Nikolaj

Posted on November 20, 2013 at 15:34

Can you please measure the card speed in 1 bit mode..

It interferes with this morning's work flow, but

SDIO @ 24 MHz, 1-bit, 8GB, Class 4, SanDisk

168 MHz STM32F4-DISCO + STM32F4-DIS-BB

1000x 32KB blocks

CRC32 A704009B Memory Image

32768000 Bytes, 2062624245 Cycles

2.668942 MBps Write (FatFs)

CRC32 A704009B COUNTER.TXT

32768000 Bytes, 2067366939 Cycles

2.662819 MBps Write (FatFs)

CRC32 A704009B COUNTER.TXT

32768000 Bytes, 1909376469 Cycles

2.883153 MBps Read (FatFs)

32768000 Bytes, 1909409333 Cycles

2.883103 MBps Read (FatFs)

SDIO @ 24 MHz, 4-bit, 8GB, Class 4, SanDisk

168 MHz STM32F4-DISCO + STM32F4-DIS-BB

1000x 32KB blocks

CRC32 F155B8E6 Memory Image

32768000 Bytes, 1143695149 Cycles

4.813367 MBps Write (FatFs)

CRC32 F155B8E6 COUNTER.TXT

32768000 Bytes, 1148850865 Cycles

4.791766 MBps Write (FatFs)

CRC32 F155B8E6 COUNTER.TXT

32768000 Bytes, 533835224 Cycles

10.312216 MBps Read (FatFs)

32768000 Bytes, 533883893 Cycles

10.311276 MBps Read (FatFs)

If you can't post similar numbers you need to seriously assess your hardware configuration, ie don't use my numbers to validate your design.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
hitsumen
Associate II
Posted on November 20, 2013 at 15:53

Hmm, I use 512 byte blocks, like in the example:

f_write(&file, buff, 512, &bw);

So you write like this:

f_write(&file, buff, 32768, &bw);

//SDIO_CK = SDIOCLK / (SDIO_TRANSFER_CLK_DIV + 2), so

SDIO_InitStructure.SDIO_ClockDiv = 0x05;

Right?

//Nikolaj