用375写的时候遇到问题,搞不明白。[求助]

我参照你们的例程写了下面的程序,我直接向U盘DATA区写多扇区数据时,发现375只能写8个包,就是一个扇区512字节的数据,写完后剩余的包就写不动了,程序总是卡在等待375的#INT引脚上。不明白为什么。

#if _DebugVer_ /* 中断测试 */ Uint16 Interrupt_test(void) { //CH375检测到NAK会进行重试,防止在此处死机.对其做超时处理,一旦超过规定的时间则强行终止NAK重试 Uint16 i; for ( i = 0; CH375_INT_WIRE != 0; i ++ ) // 如果CH375的中断引脚INT#输出高电平则等待,通过计数防止超时 { delay1us(); if( i == 0x00ff) { CH375_WR_CMD( CMD_ABORT_NAK ); // 如果超时达61mS以上则强行终止NAK重试,中断返回USB_INT_RET_NAK return(0x00ff); } } CH375_WR_CMD(CMD_GET_STATUS); //产生操作完成中断, 获取中断状态 return(CH375_RD_DAT()); } #endif

/* 等待CH375中断并获取状态 */ Uint16 CH375_Wait_Interrupt(void) { while(CH375_INT_WIRE); //查询等待CH375操作完成中断(INT#低电平) CH375_WR_CMD(CMD_GET_STATUS); //产生操作完成中断, 获取中断状态 return(CH375_RD_DAT()); }

/* 将缓冲区中的多个扇区的数据块写入U盘 iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数, *mBufferPoint指向写入数据的首地址*/ Uint16 CH375_WriteSector(Uint32 iLbaStart,Uint16 iSectorCount,Uint16 *mBufferPoint) { unsigned int mIntStatus; unsigned int mBlockCount; unsigned int mLength; CH375_WR_CMD(CMD_DISK_WRITE); //向USB存储器写数据块 CH375_WR_DAT((Uint16)iLbaStart& 0x00ff); //LBA的最低8位 CH375_WR_DAT((Uint16)(iLbaStart >> 8)& 0x00ff); CH375_WR_DAT((Uint16)(iLbaStart >> 16)& 0x00ff); CH375_WR_DAT((Uint16)(iLbaStart >> 24)& 0x00ff); //LBA的最高8位 CH375_WR_DAT(iSectorCount); //扇区数 for(mBlockCount=iSectorCount*BlockPerSector;mBlockCount !=0;mBlockCount --) //数据块计数 { #if _DebugVer_ mIntStatus= Interrupt_test(); // while(mIntStatus== 0x00ff); 验证是否#int引脚响应超时 #else mIntStatus= CH375_Wait_Interrupt(); //等待USB请求数据的中断并获取状态 #endif if(mIntStatus!= USB_INT_DISK_WRITE) //中断状态错误,清除错误,写数据提前结束 { CH375_ClearError(); //清除U盘错误以便重试 return( mIntStatus ); //操作失败 } CH375_WR_CMD( CMD_WR_USB_DATA7 ); //向CH375缓冲区写入数据块 mLength = CH375_BLOCK_SIZE; CH375_WR_DAT( mLength ); //后续数据的长度 while(mLength) //根据长度写入数据 { //#if _DebugVer_ // CH375_WR_DAT(0x66); //调试过程,连续向U盘写入0x66 //#else CH375_WR_DAT(*mBufferPoint); //将缓冲区数据写入U盘 //#endif delayNuS(10); mBufferPoint++; mLength--; } CH375_WR_CMD(CMD_DISK_WR_GO); //继续执行USB存储器的写操作 } #if _DebugVer_ mIntStatus= Interrupt_test(); #else mIntStatus= CH375_Wait_Interrupt(); //等待中断并获取状态 #endif //完成所有数据块且得到CH375的成功应答,返回成功 if(mBlockCount == 0) { if (mIntStatus == USB_INT_SUCCESS) return(0); //操作成功 } //if(mIntStatus == USB_INT_DISCONNECT) return(mIntStatus); //U盘断开 CH375_ClearError(); //清除U盘错误以便重试 return( mIntStatus ); //操作失败 }

建议先用我们的例程实验成功后,再根据你的需要修改程序,这样也便于我们分析问题 下载CH375EVT.ZIP,用MISCELL下的例程


和我目前的问题一样,可以大家交流交流啊~~~ MSN:个人信息保护,已隐藏


我仔细看了你们的程序,跟我的程序大同小异。而且我的程序基本上是参考你们的程序写的。现在经过测试,我发现一个很奇怪的现象,似乎针对特殊的扇区,375就会进入一种停止不可用的状态。针对我使用的U盘,写2512扇区、2527扇区、2554扇区,375不可用,必须重新初始化375才能继续写入。如果是扇区坏道,应该始终无法写入,但重新初始化后就375就能写入。这点真的很奇怪。


我们的例程都经过测试的,如果用例程测试通过,那么很显然是你的程序有问题,这样也便于分析错误所在,况且我们的例程移植一下也很简单,强烈建议您去尝试一下,另例程中的延时子程序务必精确一点。


我刚才有个惊喜的发现,似乎电流加大后上面的问题可以解决。算是意外之喜吧。谢谢你的关注。


只有登录才能回复,可以选择微信账号登录