TuGuHun 发表于 2012-5-16 22:35:33

LPC1788的USBHOST的FATFS移植问题

最近一直在移植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,文件已经给出,求高人解答!

energycf 发表于 2012-12-26 16:29:40

我也在弄这个问题,可以交流下哦 。
现在我遇到的问题时,枚举和初始化都通过了,但是FATFS中执行MS_BulkRecv(sector, 1, buff)(其中sector=0)时,也是无法读出正确的数据。
现在解决了么? {:smile:}

advarx21ic 发表于 2013-3-26 15:58:30

遇到和楼主一样的问题,不知道楼主解决了没呢?

electrlife 发表于 2013-5-24 20:05:16

遇到了同样的问题!!{:cry:}

electrlife 发表于 2013-5-29 21:22:37

同样的问题,用了LPC1788的USB2,也是FATFS读Sector 0 读出的全是0,怎么回事,
刚开始学习USB!{:biggrin:} 不知为什么枚举也成功!

jjj 发表于 2013-7-3 08:57:58

我也遇到这样的情况,有人解决了吗?

jjj 发表于 2013-7-3 12:17:17

我来解答吧,费了我一上午时间,
关键就是这MS_BulkRecv(0, 1, FATBuffer),第三个参数FATBuffer必须在设备RAM中,而FATFS中DISKIO中,DISKread函数不一定

amwox 发表于 2013-7-5 09:20:50

把缓冲定位在设备SRAM中
KEIL平台下:在LINK的SCT文件中加入
RW_SRAM1 0x20000000 0x00004000 {
        *(usbram)
}
IO_CACHE文件中
USB_INT08U CacheBuffer__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;        /* Disk access window for Directory, FAT (and Data on tiny cfg) */
} FATFS;
声明的变量定位在usbram中

mdcao 发表于 2013-7-5 19:07:39

马上要用到,先马克

xjwbh 发表于 2013-7-19 18:03:35

mark,mark,mark,mark,mark,mark,

xjwbh 发表于 2013-8-3 07:12:21

INT32MS_BulkRecv (          UINT32   block_number,
                                 UINT16   num_blocks,
                         volatileUINT8*user_buffer)
{
    INT32rc;
    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);//这里会死在voidHost_WDHWait (void)这个里头
            if (rc == OK){
                if (TDBuffer != 0) {
                  rc = ERR_MS_CMD_FAILED;
                }
            }
      }
    }
    return (rc);
}
///////////////////////////
搞了好长时间都不知道是怎么回事,枚举或者MS_Init(&blkSize,&numBlks,inquiryResult);这些都是对的,但为什么会死在这里呢,
按8楼的兄弟那样式了,还是不行,
谢谢各位了

keinYe 发表于 2013-8-5 16:32:18

楼主有没有做 USB dev的MSC啊?

xiefy21 发表于 2013-8-11 21:52:26

mark....
顶一个....{:lol:}

ztZJL2010 发表于 2013-9-13 09:54:52

正在研究LPC1788 USB标记下

hdmsfhfg 发表于 2014-7-11 12:51:50

好东西,MARK

yaxiaoyu 发表于 2015-1-11 22:51:06

准备用LPC1788 USB标记下

孩儿他爸 发表于 2015-3-12 08:04:56

收藏 可能会有帮助

风轻云淡 发表于 2015-3-27 13:35:39

11楼的问题 有兄弟能整不,小弟也遇到此问题

风轻云淡 发表于 2015-3-27 14:24:35

xjwbh 发表于 2013-8-3 07:12
INT32MS_BulkRecv (          UINT32   block_number,
                                 UINT16   nu ...

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

爺@龙行天下 发表于 2015-8-5 10:54:15

楼主,你的问题解决了吗

wiisir 发表于 2015-8-13 10:18:11

LPC1788的勘误表上有下面的说明,跟这有关系吗?
页: [1]
查看完整版本: LPC1788的USBHOST的FATFS移植问题