cancel
Showing results for 
Search instead for 
Did you mean: 

Without FATFS lib using for memory card read

NandhakumarGanesan
Associate II

Hi,

I am try to read memory card hex file data to use STM cube IDE FATES library.

but FATES library take nearly 20 KB of memory. so if any other way is there means recommend to me.

controller : STM32F103 

IDE : STM32 Cube IDE.

thank you.

3 REPLIES 3
vbesson
Senior

on a STM32F103, you can use FATFS and it is not taking some much of memory (RAM), 

I recommend to update chan fates to 0.15 to be able to manage long filename (instead of 0.11). 

As well if your application is time critical  you should use your own SPI function to avoid Hal overhead.

I hope it helps

 

thanks  for your response,

 Kindly giver a sample code for use Memory card SPI read method.

vbesson
Senior

Please Have a look at this one this is working 

https://01001000.xyz/2020-08-09-Tutorial-STM32CubeIDE-SD-card/

Regarding Baremetal SPI for SDCard on time critical I use this 

 

__attribute__((optimize("-Ofast"))) static bool SD_RxDataBlockFast(BYTE *buff, UINT len){
  uint8_t token;
  Timer1 = 200;
  SPI_HandleTypeDef *hspi=&hspi2;
  uint32_t txallowed = 1U;
  
  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
  {
    /* Enable SPI peripheral */
    __HAL_SPI_ENABLE(hspi);
  }
  

 do{
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (txallowed == 1U)){
        *(__IO uint8_t *)&hspi->Instance->DR = 0xFF;
        txallowed = 0U;
      }

      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)){
         token= hspi->Instance->DR;
      
        txallowed = 1U;
      }

	  }while((token == 0xFF) && Timer1);

 
  if(token != 0xFE) return FALSE;
 
  do{
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (txallowed == 1U)){
        *(__IO uint8_t *)&hspi->Instance->DR = 0xFF;
        txallowed = 0U;
      }

      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)){
        *buff= hspi->Instance->DR;
        buff++;
        len--;
        txallowed = 1U;
      }

	  }while(len);

  

  /* Clear overrun flag in 2 Lines communication mode because received is not read */
  if (hspi->Init.Direction == SPI_DIRECTION_2LINES)
  {
    __HAL_SPI_CLEAR_OVRFLAG(hspi);
  }

  
  hspi->State = HAL_SPI_STATE_READY;



    /* discard CRC */

    SPI_RxByte();
    SPI_RxByte();
    

  return TRUE;
}