问题描述: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);
}
}
|