最近用stm32改了程序 在初始化中能显示出设备描述符 但在后面设置USB地址出现问题 程序如下 EXAM14 for(i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++) printf( "0x%02X", (UINT16)( TempBuf[i] ) ); printf( "\n" ); // 显示出描述符 dv_cls = ( (PUSB_DEV_DESCR)TempBuf ) -> bDeviceClass; // 设备类代码 s = SetUsbAddress( index + ( (PUSB_SETUP_REQ)SetupSetUsbAddr ) -> wValueL ); // 设置USB设备地址,加上index可以保证三个HUB端口分配不同的地址 if(s=USB_INT_SUCCESS){省略} 问题:设置完USB设备地址 不能返回USB_INT_SUCCESS 当跳转到SetUsbAddress里函数的程序 memcpy ( CtrlBuf, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) ); ( (PUSB_SETUP_REQ)CtrlBuf ) -> wValueL = addr; // USB设备地址 s = HostCtrlTransfer374( CtrlBuf, NULL, NULL ); // 执行控制传输 printf("ok1\n"); 发现ok1没有被打印 也就是程序卡在HostCtrlTransfer374里了 但是设备描述符正常 说明HostCtrlTransfer374程序没错 什么原因呢 请指教
STM32与51单片机在数据位上有区别,UINT的定义也不同,地址值应该是1字节8位数据,这里很有可能你的设置地址值不正确。
// 设置USB地址 UINT8 SetupSetUsbAddr[] = { 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 }; 是这个吗 那我要怎么改呢
现在单个U盘已经读写成功 正在弄两个u盘 看着exam15 思路特别不清晰 还有好多问题 主要想问一下 把源盘的数据复制到目的盘中 那这个用单片机控制 速度是不是会很慢啊 可不可以用类似DMA方式 我想两个U盘数据复制速度快一些 而且是不是可以有些语句删掉啊 以节省时间
对拷的思想是将源盘读到的数据放入中转缓冲区里,然后打开目的盘,创建后将中转缓冲区数据写入到目的盘。速度的话主要是看你单片机的速度。
出现的问题:当把目的盘插入时 串口调试信息为:USB-Disk Ready Open source Copy completion, 0 files .程序进入if ( s != ERR_SUCCESS ) 然后就break跳出while循环了 就不执行了 请问正常不应该这样吧 如果正确是什么样的流程呢 我的问题出现在哪里呢 谢谢指点 非常感谢。程序如下: while ( 1 ) { RestoreDisk( SourceDisk ); // 恢复源盘的变量 if ( CH374DiskStatus < DISK_OPEN_FILE ) { // 文件尚未打开 printf( "Open source\n" ); strcpy( mCmdParam.Open.mPathName, "\\*\xFF\x00" ); /* 文件名,0xFF用于指示说明搜索序号在CH374vFileSize变量中,0x00仅用于结束strcpy */ CH374vFileSize = 0xFFFFFFFF; /* 快速连续枚举,每找到一个文件调用一次xFileNameEnumer回调子程序,如果值小于0x80000000则每次只枚举一个文件太慢 */ CountMatch = 0; // 计数搜索到的匹配文件数,以与指定序号比较 s = CH374FileOpen( ); /* 枚举,由回调程序xFileNameEnumer产生记录保存到结构中,如果文件名中含有通配符*,则为搜索文件而不打开 */ if ( s == ERR_SUCCESS ) s = ERR_FOUND_NAME; // 转换状态码,避免冲突 if ( ( s == ERR_FOUND_NAME || s == ERR_MISS_FILE ) && CountMatch > FileIndex ) { // 找到指定序号的文件 strcpy( mCmdParam.Open.mPathName, FileName ); // 文件名 s = CH374FileOpen( ); /* 找到文件后正式打开文件 */ } if ( s != ERR_SUCCESS ) { // 操作结束或者操作失败则清盘 if ( s == ERR_MISS_FILE ) printf( "Copy completion, %d files\n", FileIndex ); // 复制完成 else printf( "FileOpen error %02x\n", (UINT16)s ); SaveDisk( SourceDisk ); // 备份源盘的变量 SourceDisk = 0xFF; break; }
找到问题了 再改改 应该是我枚举出现错误
枚举成功了 然后读文件又出问题 读文件错误0xB4 0xb4错误为/* 文件已经关闭,如果需要使用,应该重新打开文件 */ 这是什么问题 这段程序我没改 谢谢指点 mCmdParam.ReadX.mSectorCount = sizeof(my_buffer)/DISK_BASE_BUF_LEN; // 扇区数 mCmdParam.ReadX.mDataBuffer = &my_buffer[0]; /* 指向文件数据缓冲区的起始地址 */ CH374vFileSize += CH374vSectorSize - 1; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ s = CH374FileReadX( ); /* 从文件读取数据 */ CH374vFileSize -= CH374vSectorSize - 1; /* 恢复原文件长度 */ if ( s != ERR_SUCCESS ) { // 操作失败则清盘 printf( "FileReadX error %02x\n", (UINT16)s ); SaveDisk( SourceDisk ); // 备份源盘的变量 SourceDisk = 0xFF; break; }
在你枚举完成之后,需要打开下文件在调用读取函数。枚举是不负责打开文件的。只是返回文件的绝对路径。而不是打开文件。
现在源盘里有两个TXT文本 但是只能复制一个 我用的for循环枚举 枚举一个复制一个,枚举都没问题 复制第一个文件也成功 但不能复制第二个 帮我看看哪里问题 程序如下: for (i = 0; i < 10; i++ ) { /* 部分省略 枚举成功 每次读文件数据都成功 以下是复制数据程序*/
SaveDisk( SourceDisk ); // 备份源盘的变量 RestoreDisk( TargetDisk ); // 恢复目的盘的变量 s=ch374_CreateFile(strFileName); StopIfError(s); s = ch374_WriteFile((uint8_t *)ucaDataBuf, strlen((char *)ucaDataBuf)); /* 写数据到文件 */ StopIfError(s); printf( "Create target ok\n" ); /* 关闭文件 */ printf( "Close\r\n" ); s = ch374_CloseFile(); StopIfError(s); RestoreDisk(SourceDisk); // 恢复源盘的变量 SaveDisk( TargetDisk ); // 备份目的盘变量 }
看不懂你的程序。关闭文件的时候需要送参数。复制第二个不成功是哪个步骤返回错误?
关闭文件的时候需要送参数? 这个是哪句程序体现的 复制第二个不成功是 程序停在创建 s=ch374_CreateFile(strFileName); 这句话 s也没返回值
复制50多个都成功 我是用源盘和目的盘来回切换 我有个想法就是 每次读取的数据放在U盘自带的缓冲区里 是否可行 因为在切U盘的时候 恢复U盘变量时就需要清空缓冲区 所以存在缓冲区的数据也是暂时的 不需保存 如果可行怎么写程序呢 谢谢
如果你用U盘的缓冲区,你还需要对U盘的物理扇区进行读写,一是减慢了速度,二是降低了U盘的使用寿命。所以最好不要这么做。
我可能理解的不太好 清空缓冲区是U盘的还是CH374的 如果是CH374 是否可对它缓冲区操作呢 谢谢
清空缓冲区是清空CH374的,而CH374的缓冲区是指向一个自定义的缓冲区(用于保存和恢复数据)。