搜索
bottom↓
回复: 20

LPC1788的USBHOST的FATFS移植问题

[复制链接]

出0入0汤圆

发表于 2012-5-16 22:35:33 | 显示全部楼层 |阅读模式
最近一直在移植LPC1788的USBHOST上的FATFS,但打开问题的函数f_open的返回值总是FR_NO_FILESYSTEM,板子能检测到U盘,而用官方的FAT16例程则能正常使用,因为usbhost_lpc17xx.c和usbhost_ms.c是从SK的板的FAT16例程移植过来的。后来检查调试,发现了一个问题,就是函数MS_BulkRecv,当在FAT16系统中的F_OPEN中执行MS_BulkRecv(0, 1, FATBuffer),返回的第一个sector的信息到FATBuffe是正常的,但在FATFS中执行MS_BulkRecv(sector, 1, buff)(其中sector=0)时,无法读出正确的数据,buff全为0,所以在文件系统中初始化时无法读出第一个sector的信息。用的USB2,文件已经给出,求高人解答!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-12-26 16:29:40 | 显示全部楼层
我也在弄这个问题,可以交流下哦 。
现在我遇到的问题时,枚举和初始化都通过了,但是FATFS中执行MS_BulkRecv(sector, 1, buff)(其中sector=0)时,也是无法读出正确的数据。
现在解决了么?

出0入0汤圆

发表于 2013-3-26 15:58:30 | 显示全部楼层
遇到和楼主一样的问题,不知道楼主解决了没呢?

出0入0汤圆

发表于 2013-5-24 20:05:16 | 显示全部楼层
遇到了同样的问题!!

出0入0汤圆

发表于 2013-5-29 21:22:37 | 显示全部楼层
同样的问题,用了LPC1788的USB2,也是FATFS读Sector 0 读出的全是0,怎么回事,
刚开始学习USB! 不知为什么枚举也成功!

出0入0汤圆

发表于 2013-7-3 08:57:58 | 显示全部楼层
我也遇到这样的情况,有人解决了吗?

出0入0汤圆

发表于 2013-7-3 12:17:17 | 显示全部楼层
我来解答吧,费了我一上午时间,
关键就是这MS_BulkRecv(0, 1, FATBuffer),第三个参数FATBuffer必须在设备RAM中,而FATFS中DISKIO中,DISKread函数不一定

出0入0汤圆

发表于 2013-7-5 09:20:50 | 显示全部楼层
把缓冲定位在设备SRAM中
KEIL平台下:在LINK的SCT文件中加入
  RW_SRAM1 0x20000000 0x00004000 {
        *(usbram)
  }
IO_CACHE文件中
USB_INT08U CacheBuffer[IO_CACHE_BLOCKS*IO_CACHE_BLOCK_SIZE]__attribute__((section("usbram")));
没有用CACHE文件就考虑将
typedef struct {
        BYTE        fs_type;                /* FAT sub-type (0:Not mounted) */
        BYTE        drv;                        /* Physical drive number */
        BYTE        csize;                        /* Sectors per cluster (1,2,4...128) */
        BYTE        n_fats;                        /* Number of FAT copies (1,2) */
        BYTE        wflag;                        /* win[] dirty flag (1:must be written back) */
        BYTE        fsi_flag;                /* fsinfo dirty flag (1:must be written back) */
        WORD        id;                                /* File system mount ID */
        WORD        n_rootdir;                /* Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
        WORD        ssize;                        /* Bytes per sector (512,1024,2048,4096) */
#endif
#if _FS_REENTRANT
        _SYNC_t        sobj;                        /* Identifier of sync object */
#endif
#if !_FS_READONLY
        DWORD        last_clust;                /* Last allocated cluster */
        DWORD        free_clust;                /* Number of free clusters */
        DWORD        fsi_sector;                /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
        DWORD        cdir;                        /* Current directory start cluster (0:root) */
#endif
        DWORD        n_fatent;                /* Number of FAT entries (= number of clusters + 2) */
        DWORD        fsize;                        /* Sectors per FAT */
        DWORD        fatbase;                /* FAT start sector */
        DWORD        dirbase;                /* Root directory start sector (FAT32:Cluster#) */
        DWORD        database;                /* Data start sector */
        DWORD        winsect;                /* Current sector appearing in the win[] */
        BYTE        win[_MAX_SS];        /* Disk access window for Directory, FAT (and Data on tiny cfg) */
} FATFS;
声明的变量定位在usbram中

出0入0汤圆

发表于 2013-7-5 19:07:39 来自手机 | 显示全部楼层
马上要用到,先马克

出0入0汤圆

发表于 2013-7-19 18:03:35 | 显示全部楼层
mark,mark,mark,mark,mark,mark,

出0入0汤圆

发表于 2013-8-3 07:12:21 | 显示全部楼层
INT32  MS_BulkRecv (          UINT32   block_number,
                                   UINT16   num_blocks,
                         volatile  UINT8  *user_buffer)
{
    INT32  rc;
    int i;
    volatile UINT8 *c = user_buffer;
    for (i=0;i<MS_BlkSize*num_blocks;i++)
            *c++ = 0;


    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_IN, SCSI_CMD_READ_10, 10);

    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE); //返回正确
    if (rc == OK) {
        rc = Host_ProcessTD(EDBulkIn, TD_IN, user_buffer, MS_BlkSize * num_blocks);  //返回偶尔正确(会返回0xffffffff)
        if (rc == OK) {
            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);//这里会死在void  Host_WDHWait (void)这个里头
            if (rc == OK){
                if (TDBuffer[12] != 0) {
                    rc = ERR_MS_CMD_FAILED;
                }
            }
        }
    }
    return (rc);
}
///////////////////////////
搞了好长时间都不知道是怎么回事,枚举或者MS_Init(&blkSize,&numBlks,inquiryResult);这些都是对的,但为什么会死在这里呢,
按8楼的兄弟那样式了,还是不行,
谢谢各位了

出0入0汤圆

发表于 2013-8-5 16:32:18 | 显示全部楼层
楼主有没有做 USB dev的MSC啊?

出0入0汤圆

发表于 2013-8-11 21:52:26 | 显示全部楼层
mark....
顶一个....

出0入0汤圆

发表于 2013-9-13 09:54:52 | 显示全部楼层
正在研究LPC1788 USB  标记下

出0入0汤圆

发表于 2014-7-11 12:51:50 | 显示全部楼层
好东西,MARK

出0入0汤圆

发表于 2015-1-11 22:51:06 | 显示全部楼层
准备用LPC1788 USB  标记下

出0入0汤圆

发表于 2015-3-12 08:04:56 | 显示全部楼层
收藏 可能会有帮助

出0入0汤圆

发表于 2015-3-27 13:35:39 | 显示全部楼层
11楼的问题 有兄弟能整不,小弟也遇到此问题

出0入0汤圆

发表于 2015-3-27 14:24:35 | 显示全部楼层
xjwbh 发表于 2013-8-3 07:12
INT32  MS_BulkRecv (          UINT32   block_number,
                                   UINT16   nu ...

请问楼上的兄弟解决了吗,小弟也遇到此问题

出0入0汤圆

发表于 2015-8-5 10:54:15 | 显示全部楼层
楼主,你的问题解决了吗

出0入0汤圆

发表于 2015-8-13 10:18:11 | 显示全部楼层
LPC1788的勘误表上有下面的说明,跟这有关系吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 16:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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