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,文件已经给出,求高人解答! 我也在弄这个问题,可以交流下哦 。现在我遇到的问题时,枚举和初始化都通过了,但是FATFS中执行MS_BulkRecv(sector, 1, buff)(其中sector=0)时,也是无法读出正确的数据。
现在解决了么? {:smile:} 遇到和楼主一样的问题,不知道楼主解决了没呢? 遇到了同样的问题!!{:cry:} 同样的问题,用了LPC1788的USB2,也是FATFS读Sector 0 读出的全是0,怎么回事,
刚开始学习USB!{:biggrin:} 不知为什么枚举也成功! 我也遇到这样的情况,有人解决了吗? 我来解答吧,费了我一上午时间,
关键就是这MS_BulkRecv(0, 1, FATBuffer),第三个参数FATBuffer必须在设备RAM中,而FATFS中DISKIO中,DISKread函数不一定 把缓冲定位在设备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中 马上要用到,先马克 mark,mark,mark,mark,mark,mark, 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楼的兄弟那样式了,还是不行,
谢谢各位了 楼主有没有做 USB dev的MSC啊? mark....
顶一个....{:lol:} 正在研究LPC1788 USB标记下 好东西,MARK 准备用LPC1788 USB标记下 收藏 可能会有帮助 11楼的问题 有兄弟能整不,小弟也遇到此问题 xjwbh 发表于 2013-8-3 07:12
INT32MS_BulkRecv ( UINT32 block_number,
UINT16 nu ...
请问楼上的兄弟解决了吗,小弟也遇到此问题
楼主,你的问题解决了吗 LPC1788的勘误表上有下面的说明,跟这有关系吗?
页:
[1]