郁悶了,客戶拿過4個1G的U盤全都不支持

我說明書里寫的支持98%以上的U盤,這是官方的說法啊,這下可好,客戶拿這個朝我們開刀。其中一個是KINGSTON的1G的。現(xiàn)象就是:能認U盤,但初始化時讀數(shù)據(jù)不來中斷,死機。我把讀中斷的程序改了一下不是死循環(huán),不死機,但讀不出數(shù)據(jù)。

512M的倒沒見過什么問題,希望相關人能給個說法


如果你是使用我們庫操作U盤的話,那么建議你到我們公司網(wǎng)站上面去更新下庫和頭文件應該這種型號的U盤應該就支持了,如果不是使用庫的話而是直接操作U盤物理扇區(qū)的話,那么可能需要看下你的初始化程序。


unsigned char InitDisk(void) { unsigned char FFDD=0; //是否成功標志位 0不成功,1成功 unsigned char stat; unsigned char i,j; WriteCmd(CMD_GET_STATUS); stat = ReadData(); if(stat == USB_INT_DISCONNECT) { } //USB設備斷開,提示插入U盤error_handle1(); WriteCmd(CMD_DISK_INIT); //初始化USB存儲器 stat = GetInt(); if(stat != USB_INT_SUCCESS) //初始化不成功 { return(0); } for(i=0;i<200;i++) //讀取容量 { WriteCmd(CMD_DISK_SIZE); //獲取USB存儲器容量 stat = GetInt(); if(stat == USB_INT_SUCCESS) {FFDD=1; break; } //讀取成功則退出 } if(FFDD==1) { WriteCmd(CMD_RD_USB_DATA); i = ReadData(); for(; i > 0; i--) ReadData(); //容量數(shù)據(jù),參看數(shù)據(jù)手冊5-6 } return(FFDD); }

U盤初始化程序,幫著看看吧,好象是你們庫里面的


void CH375_INIT(void) //CH375相關的初始化 { unsigned char i,c; PORTC |= RST_CH; //復位CH375 delay_ms(400); PORTC &= ~RST_CH; delay_ms(400); WriteCmd(CMD_RESET_ALL); //執(zhí)行硬件復位 ///////////// delay_ms(200); ///////////// WriteCmd(CMD_CHECK_EXIST); //工作測試,送5A正確應該讀到A5 WriteData(0x57); i = ReadData(); if(i != 0xA8) //工作不正常 { error_handle2(); } //如初始化未成功,void error_handle2(void) WriteCmd(CMD_SET_USB_MODE); // 初始化CH375,設置USB工作模式 WriteData(6); // 模式代碼,自動檢測USB設備連接 6 }

CH375的初始化


你在哪一步出問題了


哪一步? 怎么官方不給個說法??? 要不就干脆說CH375不支持,這樣我也好跟客戶交代


按照如果你操作物理扇區(qū)的話,我們可以提供給你例子程序,如果需要的話,可以直接發(fā)送E-MAIL到tech@wch.cn,我們會即時給你回例子程序的。同時你也需要看下你的程序停在什么地方了,這個并不是我們375芯片支持不支持的問題,這個估計和你軟件上面有關系,我們需要你的程序停在什么地方。然后根據(jù)你的現(xiàn)象來做相應的處理操作


程序死在等待中斷那里了,已確認。 讀數(shù)據(jù)不來中斷


那要是這樣的話,你可以在中斷上面加超時,當超時完之后,你可以將芯片復位在進行初始化。


比較老點的U盤,可能去年生產(chǎn)的吧,包括一些特別老的MP3,插上去都能認,沒問題,就是這些新出的U盤,特別是牌子的,大U盤,一般都會出問題,搞得客戶一直給我們打電話詢問,因為我們的說明書上是照你們官方的說法:支持市面上90%以上的U盤。結(jié)果其中一個客戶買了4個U盤,不同牌子的,全都不支持。這些都是高速U盤,我覺得可能跟這個有關系。


我試過加超時,用10000個指令周期等待中斷來,無中斷則繼續(xù)進行沒返回錯誤。這樣可以不死機,但讀不出數(shù)據(jù)。

這個問題我也不想解決了,打算在網(wǎng)站上發(fā)布一條公告,告訴客戶買差一點的U盤就可以了。


你可以拿下面的程序去更新下看可以不可以操作U盤:

/* CH375作為USB主機接口的程序示例 */

/* MCS-51單片機C語言的示例程序, U盤數(shù)據(jù)讀寫 */

#include #include #include

#define MAX_SECTOR_SIZE 4096 /* 以512字節(jié)每扇區(qū)為主,部分有2K字節(jié)每扇區(qū),最大為4K字節(jié) */

/* 定義CH375命令代碼及返回狀態(tài) */ #include "CH375INC.H" /* CH375特性 */ #define CH375_BLOCK_SIZE 64 /* CH375 maximum data block size */

/* 以下定義適用于MCS-51單片機,其它單片機參照修改,為了提供C語言的速度需要對本程序進行優(yōu)化 */ #include unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ unsigned char xdata DATA_BUFFER[ MAX_SECTOR_SIZE ] _at_ 0x0000; /* 外部RAM數(shù)據(jù)緩沖區(qū)的起始地址,長度不少于一次讀寫的數(shù)據(jù)長度 */ sbit CH375_INT_WIRE = 0xB0^2; /* P3.2, INT0, 連接CH375的INT#引腳,用于查詢中斷狀態(tài) */

unsigned short BytePerSector; /* 每扇區(qū)字節(jié)數(shù),扇區(qū)大小 */ unsigned char BlockPerSector; /* 每扇區(qū)塊數(shù),指CH375讀寫時的塊 BlockPerSector=BytePerSector/CH375_BLOCK_SIZE */ #define UINT8 unsigned char unsigned char CH375IntStatus; unsigned short SectorSize; #define USB_BO_CBW_SIZE 0x1f #define SPC_CMD_READ10 0x28 #define SPC_CMD_WRITE10 0x2a

/* 在P1.4連接一個LED用于監(jiān)控演示程序的進度,低電平LED亮,當U盤插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動LED顯示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動LED顯示 */

/* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }

/* 延時1微秒,不精確 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }

/* 延時毫秒,不精確 */ void mDelaymS( unsigned char cnt ) { unsigned char i, c; while ( cnt -- ) { for ( i = 250; i != 0; i -- ) c+=3; } }

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ CH375_DAT_PORT=dat; delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ }

unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ return( CH375_DAT_PORT ); }

void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { unsigned char i; for ( i = 0xffff; CH375_INT_WIRE != 0; i -- ) { /* 如果CH375的中斷引腳輸出高電平則等待 */ if ( CH375_INT_WIRE == 0 ) break; if ( CH375_INT_WIRE == 0 ) break; if ( CH375_INT_WIRE == 0 ) break; if ( ( i >> 8 ) == 0 ) { if ( i == 0 ) { CH375_CMD_PORT = CMD_RESET_ALL; } else if ( ( i & 0xFF ) == 0xFF ) CH375_CMD_PORT = CMD_ABORT_NAK; } } CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當前中斷狀態(tài) */ delay1us();delay1us(); CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ }

/* 發(fā)出命令及一個數(shù)據(jù)并等待狀態(tài),成功返回ERR_SUCCESS */ static void Write_Cmd_Port( UINT8 iDat, UINT8 iCmd ) { CH375_WR_CMD_PORT( iCmd ); CH375IntStatus = 0; /* 清操作完成的中斷狀態(tài) */ CH375_WR_DAT_PORT( iDat ); xQueryInterrupt( ); /* 查詢方式,查詢中斷狀態(tài) */ if ( CH375IntStatus == 0x00 ) CH375IntStatus = 0x10; /* 意外的USB錯誤 */ else if ( CH375IntStatus == USB_INT_SUCCESS ) CH375IntStatus = 0x00; /* 操作成功 */ }

/* 等待CH375中斷并獲取狀態(tài) */ unsigned char mWaitInterrupt() { /* 主機端等待操作完成, 返回操作狀態(tài) */ while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ return( CH375_RD_DAT_PORT( ) ); }

