請(qǐng)幫忙測(cè)試[求助]

使用你們提供的AVR的庫(kù)文件: /* 2004.06.05, 2004.09.20, 2004.10.22, 2004.11.20, 2004.12.12, 2004.12.28, 2005.01.04, 2005.01.12, 2005.01.26, 2005.03.01, 2005.07.29, 2005.12.28 **************************************** ** Copyright (C) W.ch 1999-2005 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, ICCAVR_6.31@AVR ** **************************************** */ /* CH375 主機(jī)文件系統(tǒng)接口 V2.9 */ /* 支持: FAT12/FAT16/FAT32 */ /* AVR單片機(jī), 查詢(xún)方式或者中斷方式 */

#ifndef CH375HF_H #define CH375HF_H

#define CH375_LIB_VER 0x29

/* 以下定義的詳細(xì)說(shuō)明請(qǐng)看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫(xiě)的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢(xún)方式",1為"中斷方式" */

/* 單片機(jī)的RAM有限,其中CH375子程序用512字節(jié),剩余RAM部分可以用于文件讀寫(xiě)緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫(xiě),那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#ifdef __cplusplus extern "C" { #endif

/* FILE: CH375INC.H */

/* ********************************************************************************************************************* */ /* 硬件特性 */

#define CH375_MAX_DATA_LEN 0x40 /* 最大數(shù)據(jù)包的長(zhǎng)度, 內(nèi)部緩沖區(qū)的長(zhǎng)度 */

/* ********************************************************************************************************************* */ /* 命令代碼 */

#define CMD_RESET_ALL 0x05 /* 執(zhí)行硬件復(fù)位 */

#define CMD_CHECK_EXIST 0x06 /* 測(cè)試工作狀態(tài) */ /* 輸入: 任意數(shù)據(jù) */ /* 輸出: 輸入數(shù)據(jù)的按位取反 */

#define CMD_SET_USB_ID 0x12 /* 設(shè)備方式: 設(shè)置USB廠商VID和產(chǎn)品PID */ /* 輸入: 廠商ID低字節(jié), 廠商ID高字節(jié), 產(chǎn)品ID低字節(jié), 產(chǎn)品ID高字節(jié) */

#define CMD_SET_USB_ADDR 0x13 /* 設(shè)置USB地址 */ /* 輸入: 地址值 */

#define CMD_SET_USB_MODE 0x15 /* 設(shè)置USB工作模式 */ /* 輸入: 模式代碼 */ /* 00H=未啟用的設(shè)備方式, 01H=已啟用的設(shè)備方式并且使用外部固件模式, 02H=已啟用的設(shè)備方式并且使用內(nèi)置固件模式, 03H=已啟用的設(shè)備方式并且使用中斷端點(diǎn)和內(nèi)置固件模式 */ /* 04H=未啟用的主機(jī)方式, 05H=已啟用的主機(jī)方式, 06H=已啟用的主機(jī)方式并且自動(dòng)產(chǎn)生SOF包, 07H=已啟用的主機(jī)方式并且復(fù)位USB總線 */ /* 輸出: 操作狀態(tài)( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值說(shuō)明操作未完成 ) */

#define CMD_SET_ENDP2 0x18 /* 設(shè)備方式: 設(shè)置USB端點(diǎn)0的接收器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000-就緒ACK, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_SET_ENDP3 0x19 /* 設(shè)備方式: 設(shè)置USB端點(diǎn)0的發(fā)送器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000~1000-就緒ACK, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_SET_ENDP4 0x1A /* 設(shè)備方式: 設(shè)置USB端點(diǎn)1的接收器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000-就緒ACK, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_SET_ENDP5 0x1B /* 設(shè)備方式: 設(shè)置USB端點(diǎn)1的發(fā)送器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000~1000-就緒ACK, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_SET_ENDP6 0x1C /* 設(shè)置USB端點(diǎn)2/主機(jī)端點(diǎn)的接收器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000-就緒ACK, 1101-就緒但不返回ACK, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_SET_ENDP7 0x1D /* 設(shè)置USB端點(diǎn)2/主機(jī)端點(diǎn)的發(fā)送器 */ /* 輸入: 工作方式 */ /* 位7為1則位6為同步觸發(fā)位, 否則同步觸發(fā)位不變 */ /* 位3~位0為事務(wù)響應(yīng)方式: 0000-就緒ACK, 1101-就緒但無(wú)須應(yīng)答, 1110-正忙NAK, 1111-錯(cuò)誤STALL */

