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