由于调用 U 盘读写文件级子程序库函数CH375FileOpen( )和CH375FileCreate( )失败,于是尝试直接进行物理扇区读写操作,其间遇到以下问题,还请高人指点: 1、使用爱国者“迷你王”64M 优盘:无法执行 mReadSector( 0,1 ) 子程序;可以完成 mWriteSector( 600,1 ) 子程序,但用 WinHex 查看发现,实际并没有将数据写进指定扇区。还有一款金星牌 MP3 128M 情况也是一样。 使用 Kingston 512M 优盘:可以完成 mReadSector( 0,1 )和 mWriteSector( 600,1 ) 子程序,但是返回值都为错误代码 0x1f (USB_INT_DISK_ERR 或者 ERR_USB_DISK_ERR)。 使用“超速王”128M:执行 mReadSector( 0,1 )和 mWriteSector( 600,1 ) 子程序,全部卡在其过程中的 mIntStatus = mWaitInterrupt( ) 命令行。 请问这是什么原因造成的?应该如何解决? 2、我在使用的头文件 CH375HFQ.H 中看到有 CH375ReadBlock(void)和CH375WriteBlock(void) 的函数声明,请问这两个子程序是否也是用作物理扇区读写的?如果是,应该如何使用? 3、请问子程序 mReadCH375Data( unsigned char *buf )和 mWriteCH375Data( unsigned char *buf ,unsigned char len )与 mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )和 mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )函数之间,是否有何联系和区别?
1、如果前面库的初始化、检测U盘连接、CH375DiskReady( )能正常通过,而CH375FileOpen( )和CH375FileCreate( )失败的话,你可以检查一下磁盘缓冲区是否存在问题,以及模拟并口的三个读写子程序会不会速度太慢。 如果采用直接操作物理扇区的里子的话,由于U盘初始化没有库做的那么完善,U盘支持率没有使用库的高。
2、CH375ReadBlock(void)和CH375WriteBlock(void) 可以用来操作物理扇区的读写,但相应头文件部分得添加东西,你可以发封邮件到技术信箱,再给你回过去。 3、mReadCH375Data和mWriteCH375Data为读取375端点缓冲区的数据、将数据写入375缓冲区;而mReadSector或mWriteSector则是将数据从U盘对应的物理扇区读出或写入。
谢谢luoye268268的细心指导!非常感激! 我使用物理扇区读写,只是想确认一下 CH375 与 U 盘之间是否能够正常通讯!因为我听说,有些 U 盘虽然能够被识别和初始化,但是不一定能够正常读写,所以做此测试. 另外,我想进一步了解一下,您所说的"模拟并口的三个读写子程序速度太慢",是说会影响 U 盘的读写速度,还是说会导致无法正常运行程序,或导致程序返回错误代码? 以下是我编写的"模拟并口的三个读写子程序",还请您受累帮忙看一下,是否有不妥之处?谢谢! void xWriteCH375Cmd( UINT8 mCmd ) // 外部定义的被CH375程序库调用的子程序,向CH375写命令 { DDRA=0xFF; //单片机 I/O 口 A 口寄存器 DDRA;指定数据传输方向为输出,付值0xFF A0=1; PORTA=mCmd; WR=0; CS_HOST=0; xDelay100uS( ); // 延时,CH375要求读写脉冲宽度大于100nS CS_HOST=1; WR=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延时2uS }
void xWriteCH375Data( UINT8 mData ) // 外部定义的被CH375程序库调用的子程序,向CH375写数据 { A0=0; DDRA=0xFF; // 指定单片机 I/O 口 A 口数据传输方向为输出 PORTA=mData; WR=0; CS_HOST=0; xDelay100uS( ); // 延时,CH375要求读写脉冲宽度大于100nS CS_HOST=1; WR=1; A0=1; mDelay1uS( ); mDelay1uS( ); // 至少延时1.5uS }
UINT8 xReadCH375Data(void) // 外部定义的被CH375程序库调用的子程序,从CH375读数据,最小周期为1.5uS, 否则之前延时1.5uS { UINT8 mData; mDelay1uS( );mDelay1uS( ); // 至少延时1.5uS DDRA=0x00; // 指定单片机 I/O 口 A 口数据传输方向为输入 PORTA=0x00; A0=0; RD=0; CS_HOST=0; mData=PORTA; xDelay100uS( ); // 延时 CS_HOST=1; RD=1; A0=1; return (mData); }
void xWriteCH375Cmd( UINT8 mCmd ) // 外部定义的被CH375程序库调用的子程序,向CH375写命令 { DDRA=0xFF; //单片机 I/O 口 A 口寄存器 DDRA;指定数据传输方向为输出,付值0xFF A0=1; PORTA=mCmd; CS_HOST=0; WR=0; WR=0; //xDelay100uS( ); // 延时,CH375要求读写脉冲宽度大于100nS
WR=1; CS_HOST=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延时2uS } void xWriteCH375Data( UINT8 mData ) // 外部定义的被CH375程序库调用的子程序,向CH375写数据 { A0=0; DDRA=0xFF; // 指定单片机 I/O 口 A 口数据传输方向为输出 PORTA=mData; CS_HOST=0; WR=0; WR=0; WR=1; //xDelay100uS( ); // 延时,CH375要求读写脉冲宽度大于100nS CS_HOST=1; // WR=1; mDelay1uS( ); mDelay1uS( ); // 至少延时1.5uS }
UINT8 xReadCH375Data(void) // 外部定义的被CH375程序库调用的子程序,从CH375读数据,最小周期为1.5uS, 否则之前延时1.5uS { UINT8 mData; mDelay1uS( );mDelay1uS( ); // 至少延时1.5uS DDRA=0x00; // 指定单片机 I/O 口 A 口数据传输方向为输入 PORTA=0x00; A0=0; CS_HOST=0; RD=0; RD=0; mData=PORTA; // xDelay100uS( ); // 延时 RD=1; CS_HOST=1; return (mData); }
不知道你的延时是否准确 如果准确 xDelay100uS( ); 执行时间太长