#define CMD_GET_TOGGLE 0x0A /* 獲取OUT事務(wù)的同步狀態(tài) */ /* 輸入: 數(shù)據(jù)1AH */ /* 輸出: 同步狀態(tài) */ /* 位4為1則OUT事務(wù)同步, 否則OUT事務(wù)不同步 */

#define CMD_GET_STATUS 0x22 /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ /* 輸出: 中斷狀態(tài) */

#define CMD_UNLOCK_USB 0x23 /* 設(shè)備方式: 釋放當(dāng)前USB緩沖區(qū) */

#define CMD_RD_USB_DATA 0x28 /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊, 并釋放緩沖區(qū) */ /* 輸出: 長(zhǎng)度, 數(shù)據(jù)流 */

#define CMD_WR_USB_DATA3 0x29 /* 設(shè)備方式: 向USB端點(diǎn)0的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ /* 輸入: 長(zhǎng)度, 數(shù)據(jù)流 */

#define CMD_WR_USB_DATA5 0x2A /* 設(shè)備方式: 向USB端點(diǎn)1的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ /* 輸入: 長(zhǎng)度, 數(shù)據(jù)流 */

#define CMD_WR_USB_DATA7 0x2B /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ /* 輸入: 長(zhǎng)度, 數(shù)據(jù)流 */

/* ************************************************************************** */ /* 以下命令用于USB主機(jī)方式, 只有CH375支持 */

#define CMD_SET_BAUDRATE 0x02 /* 串口方式: 設(shè)置串口通訊波特率 */ /* 輸入: 波特率分頻系數(shù), 波特率分頻常數(shù) */ /* 輸出: 操作狀態(tài)( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值說(shuō)明操作未完成 ) */

#define CMD_ABORT_NAK 0x17 /* 主機(jī)方式: 放棄當(dāng)前NAK的重試 */

#define CMD_SET_RETRY 0x0B /* 主機(jī)方式: 設(shè)置USB事務(wù)操作的重試次數(shù) */ /* 輸入: 數(shù)據(jù)25H, 重試次數(shù) */ /* 位7為1則收到NAK時(shí)無(wú)限重試, 位3~位0為超時(shí)后的重試次數(shù) */

#define CMD_ISSUE_TOKEN 0x4F /* 主機(jī)方式: 發(fā)出令牌, 執(zhí)行事務(wù) */ /* 輸入: 事務(wù)屬性 */ /* 低4位是令牌, 高4位是端點(diǎn)號(hào) */ /* 輸出中斷 */

#define CMD_CLR_STALL 0x41 /* 主機(jī)方式: 控制傳輸-清除端點(diǎn)錯(cuò)誤 */ /* 輸入: 端點(diǎn)號(hào) */ /* 輸出中斷 */

#define CMD_SET_ADDRESS 0x45 /* 主機(jī)方式: 控制傳輸-設(shè)置USB地址 */ /* 輸入: 地址值 */ /* 輸出中斷 */

#define CMD_GET_DESCR 0x46 /* 主機(jī)方式: 控制傳輸-獲取描述符 */ /* 輸入: 描述符類(lèi)型 */ /* 輸出中斷 */

#define CMD_SET_CONFIG 0x49 /* 主機(jī)方式: 控制傳輸-設(shè)置USB配置 */ /* 輸入: 配置值 */ /* 輸出中斷 */

#define CMD_DISK_INIT 0x51 /* 主機(jī)方式: 初始化USB存儲(chǔ)器 */ /* 輸出中斷 */

#define CMD_DISK_RESET 0x52 /* 主機(jī)方式: 復(fù)位USB存儲(chǔ)器 */ /* 輸出中斷 */

#define CMD_DISK_SIZE 0x53 /* 主機(jī)方式: 獲取USB存儲(chǔ)器的容量 */ /* 輸出中斷 */

#define CMD_DISK_READ 0x54 /* 主機(jī)方式: 從USB存儲(chǔ)器讀數(shù)據(jù)塊(以扇區(qū)512字節(jié)為單位) */ /* 輸入: LBA扇區(qū)地址(總長(zhǎng)度32位, 低字節(jié)在前), 扇區(qū)數(shù)(01H~FFH) */ /* 輸出中斷 */

#define CMD_DISK_RD_GO 0x55 /* 主機(jī)方式: 繼續(xù)執(zhí)行USB存儲(chǔ)器的讀操作 */ /* 輸出中斷 */

