最近用stm32改了程序 在初始化中能顯示出設(shè)備描述符 但在后面設(shè)置USB地址出現(xiàn)問(wèn)題 程序如下 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; // 設(shè)備類(lèi)代碼 s = SetUsbAddress( index + ( (PUSB_SETUP_REQ)SetupSetUsbAddr ) -> wValueL ); // 設(shè)置USB設(shè)備地址,加上index可以保證三個(gè)HUB端口分配不同的地址 if(s=USB_INT_SUCCESS){省略} 問(wèn)題:設(shè)置完USB設(shè)備地址 不能返回USB_INT_SUCCESS 當(dāng)跳轉(zhuǎn)到SetUsbAddress里函數(shù)的程序 memcpy ( CtrlBuf, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) ); ( (PUSB_SETUP_REQ)CtrlBuf ) -> wValueL = addr; // USB設(shè)備地址 s = HostCtrlTransfer374( CtrlBuf, NULL, NULL ); // 執(zhí)行控制傳輸 printf("ok1\n"); 發(fā)現(xiàn)ok1沒(méi)有被打印 也就是程序卡在HostCtrlTransfer374里了 但是設(shè)備描述符正常 說(shuō)明HostCtrlTransfer374程序沒(méi)錯(cuò) 什么原因呢 請(qǐng)指教
STM32與51單片機(jī)在數(shù)據(jù)位上有區(qū)別,UINT的定義也不同,地址值應(yīng)該是1字節(jié)8位數(shù)據(jù),這里很有可能你的設(shè)置地址值不正確。
// 設(shè)置USB地址 UINT8 SetupSetUsbAddr[] = { 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 }; 是這個(gè)嗎 那我要怎么改呢
現(xiàn)在單個(gè)U盤(pán)已經(jīng)讀寫(xiě)成功 正在弄兩個(gè)u盤(pán) 看著exam15 思路特別不清晰 還有好多問(wèn)題 主要想問(wèn)一下 把源盤(pán)的數(shù)據(jù)復(fù)制到目的盤(pán)中 那這個(gè)用單片機(jī)控制 速度是不是會(huì)很慢啊 可不可以用類(lèi)似DMA方式 我想兩個(gè)U盤(pán)數(shù)據(jù)復(fù)制速度快一些 而且是不是可以有些語(yǔ)句刪掉啊 以節(jié)省時(shí)間
對(duì)拷的思想是將源盤(pán)讀到的數(shù)據(jù)放入中轉(zhuǎn)緩沖區(qū)里,然后打開(kāi)目的盤(pán),創(chuàng)建后將中轉(zhuǎn)緩沖區(qū)數(shù)據(jù)寫(xiě)入到目的盤(pán)。速度的話(huà)主要是看你單片機(jī)的速度。
出現(xiàn)的問(wèn)題:當(dāng)把目的盤(pán)插入時(shí) 串口調(diào)試信息為:USB-Disk Ready Open source Copy completion, 0 files .程序進(jìn)入if ( s != ERR_SUCCESS ) 然后就break跳出while循環(huán)了 就不執(zhí)行了 請(qǐng)問(wèn)正常不應(yīng)該這樣吧 如果正確是什么樣的流程呢 我的問(wèn)題出現(xiàn)在哪里呢 謝謝指點(diǎn) 非常感謝。程序如下: while ( 1 ) { RestoreDisk( SourceDisk ); // 恢復(fù)源盤(pán)的變量 if ( CH374DiskStatus < DISK_OPEN_FILE ) { // 文件尚未打開(kāi) printf( "Open source\n" ); strcpy( mCmdParam.Open.mPathName, "\\*\xFF\x00" ); /* 文件名,0xFF用于指示說(shuō)明搜索序號(hào)在CH374vFileSize變量中,0x00僅用于結(jié)束strcpy */ CH374vFileSize = 0xFFFFFFFF; /* 快速連續(xù)枚舉,每找到一個(gè)文件調(diào)用一次xFileNameEnumer回調(diào)子程序,如果值小于0x80000000則每次只枚舉一個(gè)文件太慢 */ CountMatch = 0; // 計(jì)數(shù)搜索到的匹配文件數(shù),以與指定序號(hào)比較 s = CH374FileOpen( ); /* 枚舉,由回調(diào)程序xFileNameEnumer產(chǎn)生記錄保存到結(jié)構(gòu)中,如果文件名中含有通配符*,則為搜索文件而不打開(kāi) */ if ( s == ERR_SUCCESS ) s = ERR_FOUND_NAME; // 轉(zhuǎn)換狀態(tài)碼,避免沖突 if ( ( s == ERR_FOUND_NAME || s == ERR_MISS_FILE ) && CountMatch > FileIndex ) { // 找到指定序號(hào)的文件 strcpy( mCmdParam.Open.mPathName, FileName ); // 文件名 s = CH374FileOpen( ); /* 找到文件后正式打開(kāi)文件 */ } if ( s != ERR_SUCCESS ) { // 操作結(jié)束或者操作失敗則清盤(pán) if ( s == ERR_MISS_FILE ) printf( "Copy completion, %d files\n", FileIndex ); // 復(fù)制完成 else printf( "FileOpen error %02x\n", (UINT16)s ); SaveDisk( SourceDisk ); // 備份源盤(pán)的變量 SourceDisk = 0xFF; break; }
找到問(wèn)題了 再改改 應(yīng)該是我枚舉出現(xiàn)錯(cuò)誤
枚舉成功了 然后讀文件又出問(wèn)題 讀文件錯(cuò)誤0xB4 0xb4錯(cuò)誤為/* 文件已經(jīng)關(guān)閉,如果需要使用,應(yīng)該重新打開(kāi)文件 */ 這是什么問(wèn)題 這段程序我沒(méi)改 謝謝指點(diǎn) mCmdParam.ReadX.mSectorCount = sizeof(my_buffer)/DISK_BASE_BUF_LEN; // 扇區(qū)數(shù) mCmdParam.ReadX.mDataBuffer = &my_buffer[0]; /* 指向文件數(shù)據(jù)緩沖區(qū)的起始地址 */ CH374vFileSize += CH374vSectorSize - 1; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無(wú)法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長(zhǎng)度以讀取尾部零頭 */ s = CH374FileReadX( ); /* 從文件讀取數(shù)據(jù) */ CH374vFileSize -= CH374vSectorSize - 1; /* 恢復(fù)原文件長(zhǎng)度 */ if ( s != ERR_SUCCESS ) { // 操作失敗則清盤(pán) printf( "FileReadX error %02x\n", (UINT16)s ); SaveDisk( SourceDisk ); // 備份源盤(pán)的變量 SourceDisk = 0xFF; break; }
在你枚舉完成之后,需要打開(kāi)下文件在調(diào)用讀取函數(shù)。枚舉是不負(fù)責(zé)打開(kāi)文件的。只是返回文件的絕對(duì)路徑。而不是打開(kāi)文件。
現(xiàn)在源盤(pán)里有兩個(gè)TXT文本 但是只能復(fù)制一個(gè) 我用的for循環(huán)枚舉 枚舉一個(gè)復(fù)制一個(gè),枚舉都沒(méi)問(wèn)題 復(fù)制第一個(gè)文件也成功 但不能復(fù)制第二個(gè) 幫我看看哪里問(wèn)題 程序如下: for (i = 0; i < 10; i++ ) { /* 部分省略 枚舉成功 每次讀文件數(shù)據(jù)都成功 以下是復(fù)制數(shù)據(jù)程序*/
SaveDisk( SourceDisk ); // 備份源盤(pán)的變量 RestoreDisk( TargetDisk ); // 恢復(fù)目的盤(pán)的變量 s=ch374_CreateFile(strFileName); StopIfError(s); s = ch374_WriteFile((uint8_t *)ucaDataBuf, strlen((char *)ucaDataBuf)); /* 寫(xiě)數(shù)據(jù)到文件 */ StopIfError(s); printf( "Create target ok\n" ); /* 關(guān)閉文件 */ printf( "Close\r\n" ); s = ch374_CloseFile(); StopIfError(s); RestoreDisk(SourceDisk); // 恢復(fù)源盤(pán)的變量 SaveDisk( TargetDisk ); // 備份目的盤(pán)變量 }
看不懂你的程序。關(guān)閉文件的時(shí)候需要送參數(shù)。復(fù)制第二個(gè)不成功是哪個(gè)步驟返回錯(cuò)誤?
關(guān)閉文件的時(shí)候需要送參數(shù)? 這個(gè)是哪句程序體現(xiàn)的 復(fù)制第二個(gè)不成功是 程序停在創(chuàng)建 s=ch374_CreateFile(strFileName); 這句話(huà) s也沒(méi)返回值
復(fù)制50多個(gè)都成功 我是用源盤(pán)和目的盤(pán)來(lái)回切換 我有個(gè)想法就是 每次讀取的數(shù)據(jù)放在U盤(pán)自帶的緩沖區(qū)里 是否可行 因?yàn)樵谇蠻盤(pán)的時(shí)候 恢復(fù)U盤(pán)變量時(shí)就需要清空緩沖區(qū) 所以存在緩沖區(qū)的數(shù)據(jù)也是暫時(shí)的 不需保存 如果可行怎么寫(xiě)程序呢 謝謝
如果你用U盤(pán)的緩沖區(qū),你還需要對(duì)U盤(pán)的物理扇區(qū)進(jìn)行讀寫(xiě),一是減慢了速度,二是降低了U盤(pán)的使用壽命。所以最好不要這么做。
我可能理解的不太好 清空緩沖區(qū)是U盤(pán)的還是CH374的 如果是CH374 是否可對(duì)它緩沖區(qū)操作呢 謝謝
清空緩沖區(qū)是清空CH374的,而CH374的緩沖區(qū)是指向一個(gè)自定義的緩沖區(qū)(用于保存和恢復(fù)數(shù)據(jù))。