问个问题,按用户手册上说,我读完缓冲区的数据,CH375应该会自动释放缓冲区,可实际使用,发完64字节数据,再发下一次64字节数据,必须先发CMD_UNLOCK_USB指令,请问是否连续发送数据时,数据与数据之间都必须发送CMD_UNLOCK_USB指令?
每成功发送一包数据即产生上传成功中断后都必须解锁,确切的说是包与包之间
向各位请教个问题,我今天参照CH375EVT里的EXAM0写了个读U盘扇区的程序,个人感觉可以读写了,读到的0x1FE、0x1ff地址的结束码为0x55AA。 可读扇区时最后已经不读数据了,还必须发一个CMD_DISK_RD_GO指令,是为了让CH375返回USB_INT_SUCCESS状态,以接受其他操作吗? 另外,在exam0里,对U盘的扇区0数据覆盖到扇区1,再将扇区0清空;然后复制扇区1的内容到扇区0;按我之前看海量存储的理解,扇区1应该是FAT表的位置吧,这样不影响U盘的使用吗?
(1)CH375单次最大可读写64B数据,扇区大小为512的话,那么需要8次才可以读完,CMD_DISK_RD_GO相当于是通知CH375执行IN事务读取数据,具体含义用户也无需知道,照着流程做就可以了。 (2)扇区1一般是保留扇区,不是FAT表,这个例程仅是告诉用户怎么读写扇区
呵呵,读512字节数据,应该是64Byte+7次CMD_DISK_RD_GO,可是要收到USB_INT_SUCCESS,读完了512字节数据就必须再发送一次CMD_DISK_RD_GO,是这样吧?
可以这么理解,如果读512字节的数据,会产生9次中断,最后一次中断状态为整个读操作的状态,USB_INT_SUCCESS 表示成功
请教一下,我是直接将CH375HF4.lib添加到工程文件中,将头文件包含在c文件中,可编译有很多错误信息,请问有人能给点修正的建议吗?
用我们的工程试试:UploadImages/2009831281564.rar
非常感谢!
因为文件名不固定,按照我自己的理解修改了,可是无效,麻烦指点一下。
while ( 1 ) { while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ mDelay100mS( ); } mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );
/* 检查U盘是否准备好,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif //文件名20090803.txt mCmdParam.Open.mPathName[0] = 0x5c; /* '\' */ mCmdParam.Open.mPathName[1] = 0x5c; /* '\' */ mCmdParam.Open.mPathName[2] = 0x32; /* '2' */ mCmdParam.Open.mPathName[3] = 0x30; /* '0' */ mCmdParam.Open.mPathName[4] = 0x30; /* '0' */ mCmdParam.Open.mPathName[5] = 0x39; /* '9' */ mCmdParam.Open.mPathName[6] = 0x30; /* '0' */ mCmdParam.Open.mPathName[7] = 0x38; /* '8' */ mCmdParam.Open.mPathName[8] = 0x30; /* '0' */ mCmdParam.Open.mPathName[9] = 0x33; /* '3' */ mCmdParam.Open.mPathName[10] = 0x2c; /* '.' */ mCmdParam.Open.mPathName[11] = 0x74; /* 't' */ mCmdParam.Open.mPathName[12] = 0x78; /* 'x' */ mCmdParam.Open.mPathName[13] = 0x74; /* 't' */
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
FILE_DATA_BUF[0] = 0x59; /* 将刚才已写入U盘的零头数据复制到缓冲区的头部 */ FILE_DATA_BUF[1] = 0x4c; FILE_DATA_BUF[2] = 0x5a; FILE_DATA_BUF[3] = 0x20; FILE_DATA_BUF[4] = 0x69; FILE_DATA_BUF[5] = 0x73; FILE_DATA_BUF[6] = 0x20; FILE_DATA_BUF[7] = 0x61; FILE_DATA_BUF[8] = 0x20; FILE_DATA_BUF[9] = 0x70; FILE_DATA_BUF[10] = 0x69; FILE_DATA_BUF[11] = 0x67;
NewSize = 12; /* 新文件的长度 */ SecCount = 1; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 计算文件的扇区数,因为读写是以扇区为单位的 */
mCmdParam.Write.mSectorCount = SecCount; /* 写入所有扇区的数据 */ i = CH375FileWrite( ); /* 向文件写入数据 */
mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(17,0,0); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2009, 8, 3 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */
mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */ i = CH375FileClose( ); }
一个“0x5c”就可以了,同时文件后缀"txt"需要大写。
谢谢,修改之后生成了1个文件了,不过文件名为“20090803.,TX”,很奇怪,有个小数点,是不是我有参数传递不对?
mCmdParam.Open.mPathName[0] = 0x5c; mCmdParam.Open.mPathName[1] = 0x32; mCmdParam.Open.mPathName[2] = 0x30; mCmdParam.Open.mPathName[3] = 0x30; mCmdParam.Open.mPathName[4] = 0x39; mCmdParam.Open.mPathName[5] = 0x30; mCmdParam.Open.mPathName[6] = 0x38; mCmdParam.Open.mPathName[7] = 0x30; mCmdParam.Open.mPathName[8] = 0x33; mCmdParam.Open.mPathName[9] = 0x2c; mCmdParam.Open.mPathName[10] = 0x54; mCmdParam.Open.mPathName[11] = 0x58; mCmdParam.Open.mPathName[12] = 0x54;
有个逗号,不好意思,写错了。
哪位指教一下,20090803.,TX”,很奇怪,生成的txt文件后缀名有个逗号,是不是我有参数传递不对?
mCmdParam.Open.mPathName[0] = 0x5c; mCmdParam.Open.mPathName[1] = 0x32; mCmdParam.Open.mPathName[2] = 0x30; mCmdParam.Open.mPathName[3] = 0x30; mCmdParam.Open.mPathName[4] = 0x39; mCmdParam.Open.mPathName[5] = 0x30; mCmdParam.Open.mPathName[6] = 0x38; mCmdParam.Open.mPathName[7] = 0x30; mCmdParam.Open.mPathName[8] = 0x33; mCmdParam.Open.mPathName[9] = 0x2c; mCmdParam.Open.mPathName[10] = 0x54; mCmdParam.Open.mPathName[11] = 0x58; mCmdParam.Open.mPathName[12] = 0x54;
"."的16进制数据是0X2E吧。你自己修改下在做。