#define CMD_DISK_WRITE 0x56 /* 主機(jī)方式: 向USB存儲(chǔ)器寫(xiě)數(shù)據(jù)塊(以扇區(qū)512字節(jié)為單位) */ /* 輸入: LBA扇區(qū)地址(總長(zhǎng)度32位, 低字節(jié)在前), 扇區(qū)數(shù)(01H~FFH) */ /* 輸出中斷 */

#define CMD_DISK_WR_GO 0x57 /* 主機(jī)方式: 繼續(xù)執(zhí)行USB存儲(chǔ)器的寫(xiě)操作 */ /* 輸出中斷 */

/* ************************************************************************** */ /* 以下新增的V2.0命令碼, 僅CH372A/CH375A支持 */

#define CMD_GET_IC_VER 0x01 /* 獲取芯片及固件版本 */ /* 輸出: 版本號(hào)( 位7為1, 位6為0, 位5~位0為版本號(hào) ) */ /* CH375返回?zé)o效值為5FH, CH375A返回版本號(hào)的值為0A2H */

#define CMD_ENTER_SLEEP 0x03 /* 進(jìn)入睡眠狀態(tài) */

#define CMD_RD_USB_DATA0 0x27 /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊 */ /* 輸出: 長(zhǎng)度, 數(shù)據(jù)流 */

#define CMD_DELAY_100US 0x0F /* 并口方式: 延時(shí)100uS */ /* 輸出: 延時(shí)期間輸出0, 延時(shí)結(jié)束輸出非0 */

#define CMD_CHK_SUSPEND 0x0B /* 設(shè)備方式: 設(shè)置檢查USB總線掛起狀態(tài)的方式 */ /* 輸入: 數(shù)據(jù)10H, 檢查方式 */ /* 00H=不檢查USB掛起, 04H=以50mS為間隔檢查USB掛起, 05H=以10mS為間隔檢查USB掛起 */

#define CMD_SET_SYS_FREQ 0x04 /* 設(shè)置系統(tǒng)工作頻率 */ /* 輸入: 頻率 */ /* 00H=12MHz, 01H=1.5MHz */

/* ************************************************************************** */ /* 以下改進(jìn)的V2.0命令碼, 用于USB主機(jī)方式, 僅CH375A支持 */

/*#define CMD_SET_RETRY 0x0B*/ /* 主機(jī)方式: 設(shè)置USB事務(wù)操作的重試次數(shù) */ /* 輸入: 數(shù)據(jù)25H, 重試次數(shù) */ /* 位7為0則收到NAK時(shí)不重試, 位7為1位6為0則收到NAK時(shí)無(wú)限重試, 位7為1位6為1則收到NAK時(shí)重試200mS, 位5~位0為超時(shí)后的重試次數(shù) */

