cancel
Showing results for 
Search instead for 
Did you mean: 

FATFS STM32F4-Discovery

lucas23
Associate II
Posted on April 08, 2015 at 15:40

Hi,

I am trying to do a memory stick reading in the STM32F4-Discovery board.

In order to test it, I am running the application example located in the following path:

STM32Cube\Repository\STM32Cube_FW_F4_V1.5.0\Projects\STM32F4-Discovery\Applications\FatFs\FatFs_USBDisk

My problem is that I am getting the following error when I try to open a file: (File: ff.c Function: find_volume())

/* Find an FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */

bsect = 0;

fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */

if (fmt == 1 || (!fmt && (LD2PT(vol)))) { /* Not an FAT boot sector or forced partition number */

UINT i;

DWORD br[4];

for (i = 0; i < 4; i++) { /* Get partition offset */

BYTE *pt = fs->win.d8+MBR_Table + i * SZ_PTE;

br[i] = pt[4] ? LD_DWORD(&pt[8]) : 0;

}

i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */

if (i) i--;

do { /* Find an FAT volume */

bsect = br[i];

fmt = bsect ? check_fs(fs, bsect) : 2; /* Check the partition */

} while (!LD2PT(vol) && fmt && ++i < 4);

}

if (fmt == 3) return FR_DISK_ERR; /* An error occured in the disk I/O

layer */

if (fmt) return FR_NO_FILESYSTEM; /* No FAT volume is found */

I tried to format my memory stick, but it still is not working.

What ''

FR_DISK_ERR /* An error occured in the disk I/O

'' means?

Do you have any clues?

Thanks in advance!

 

#i-have-a-clue
3 REPLIES 3
Posted on April 08, 2015 at 16:03

What ''FR_DISK_ERR /* An error occured in the disk I/O'' means? Do you have any clues?

 

That the read command sent to the USB stick via check_fs(fs, bsect); failed. Go look at the abstraction layer in diskio.c, instrument it if needed, and see what read command were sent and if they succeeded. Signs point to they didn't.

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
lucas23
Associate II
Posted on April 08, 2015 at 19:14

I went deeper in the code trying to find where the error is being generated and I reached the following:

DRESULT USBH_read(BYTE *buff, DWORD sector, UINT count)

{

  DRESULT res = RES_ERROR;

  MSC_LUNTypeDef info;

  USBH_StatusTypeDef  status = USBH_OK;

  DWORD scratch [_MAX_SS / 4];

  

  if ((DWORD)buff & 3) /* DMA Alignment issue, do single up to aligned buffer */

  {

    while ((count--)&&(status == USBH_OK))

    {

      status = USBH_MSC_Read(&HOST_HANDLE, 0, sector + count, (uint8_t *)scratch, 1);

      if(status == USBH_OK)

      {

        memcpy (&buff[count * _MAX_SS] ,scratch, _MAX_SS);

      }

      else

      {

        break;

      }

    }

  }

  else

  {

    status = USBH_MSC_Read(&HOST_HANDLE, 0, sector, buff, count);

  }

  

  if(status == USBH_OK)

  {

    res = RES_OK;

  }

  else

  {

    USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info); 

    

    switch (info.sense.asc)

    {

    case SCSI_ASC_LOGICAL_UNIT_NOT_READY:

    case SCSI_ASC_MEDIUM_NOT_PRESENT:

    case SCSI_ASC_NOT_READY_TO_READY_CHANGE: 

      USBH_ErrLog (''USB Disk is not ready!'');  

      res = RES_NOTRDY;

      break; 

      

    default:

     

res = RES_ERROR;

      break;

    }

  }

  

  return res;

}

If you look a little deeper, in the function called to obtain the error source  (USBH_MSC_GetLUNInfo());

USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info)

{

  MSC_HandleTypeDef *MSC_Handle =  (MSC_HandleTypeDef *) phost->pActiveClass->pData;    

  if(phost->gState == HOST_CLASS)

  {

    USBH_memcpy(info,&MSC_Handle->unit[lun], sizeof(MSC_LUNTypeDef));

    return USBH_OK;

  }

  else

  {

   

return USBH_FAIL;

  }

}

Anyone knows something which may help me?

Thanks in advance!

lucas23
Associate II
Posted on April 08, 2015 at 20:39

In fact, the variable used in the switch have the value 0x00, which is:

#define SCSI_ASC_NO_ADDITIONAL_SENSE_INFORMATION         0x00

#define SCSI_ASC_LOGICAL_UNIT_NOT_READY                  0x04

#define SCSI_ASC_INVALID_FIELD_IN_CDB                    0x24

#define SCSI_ASC_WRITE_PROTECTED                         0x27

#define SCSI_ASC_FORMAT_ERROR                            0x31

#define SCSI_ASC_INVALID_COMMAND_OPERATION_CODE          0x20

#define SCSI_ASC_NOT_READY_TO_READY_CHANGE               0x28

#define SCSI_ASC_MEDIUM_NOT_PRESENT                      0x3A

0690X00000603K8QAI.jpg