OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5077|回复: 3

h750的u盘实验例程插上u盘能显示设备连接成功,但U盘存储空间获取失败是何原因?

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-6-21
在线时间
3 小时
发表于 2020-10-15 23:07:46 | 显示全部楼层 |阅读模式
1金钱
是不是u盘分区格式有要求?
res=exf_getfree("3:",&total,&free);   这个函数反回的是3
函数返回值:0,正常.其他,错误代码, 但是这个不知道错在哪里了。
另外我只有买了h750核心板,用的otg转接线插的u盘,电源手工焊了两条线上去的。 不知道会不会和这个有关?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-10-28
在线时间
35 小时
发表于 2023-7-8 19:51:06 | 显示全部楼层
例程有问题,我也遇到了,教程里写的“然后,我们将这 5 个函数在 diskio.c 里面和 FATFS 完成对接”就没有做完,自己把diskio.c完善了就可以了
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-10-28
在线时间
35 小时
发表于 2023-7-8 19:52:59 | 显示全部楼层
#define SD_CARD                 0                          //SD卡,卷标为0
#define EX_FLASH         1                        //外部spi flash,卷标为1
#define EX_NAND          2                        //外部nand flash,卷标为2
#define USB_DISK        3                        //U盘,卷标为3

//对于W25Q256
//前25M字节给fatfs用,25M字节后,用于存放字库,字库占用6.01M.        剩余部分,给客户自己用         
#define SPI_FLASH_SECTOR_SIZE         512       
#define SPI_FLASH_SECTOR_COUNT         1024*25*2        //W25Q256,前25M字节给FATFS占用       
#define SPI_FLASH_BLOCK_SIZE           8                     //每个BLOCK有8个扇区               
  
  
  
//获得磁盘状态
DSTATUS disk_status (
        BYTE pdrv                                /* Physical drive nmuber to identify the drive */
)
{
        return RES_OK;
}  