/* ******************************************

上面給你發(fā)了的程序是測(cè)試過(guò)了的,只需要將那部分程序放到你的主程序里面去就可以了


關(guān)閉文件的時(shí)候老出現(xiàn)0xB4的錯(cuò)誤。

再說(shuō)我這個(gè)程序改變片選去更新FlashData[]的值,然后再片選CH375送FlashData[]的值到mCmdParam.ByteWrite.mByteBuffer[]寫(xiě)進(jìn)U盤(pán)。能不能行呢?

你們能不能測(cè)試每次這樣改變一下片選,因?yàn)槲业膽?yīng)用程序肯定得改變片選的。


如果是用總線的話,只要地址不沖突就沒(méi)有什么關(guān)系,還有就是你是不是拿我們給你發(fā)的程序來(lái)測(cè)試啊?


我自己加的出錯(cuò)判斷,我想判斷出錯(cuò)的原因。

還有你們的程序測(cè)試過(guò)了嗎?: strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT); strcpy( (char *)( mCmdParam.Create.mPathName, "\\1.TXT" ); 編譯不通過(guò)啊,所以我自己檢查了一下: while(1) { // printf("wait disk in\n"); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt(); // LED_OUT_ACT(); delay(200); for( i=0;i<5;i++ ) { delay(100); // printf(" Ready\n"); if ( CH375DiskReady() == ERR_SUCCESS ) break; } while (DesignFile.SectorProTime<128) { // printf("open\n"); strcpy((char *)mCmdParam.Open.mPathName, "\\1.TXT");

i = CH375FileOpen( ); if (i == ERR_MISS_DIR || i == ERR_MISS_FILE) { // printf("create\n"); strcpy( (char *)mCmdParam.Create.mPathName, "\\1.TXT" );

CH375FileCreate( ); }

else if (i==ERR_SUCCESS) { // printf("locate\n"); mCmdParam.ByteLocate.mByteOffset = 0xffffffff;

i = CH375ByteLocate( ); mStopIfError(i); }

// printf("write\n"); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_HI(FlashData[j+i]); } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 j = CH375ByteWrite( );

DesignFile.SectorProTime++;

mCmdParam.Close.mUpdateLen = 1; CH375FileClose( ); // printf("close\n"); } while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); //printf("take out\n"); }

我修改了幾個(gè)編譯錯(cuò)誤,現(xiàn)在我完全按你們那個(gè)來(lái),程序都運(yùn)行到了while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); ,等待U盤(pán)拔出。此時(shí)拔下U盤(pán),數(shù)據(jù)有時(shí)候沒(méi)寫(xiě)完全,沒(méi)有17K, 寫(xiě)完整的時(shí)候數(shù)據(jù)仍然有誤碼0x00。還有你們這個(gè)等待U盤(pán)拔出能不能不要呢?老在這等不好啊,我程序應(yīng)該退出來(lái)做其他事情。


測(cè)試過(guò)了,沒(méi)問(wèn)題的.等待U盤(pán)拔出可以不用要得. 那你測(cè)試下你的RAM有沒(méi)問(wèn)題,將數(shù)據(jù)寫(xiě)進(jìn)去,再輸出來(lái)看下是不是寫(xiě)進(jìn)去的數(shù)


不能完全寫(xiě)完的時(shí)候程序經(jīng)常停在檢測(cè)中斷引腳的函數(shù)上,寫(xiě)的過(guò)程中也要判斷中斷引腳嗎?


好,我試一下RAM


很奇怪,RAM測(cè)試沒(méi)有問(wèn)題,檢測(cè)DesignFile.SectorProTime計(jì)數(shù)到了128。但是程序還是停在了 void xQueryInterrupt( void ) /* 查詢(xún)CH375中斷并更新中斷狀態(tài) */ { while ( CH375_INT_WIR ); /* 如果CH375的中斷引腳輸出高電平則等待 */ // if (CH375_INT_WIR) return; xWriteCH375Cmd( CMD_GET_STATUS ); /* 獲取當(dāng)前中斷狀態(tài),發(fā)出命令后至少延時(shí)2uS */ CH375IntStatus = xReadCH375Data( ); /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測(cè)到USB設(shè)備斷開(kāi)事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測(cè)到USB設(shè)備連接事件 */ } 函數(shù)的while行。這是什么原因呢? 此時(shí)拔下U盤(pán),在WINDOWS下打開(kāi)。發(fā)覺(jué)文件已損壞,不能打開(kāi)。


你可以這樣看下,你用可以看U盤(pán)物理扇區(qū)的工具看下數(shù)據(jù)有沒(méi)有寫(xiě)錯(cuò),如果沒(méi)有寫(xiě)錯(cuò)的話,那就說(shuō)明沒(méi)什么問(wèn)題,最后打不開(kāi)那只能是你最后的關(guān)閉文件的時(shí)候可能出了什么問(wèn)題


什么工具,可以發(fā)我郵箱嗎:個(gè)人信息保護(hù),已隱藏

另外出了問(wèn)題沒(méi),具體又是什么問(wèn)題呢? 我想請(qǐng)問(wèn)一下:數(shù)據(jù)誤碼的原因一般是什么?而且誤碼全部是0x00?

我剛檢測(cè)了一下RAM,我在寫(xiě)之前這樣檢測(cè)的: for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_HI(FlashData[j+i]); } for (i=0;i if (mCmdParam.ByteWrite.mByteBuffer[i]!=0x55) { while(1); } } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 j = CH375ByteWrite( );

仿真發(fā)覺(jué)程序并沒(méi)有進(jìn)去這個(gè)死循環(huán)。


給你返回的是0X00的話,就說(shuō)明你的程序是操作成功的,庫(kù)給你返回了0X00,如果返回的不是 0X00的話,那就說(shuō)明你操作失敗了,這段函數(shù)這樣測(cè)試: for (i=0;i if (mCmdParam.ByteWrite.mByteBuffer[i]!=0x55) while(1); } 上面的主程序是做了測(cè)試的,往里面寫(xiě)是沒(méi)有什么問(wèn)題的,不過(guò)沒(méi)在AVR單片機(jī)上面測(cè)試,是在51單片機(jī)上面測(cè)試的,但是對(duì)于庫(kù)的操作流程實(shí)際上是一樣的,如果還出現(xiàn)你說(shuō)的那種情況的話,那我懷疑應(yīng)該是你的硬件上面會(huì)不會(huì)出現(xiàn)問(wèn)題


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频