初始化都正常,连接通过,打开文件怎么都不行,看了下返回值是0X10,发现没有这种错误类型,怎么回事啊
DiskReady通过没?文件名赋值对么?另,请把情况说清楚点,是CH375,还是374?主控单片机是什么?用了哪个库文件?
请问有固定电话吗,我直接打过来问吧
DiskReady也没法通过,但是得不到返回值,文件名赋值CopyStrToRAM(mCmdParam.Open.mPathName,"/BBB.C");,是CH375,主控芯片是ARM 的Cortex_m3,用的是ARM的IAR的库,CH375HFU.R79,
这个问题你可以去查下USB口的信号是否有问题,其次就是仔细检查你的USB那端是否有问题,要是实在解决不了的话,你可以把硬件寄过来我们帮你调试
(1)测试DISK_BASE_BUF,写入再读出,比较数据是否正确 (2)CopyStrToRAM(mCmdParam.Open.mPathName,"/BBB.C")执行完之后有没有添加: mCmdParam.Open.mPathName[ 6 ] = 0 表示结束标志? (3)另,对比一下示例程序(仅通过编译,需要添时钟配置,I/O初始化等程序):UploadImages/200872417333381.rar
现在的情况是我不使用文件库,直接用写命令,返回消息来判断,大致流程是: 插入U盘后,获得中断,进入程序,然后执行 xWriteCH375Cmd(CMD_TEST_CONNECT); 判断返回值xReadCH375Data(); 得到返回值USB_INT_CONNECT;说明连接好但U盘没有初始化,然后初始化U盘 xWriteCH375Cmd(CMD_DISK_INIT);产生中断 xWriteCH375Cmd(CMD_GET_STATUS);取消中断,并获得连接状态 xReadCH375Data();这时问题出来了,返回值不在定义的范围内,我想文件库中DiskReady的问题肯定是初始化U盘出问题了,为什么呢
xWriteCH375Cmd(CMD_DISK_INIT);产生中断 上面命令发下去之后需要等待中断引脚为低之后在去获取中断状态,否则的话,可能获取不到正常的中断状态,还有就是你有没有配置你的中断引脚之类的都会出现你说的现象
恩,找你的方法,我在xWriteCH375Cmd(CMD_DISK_INIT);产生中断后面加了一步 while(CH375_INT_WIRE == (u8)Bit_SET); 然后xWriteCH375Cmd(CMD_GET_STATUS);取消中断,并获得连接状态 xReadCH375Data();或者的值是USB_INT_SUCCESS,说明初始化成功,然后调用 CH375DiskReady();还是无法成功,不知道怎么办了,,,,
然后我又继续调用xWriteCH375Cmd(CMD_DISK_READY); while(CH375_INT_WIRE == (u8)Bit_SET); xWriteCH375Cmd(CMD_GET_STATUS); 获得的返回值xReadCH375Data()是USB_INT_SUCCESS,这样是否说明U盘是准备好了呢,但是我接下去调用库函数fileopen(),返回的还是0x10啊,真的无语了,,,,
子程序库中的函数调用是有先后次序的 调用CH375DiskReady()之前一定要成功执行CH375LibInit( )和CH375DiskConnect() 你的程序中没有体现这个过程,另,如果通过库去操作U盘,是不需要用户处理底层命令的,如:CMD_DISK_READY,CMD_DISK_INIT等
如果是你说的是操作成功的话,你去看下你在调用我们库的时候有没有定义我们的中断引脚???? #define CH375_INT_WIRE ( PINB & 0x10 ) /* PINB.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
知道你的意思,我把关键代码贴一下 #define CH375_INT_WIRE GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) 这是定义的中断脚,目前用查询 当获得低电平时,进入中断处理函数,然后执行CH375DiskConnect(),如果返回值是ERR_SUCCESS,则继续执行,否则返回,我这里获得的返回值是ERR_SUCCESS,然后执行CH375DiskReady(),这里我做了个死循环,即 while((k = CH375DiskReady()) != ERR_SUCCESS);结果就无法出来,但是可以明显看到在运行这步的时候U盘的指示灯狂闪,如果直接去运行ch375fileopen(),结果是返回0x10,就这样。
我作的改动还有个缓冲的改动,pDISK_BASE_BUF = &buf[0];自己定义了外部文件存储区buf[1024];并且定义 #define DISK_BASE_BUF_LEN 0,这样没问题吧,不过我理解在CH375DiskReady()的时候应该不需要用到文件存储区吧,后面的文件读取用到吧
那这样,按照我下面给你的初始化代码看下返回的数据是多少?如果这个都操作成功的话,在打开文件返回0X10就需要你去测试下DISK-BASE-BUF,或者返回0X10之后,你把DISK-BASE-BUF里面的数据帖出来看下: unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */
/* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ i = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */ for ( i = 0; i != 8; i ++ ) { /* 根据长度读取数据 */ DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盘容量数据中的每扇区字节数,大端格式 */ printf("i=%02x\n",(unsigned short)i); if ( i == 0x04 ){ BlockPerSector = 1024/CH375_BLOCK_SIZE; SectorSize=1024;} /* 磁盘的物理扇区是1K字节 */ else if ( i == 0x08 ){ BlockPerSector = 2048/CH375_BLOCK_SIZE;SectorSize=2048; }/* 磁盘的物理扇区是2K字节 */ else if ( i == 0x10 ){ BlockPerSector = 4096/CH375_BLOCK_SIZE;SectorSize=4096; }/* 磁盘的物理扇区是4K字节 */ else {BlockPerSector = 512/CH375_BLOCK_SIZE;SectorSize=512; }/* 默认的磁盘的物理扇区是512字节 */ BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ printf("sec=%02x\n",(unsigned short)SectorSize); return( 0 ); /* U盘已经成功初始化 */ }
呵呵,大致知道原因了,目前CH375DiskReady()已经通过,原来是需要应用程序完成的几个程序如 void xQueryInterrupt(),xDelayAfterWrite()等函数没有写完全,我想那些库函数一定调用了这些函数,如果返回值不对的话库函数的调用就会出问题吧,