我参照你们的例程写了下面的程序,我直接向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 ); //操作失败 }