/* 設置CH375為USB主機方式 */ unsigned char mCH375Init( ) { unsigned char i; #ifdef TEST_CH375_PORT unsigned char c; CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試工作狀態(tài) */ CH375_WR_DAT_PORT( 0x55 ); /* 測試數(shù)據(jù) */ c = CH375_RD_DAT_PORT( ); /* 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 */ if ( c != 0xaa ) { /* CH375出錯 */ for ( i = 100; i != 0; i -- ) { /* 強制數(shù)據(jù)同步 */ CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* CH375執(zhí)行硬件復位 */ c = CH375_RD_DAT_PORT( ); /* 延時 */ } mDelaymS( 50 ); /* 延時至少30mS */ } #endif CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 設置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代碼,自動檢測USB設備連接 */ for ( i = 0xff; i != 0; i -- ) /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /* 操作成功 */ if ( i != 0 ) return( 0 ); /* 操作成功 */ else return( 0xff ); /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */ }

/* 執(zhí)行基于BulkOnly協(xié)議的扇區(qū)讀寫命令 */ /* 入口: IsRead 非0是讀操作,否則是寫操作 */ /* SecCount 讀寫扇區(qū)數(shù) */ unsigned char mBocCbwOutStart( unsigned char IsRead, unsigned char SecCount, unsigned long SecLba ) { unsigned char TempVar,i; CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_UDISK_DSK_LUN ); TempVar = CH375_RD_DAT_PORT( ); CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375IntStatus = 0; /* 清操作完成的中斷狀態(tài) */ CH375_WR_DAT_PORT( USB_BO_CBW_SIZE ); /* 后續(xù)數(shù)據(jù)的長度 */ CH375_WR_DAT_PORT( 'U' ); CH375_WR_DAT_PORT( 'S' ); CH375_WR_DAT_PORT( 'B' ); CH375_WR_DAT_PORT( 'C' ); CH375_WR_DAT_PORT( 0x03 ); CH375_WR_DAT_PORT( 0x07 ); CH375_WR_DAT_PORT( 0x05 ); CH375_WR_DAT_PORT( 0x0A ); CH375_WR_DAT_PORT( 0x00 ); /* 數(shù)據(jù)傳輸長度 */ CH375_WR_DAT_PORT( (unsigned char)( SecCount * (unsigned short)( SectorSize >> 8 ) ) ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( IsRead ? 0x80 : 0x00 ); /* 傳輸方向等標志 */ CH375_WR_DAT_PORT( TempVar ); /* 當前邏輯單元號 */ CH375_WR_DAT_PORT( 0x0A ); /* 命令塊長度 */ CH375_WR_DAT_PORT( IsRead ? SPC_CMD_READ10 : SPC_CMD_WRITE10 ); /* 命令碼 */ CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( SecLba >> 24 ); CH375_WR_DAT_PORT( SecLba >> 16 ); CH375_WR_DAT_PORT( SecLba >> 8 ); CH375_WR_DAT_PORT( SecLba ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( SecCount ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); CH375_WR_DAT_PORT( 0x00 ); /* UFI操作 */ CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_UDISK_TOGGLE ); TempVar = CH375_RD_DAT_PORT( ); CH375_WR_CMD_PORT( CMD_WRITE_REG ); CH375_WR_DAT_PORT( SFR_USB_H_ENDP ); CH375_WR_DAT_PORT( TempVar ); CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_UDISK_BULK_OUT ); i = CH375_RD_DAT_PORT( ); Write_Cmd_Port( i, CMD_ISSUE_TOKEN ); /* 獲取USB盤的OUT端點,向USB盤的OUT端點輸出CBW */ CH375_WR_CMD_PORT( CMD_WRITE_REG ); CH375_WR_DAT_PORT( VAR_UDISK_TOGGLE ); CH375_WR_DAT_PORT( TempVar ^ 0x40 ); if ( CH375IntStatus != 0x00 ) { /* 發(fā)送CBW失敗,復位USB磁盤 */ TempVar = CH375IntStatus; CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_UDISK_BULK_IN ); i = CH375_RD_DAT_PORT( )>>4 | 0x80; Write_Cmd_Port( i | 0X80, CMD_CLR_STALL ); /* 清除IN端點錯誤 */ CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_UDISK_BULK_OUT ); i = CH375_RD_DAT_PORT( )>>4 | 0x80; Write_Cmd_Port( i, CMD_CLR_STALL ); /* 清除OUT端點錯誤 */ return( CH375IntStatus = TempVar ); /* 返回原錯誤碼 */ } CH375_WR_CMD_PORT( CMD_WRITE_REG ); CH375_WR_DAT_PORT( VAR_UDISK_SECTORS ); CH375_WR_DAT_PORT( SecCount * ( SectorSize >> 9 ) ); CH375_WR_CMD_PORT( CMD_WRITE_REG ); CH375_WR_DAT_PORT( VAR_UDISK_PKT_CNT ); CH375_WR_DAT_PORT( 0x08 ); CH375_WR_CMD_PORT( CMD_READ_REG ); CH375_WR_DAT_PORT( VAR_SYS_FLAG ); i = CH375_RD_DAT_PORT( ) | BIT_USB_DISK_CMD; CH375_WR_CMD_PORT( CMD_WRITE_REG ); CH375_WR_DAT_PORT( VAR_SYS_FLAG );


只有登錄才能回復,可以選擇微信賬號登錄

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