Skip to main content
nakulrao
Associate III
December 26, 2012
Question

FAT in SD Card

  • December 26, 2012
  • 10 replies
  • 2007 views
Posted on December 26, 2012 at 06:36

Hi

This question is meant specifically for Clive1. 

Your earlier post on FAT at https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%

2fcortex_mx_stm32%2fST32f4discovery%2bsdcard%2bfatfs%20problem&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=2587

This has been very helpful to me and I have modified the code to suit for STM3240G eval board. But the code gets stuck in an infinite loop in the sdio_sd.c file at line 2731.

I do not seem to understand what the problem is. 

I would apprecite your advice regarding this.

Thanks in advance.

#think! #think!
    This topic has been closed for replies.

    10 replies

    Andrew Neil
    Super User
    December 26, 2012
    Posted on December 26, 2012 at 12:05

    ''But the code gets stuck in an infinite loop in the sdio_sd.c file at line 2731''

    Why don't you post the section of code - so that we can see?

    ''I do not seem to understand what the problem is''

    Think about what the code is waiting for - How would it normally get out of that loop?

    When you know what it's waiting for, you can think about why that might not be happening - or might not be getting detected (properly)...

    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    Tesla DeLorean
    Guru
    December 26, 2012
    Posted on December 26, 2012 at 16:38

    There should be SD Card support code directly in the STM3240G-EVAL project codes.

    I built a ported version for the STM32F4-Discovery, which includes FatFs support.

    https://docs.google.com/open?id=0B7OY5pub_GfIcU1XTDFDRlptZDg

    Hang-ups are most likely due to interrupt handling issues with either SDIO or DMA
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    nakulrao
    nakulraoAuthor
    Associate III
    December 26, 2012
    Posted on December 26, 2012 at 16:42

    Thanks for the reply

    The code is stuck in a while loop waiting for a flag actually.

    while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))

      {

        if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)

        {

          *(tempscr + index) = SDIO_ReadData();

          index++;

        }

      }

    The 'if' condition is not entered.

    This is my first experience with fat and sd cards, and would really appreciate some help regarding this.

    nakulrao
    nakulraoAuthor
    Associate III
    December 26, 2012
    Posted on December 26, 2012 at 16:47

    Well, I have used your code as a guidance and modified it for the stm3240g. The examples have codes for sd card but it just writes hex values directly and I am trying to implement fat.

    while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))

      {

        if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)

        {

          *(tempscr + index) = SDIO_ReadData();

          index++;

        }

      }

    Actually, this while loop goes on infinitely and if condition is not satisfied.

    Andrew Neil
    Super User
    December 27, 2012
    Posted on December 27, 2012 at 10:57

    ''it just writes hex values directly and I am trying to implement fat''

     

    Obviously, if you can't do the basic thing of just writing ''raw'' hex values, then you have no chance with higher-level stuff like FAT!!

    ''if condition is not satisfied''

     

    So, again, think about what that tells you!

    What condition would be necessary to satisfy the condition? Why might that not be happening?

        
    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    nakulrao
    nakulraoAuthor
    Associate III
    December 27, 2012
    Posted on December 27, 2012 at 14:04

    I am trying to store images in the sd card. So, without fat, it works just fine for a single image. Now for storing multiple images, I started running into problems and I was adviced to implement fat instead. So that is what I meant by just hex and not fat 

    Tesla DeLorean
    Guru
    December 27, 2012
    Posted on December 27, 2012 at 19:26

    The EVAL board has an SD library, FatFs will need to to interface to it via the abstraction routines in diskio.c

    STM32F4xx_DSP_StdPeriph_Lib_V1.0.0\Utilities\STM32_EVAL\STM3240_41_G_EVAL\stm324xg_eval_sdio_sd.c

    The ST code doesn't handle SD cards quite as it should, the non-HC cards need to be told a block length, and the HC cards can be bigger than 4GB. These are thing I believe I addressed in my working port to the STM32F4-Discovery, and my F2/F4 custom board.

    I don't have an STM3240G-EVAL, else I might look at this myself.

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    nakulrao
    nakulraoAuthor
    Associate III
    December 28, 2012
    Posted on December 28, 2012 at 15:52

    I am using a 2Gb SD card. I would really apprecite if you could tell me why is it actually stuck in the loop. Also, it does not enter the if condition. I have a file named 'MESSAGE.TXT' in the SD card. So, it should work right?

    Also the data is not available in the receive FIFO. why is that? The sd card is not empty.

    Tesla DeLorean
    Guru
    December 28, 2012
    Posted on December 28, 2012 at 17:32

    I was using DMA mode, not POLLING.

    Suggest you get the original STM3240G-EVAL code running, and dig into the SD Card specification documentation. Not sure how the polling deals with the termination of a block read.
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    hfs99
    Associate II
    December 30, 2012
    Posted on December 30, 2012 at 19:40

    I wonder why the

    SDIO_FLAG_DTIMEOUT

    flag never gets set. Maybe the preceding code isn't setting the

    SDIO->DTIMOUT

    register?

    That won't be the root cause (of why

    SDIO_FLAG_RXDAVL

    is never set), but needs to be fixed.

    Of course, if you're mixing routines intended for DMA with setup intended for polling, or vice versa, you have a LOT of troubleshooting in store.