问答

汇集网友智慧,解决技术难题

21ic问答首页 - 华大HC32F4A0的USB驱动移植+FATFS文件系统

USB MUC 嵌入式 技术交流 国产芯片

华大HC32F4A0的USB驱动移植+FATFS文件系统

问题描述:USB功能简单的usb_host_msc功能,硬件是用高速的USB硬件接口,对速率无要求当时硬件设计的时候用到了这个口而已,目前U盘插入可以检测,但是移植文件系统后,能挂载失败,后面的都失败,可能是什么原因?或者谁有华大HC32F4A0的这块驱动,可以提供参考一下嘛。/* 为每个设备定义一个物理编号 */
//#define ATA                            0     // 预留SD卡使用
#define USB_DISK                 1        //U盘,卷标为1
extern volatile DSTATUS Stat;  /* Disk status */
/*-----------------------------------------------------------------------*/
/* 获取设备状态                                                          */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
        BYTE pdrv                /* 物理编号 */
)
{

        DSTATUS status = STA_NOINIT;//Stat
        switch (pdrv) {
                case ATA:        /* SD CARD */
                        break;

                case USB_DISK:        /* USB_DISK */
                        break;
                default:
                        status = STA_NOINIT;
        }
        return status ;
}

/*-----------------------------------------------------------------------*/
/* 设备初始化                                                            */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
        BYTE pdrv                                /* 物理编号 */
)
{
  uint16_t i;
        DSTATUS status = STA_NOINIT;       
        switch (pdrv) {
                case ATA:                 /* SD CARD */
                        break;

                case USB_DISK:                 /* USB设备 */
                        if(USBH_UDISK_Status(pdrv)){
                                return 0;
                        }else{
                                return 1;
                        }
                       
                default:
                        status = STA_NOINIT;
        }
        return status;
}


/*-----------------------------------------------------------------------*/
/* 读扇区:读取扇区内容到指定存储区                                              */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
        BYTE pdrv,                /* 设备物理编号(0..) */
        BYTE *buff,                /* 数据缓存区 */
        DWORD sector,        /* 扇区首地址 */
        UINT count                /* 扇区个数(1..128) */
)
{
        DRESULT status = RES_PARERR;
        switch (pdrv) {
                case ATA:        /* SD CARD */
                        break;
                   
                case USB_DISK:        /* USB设备 */
                        status = USBH_UDISK_Read(pdrv,buff,sector,count);
                        break;
                default:
                        status = RES_PARERR;
        }
    if(status == 0x00)return RES_OK;
    else return RES_ERROR;
}

/*-----------------------------------------------------------------------*/
/* 写扇区:见数据写入指定扇区空间上                                      */
/*-----------------------------------------------------------------------*/
#if _USE_WRITE
DRESULT disk_write (
        BYTE pdrv,                          /* 设备物理编号(0..) */
        const BYTE *buff,        /* 欲写入数据的缓存区 */
        DWORD sector,                  /* 扇区首地址 */
        UINT count                          /* 扇区个数(1..128) */
)
{
  uint32_t write_addr;
        DRESULT status = RES_PARERR;
        //if (!count) {
        //        return RES_PARERR;                /* Check parameter */
        //}
        switch (pdrv) {
                case ATA:        /* SD CARD */      
                break;
               
                case USB_DISK:        /* USB设备 */
                        status = USBH_UDISK_Write(pdrv,buff,sector,count);
                        break;
               
                default:
                        status = RES_PARERR;
        }
    if(status == 0x00)return RES_OK;
    else return RES_ERROR;
}
#endif


/*-----------------------------------------------------------------------*/
/* 其他控制                                                              */
/*-----------------------------------------------------------------------*/

#if _USE_IOCTL
DRESULT disk_ioctl (
        BYTE pdrv,                /* 物理编号 */
        BYTE cmd,                  /* 控制指令 */
        void *buff                /* 写入或者读取数据地址指针 */
)
{
        DRESULT status = RES_PARERR;
        switch (pdrv) {
                case ATA:        /* SD CARD */
                        break;

                case USB_DISK:        /* USB设备 */
                        switch (cmd) {
                                case CTRL_SYNC :                /* Make sure that no pending write process */
                                        status = RES_OK;
                                        break;
                                case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */
                                        *(DWORD *)buff = (DWORD) USB_HOST_MSC_Param.MSC_Capacity;
                                        status = RES_OK;
                                        break;
                                case GET_SECTOR_SIZE :        /* Get R/W sector size (WORD) */
                                        *(WORD *)buff = 512U;
                                        status = RES_OK;
                                        break;
                                case GET_BLOCK_SIZE :        /* Get erase block size in unit of sector (DWORD) */
                                        *(DWORD *)buff = 512UL;
                                        break;
                                default:
                                        status = RES_PARERR;
                                        break;
                        }
                        break;
               
                default:
                        status = RES_PARERR;
        }
        return status;
}
#endif


应用层这边就是:
void USB_Mount(void)
{
    FRESULT ret = FR_OK;
    ret = f_mount(&fs[1], "1:", 1u);
        if(ret == 0)
   {
        printf("U盘挂载文件系统【成功】...[%d]\r\n",ret);
        USB_STATE = 2;
    }else{
        printf("U盘挂载文件系统【失败】...[%d]\r\n",ret);
    }
}






回答 +关注 5
801人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册