//初始化磁盘
DSTATUS disk_initialize (
        BYTE pdrv                                /* Physical drive nmuber to identify the drive */
)
{
        u8 res=0;            
        switch(pdrv)
        {
                case SD_CARD:                //SD卡
                        res=SD_Init();        //SD卡初始化
                          break;
                case EX_FLASH:                //外部flash
                        W25QXX_Init();  //W25QXX初始化
                        break;
                case EX_NAND:                //外部NAND
                        res=FTL_Init();        //NAND初始化
                        break;
                case USB_DISK:                /* U盘 */
      res = USBH_initialize();  /* U盘初始化 */
                        break;
                default:
                        res=1;
        }                 
        if(res)
                return  STA_NOINIT;
        else
                return 0; //初始化成功
}
//读扇区
//pdrv:磁盘编号0~9
//*buff:数据接收缓冲首地址
//sector:扇区地址
//count:需要读取的扇区数
DRESULT disk_read (
        BYTE pdrv,                /* Physical drive nmuber to identify the drive */
        BYTE *buff,                /* Data buffer to store read data */
        DWORD sector,        /* Sector address in LBA */
        UINT count                /* Number of sectors to read */
)
{
        u8 res=0;
    if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
        switch(pdrv)
        {
                case SD_CARD://SD卡
                        res=SD_ReadDisk(buff,sector,count);         
                        while(res)//读出错
                        {
                                SD_Init();        //重新初始化SD卡
                                res=SD_ReadDisk(buff,sector,count);       
                                //printf("sd rd error:%d\r\n",res);
                        }
                        break;
                case EX_FLASH://外部flash
                        for(;count>0;count--)
                        {
                                W25QXX_Read(buff,sector*SPI_FLASH_SECTOR_SIZE,SPI_FLASH_SECTOR_SIZE);
                                sector++;
                                buff+=SPI_FLASH_SECTOR_SIZE;
                        }
                        res=0;
                        break;
                case EX_NAND:                //外部NAND
                        res=FTL_ReadSectors(buff,sector,512,count);        //读取数据                       
                        break;
                case USB_DISK:  /* U盘 */
                        res = USBH_read(buff, sector, count);
                        break;
                default:
                        res=1;
        }
   //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res==0x00)
                        return RES_OK;         
    else
                        return RES_ERROR;          
}
//写扇区
//pdrv:磁盘编号0~9
//*buff:发送数据首地址
//sector:扇区地址
//count:需要写入的扇区数
DRESULT disk_write (
        BYTE pdrv,                        /* Physical drive nmuber to identify the drive */
        const BYTE *buff,        /* Data to be written */
        DWORD sector,                /* Sector address in LBA */
        UINT count                        /* Number of sectors to write */
)
{
        u8 res=0;  
    if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
        switch(pdrv)
        {
                case SD_CARD://SD卡
                        res=SD_WriteDisk((u8*)buff,sector,count);
                        while(res)//写出错
                        {
                                SD_Init();        //重新初始化SD卡
                                res=SD_WriteDisk((u8*)buff,sector,count);       
                                //printf("sd wr error:%d\r\n",res);
                        }
                        break;
                case EX_FLASH://外部flash
                        for(;count>0;count--)
                        {                                                                                    
                                W25QXX_Write((u8*)buff,sector*SPI_FLASH_SECTOR_SIZE,SPI_FLASH_SECTOR_SIZE);
                                sector++;
                                buff+=SPI_FLASH_SECTOR_SIZE;
                        }
                        res=0;
                        break;
                case EX_NAND:                //外部NAND
                        res=FTL_WriteSectors((u8*)buff,sector,512,count);//写入数据
                        break;
                case USB_DISK:      /* U盘 */
      res = USBH_write(buff, sector, count);
      break;
                default:
                        res=1;
        }
    //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res == 0x00)return RES_OK;         
    else return RES_ERROR;       
}
//其他表参数的获得
//pdrv:磁盘编号0~9
//ctrl:控制代码
//*buff:发送/接收缓冲区指针
DRESULT disk_ioctl (
        BYTE pdrv,                /* Physical drive nmuber (0..) */
        BYTE cmd,                /* Control code */
        void *buff                /* Buffer to send/receive control data */
)
{
DRESULT res;                                                                               
        if(pdrv==SD_CARD)//SD卡
        {
            switch(cmd)
            {
                    case CTRL_SYNC:
                                res = RES_OK;
                        break;         
                    case GET_SECTOR_SIZE:
                                *(DWORD*)buff = 512;
                        res = RES_OK;
                        break;         
                    case GET_BLOCK_SIZE:
                                *(WORD*)buff = SDCardInfo.CardBlockSize;
                        res = RES_OK;
                        break;         
                    case GET_SECTOR_COUNT:
                        *(DWORD*)buff = SDCardInfo.CardCapacity/512;
                        res = RES_OK;
                        break;
                    default:
                        res = RES_PARERR;
                        break;
            }
        }else if(pdrv==EX_FLASH)        //外部FLASH  
        {
            switch(cmd)
            {
                    case CTRL_SYNC:
                                res = RES_OK;
                        break;         
                    case GET_SECTOR_SIZE:
                        *(WORD*)buff = SPI_FLASH_SECTOR_SIZE;
                        res = RES_OK;
                        break;         
                    case GET_BLOCK_SIZE:
                        *(WORD*)buff = SPI_FLASH_BLOCK_SIZE;
                        res = RES_OK;
                        break;         
                    case GET_SECTOR_COUNT:
                        *(DWORD*)buff = SPI_FLASH_SECTOR_COUNT;
                        res = RES_OK;
                        break;
                    default:
                        res = RES_PARERR;
                        break;
            }
        }else if(pdrv==EX_NAND)        //外部NAND FLASH
        {
            switch(cmd)
            {
                    case CTRL_SYNC:
                                res = RES_OK;
                        break;         
                    case GET_SECTOR_SIZE:
                        *(WORD*)buff = 512;        //NAND FLASH扇区强制为512字节大小
                        res = RES_OK;
                        break;         
                    case GET_BLOCK_SIZE:
                        *(WORD*)buff = nand_dev.page_mainsize/512;//block大小,定义成一个page的大小
                        res = RES_OK;
                        break;         
                    case GET_SECTOR_COUNT:
                        *(DWORD*)buff = nand_dev.valid_blocknum*nand_dev.block_pagenum*nand_dev.page_mainsize/512;//NAND FLASH的总扇区大小
                        res = RES_OK;
                        break;
                    default:
                        res = RES_PARERR;
                        break;
            }
        }
        else if (pdrv == USB_DISK)  /* U盘 */
    {
        res = USBH_ioctl(cmd, buff);
    }
        else res=RES_ERROR;//其他的不支持
    return res;
}
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-10-28
在线时间
35 小时
发表于 2023-7-8 19:55:17 | 显示全部楼层
照这个来,就可以了。正点原子,检查一下例程的源码,有没写完的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 06:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表