cancel
Showing results for 
Search instead for 
Did you mean: 

Facing Issue in using USB_OTG_FS -- Device and SD_card -- FatFS simultaneously

Embedded_Engineer
Associate II

Integrating USB Functionality and Data Logging with STM32F407VG:

Hello forum members,

I am currently working on a project that involves integrating USB functionality for data transfer and data logging on an STM32F407VG micro-controller. Specifically, I want to log data files on an SD card and enable the user to download these logged files from the SD card via USB. Additionally, I'd like to allow users to copy files from their PC to the SD card via USB, all through the STM32F407VG using the SDIO communication protocol.

I'm facing a challenge in making the USB_OTG_FS (On-The-Go Full Speed USB) and the SD card (using FatFS) work together seamlessly. I would greatly appreciate your guidance and any insights you might have on how to achieve this integration.

Here are some specific questions I have:

  1. How do I configure USB_OTG_FS as a USB Device in STM32CubeMX or other development tools?
  2. What are the essential initialization and setup steps for using the USB_OTG_FS as a USB Device alongside the FatFS library for SD card communication?
  3. Are there any sample code snippets or project examples that demonstrate this integration?
  4. What should I be mindful of when managing the data transfer between the USB and SD card to avoid conflicts or data corruption?

 

Here is my code:

#include "usbd_storage_if.h"

extern SD_HandleTypeDef hsd;

#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 0x10000
#define STORAGE_BLK_SIZ 0x200

const int8_t STORAGE_Inquirydata_FS[] = {

0x00,
0x80,
0x02,
0x02,
(STANDARD_INQUIRY_DATA_LEN - 5),
0x00,
0x00,
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'0', '.', '0' ,'1' /* Version : 4 Bytes */
};


static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);

 

USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
STORAGE_Init_FS,
STORAGE_GetCapacity_FS,
STORAGE_IsReady_FS,
STORAGE_IsWriteProtected_FS,
STORAGE_Read_FS,
STORAGE_Write_FS,
STORAGE_GetMaxLun_FS,
(int8_t *)STORAGE_Inquirydata_FS
};

int8_t STORAGE_Init_FS(uint8_t lun)
{

return (USBD_OK);

}


int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{

HAL_SD_CardInfoTypeDef info;
int8_t ret = -1;

HAL_SD_GetCardInfo(&hsd, &info);

*block_num = info.LogBlockNbr - 1;
*block_size = info.LogBlockSize;
ret = 0;
return ret;


}


int8_t STORAGE_IsReady_FS(uint8_t lun)
{

return (USBD_OK);

}

int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{

return (USBD_OK);

}


int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{

int8_t ret = -1;

HAL_SD_ReadBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY);

/* Wait until SD card is ready to use for new operation */
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){}
ret = 0;
return ret;

}

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{

int8_t ret = -1;

HAL_SD_WriteBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY);

while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){}
ret = 0;
return ret;

}

int8_t STORAGE_GetMaxLun_FS(void)
{

return (STORAGE_LUN_NBR - 1);

}

 



4 REPLIES 4
shads
Associate

I think that when connecting a USB, in the usbd_storage_if.c file in the STORAGE_Init_FS() function you need to stop the internal work of FATFS and unmount the partition... and after disconnecting the USB, re-initiate the work of FATFS

Pavel A.
Evangelist III

Can you change this requirement in the following way?

- STM32 logs the data on a SD card

- Then user ejects the card and reads the data on their PC, using a USB reader or whatever ?

Looks much simpler.

@Pavel A. 
"Thank you for your suggestion! I've considered the option of logging data on an SD card, but I'm currently working on implementing USB functionality in my project. This shift is necessary as we plan to use EMMC, and removing the USB functionality is not feasible for our requirements.

I've explored an alternative approach using UART to transmit data, with the intention of receiving it through a UART to TTL converter. My plan is to create a GUI to handle the data, making it more user-friendly. However, I've encountered some challenges with the data transfer rate, which is currently slower than desired.

If you have any suggestions or alternative solutions, I would greatly appreciate your input. Additionally, I've been working on optimizing the UART code to improve the data transfer rate. I would be happy to share it with you for feedback.

Thank you for your understanding and assistance!"

"Thank you for your suggestion! @shads 

I appreciate your insight into the USB functionality. I will definitely look into the usbd_storage_if.c file and consider implementing the suggested changes in the STORAGE_Init_FS() function. Stopping the internal work of FATFS and unmounting the partition during USB connection, then re-initiating the work of FATFS after disconnecting the USB, seems like a logical step to ensure smooth operation.

I'll incorporate these adjustments into my code and test the impact on the overall functionality. If you have any more specific details or considerations I should keep in mind while making these changes.