我用的是374T,單片機(jī)用的是ARM2214,用的是咱們公司提供CH374的U盤文件讀寫子程序庫(kù). 現(xiàn)在測(cè)試了幾個(gè)U盤,讀寫都可以,但如果對(duì)于有些U盤,是磁盤結(jié)構(gòu)的,374能連接上,也能查到容量是多少,但就是不能建文件和讀寫, 還有一種是手機(jī)的小型擴(kuò)展卡,也不能識(shí)別出來(lái), 另外一種是SD卡,都是USB接口,目前這三種類型的卡我的識(shí)別不出來(lái),識(shí)別其它U盤還可以,不知是程序庫(kù)不支持還是我這方面程序沒有調(diào)好呢,請(qǐng)指點(diǎn)
采用我們子程序庫(kù)的話,那你需要看下你的程序停在什么位置以及返回的錯(cuò)誤代碼是多少,這樣才能根據(jù)這個(gè)來(lái)判斷出是什么問(wèn)題。
以上現(xiàn)在都能正確讀寫了,原來(lái)我在程序中加了一個(gè)U盤判斷是否寫保護(hù),如果寫保護(hù)就一直在等待關(guān)閉寫保護(hù).因?yàn)樯厦嫣岬降娜N盤都沒有寫保護(hù),這所以認(rèn)為寫保護(hù)打開著,一直處于等待狀態(tài),
我們的程序能否判斷U盤是否有寫保護(hù)這一項(xiàng).如果有寫保護(hù)則判斷寫保護(hù)是否打開?如果判斷此盤沒有設(shè)置寫保護(hù)這一項(xiàng)則程序跳過(guò)寫保護(hù)這一項(xiàng),不去判斷.不知我們的程序有沒有這一項(xiàng)功能呢,多謝
子程序庫(kù)中沒有直接判斷U盤是否寫保護(hù)的函數(shù),如果你想實(shí)現(xiàn)這個(gè)功能,需要自行添加一些額外的程序,且要涉及到BulkOnly傳輸協(xié)議以及SCSI命令集,比較繁瑣。 可以參考CH375EVT.ZIP中..\PUB\MCS51C\FILELIB4\EXAM12
你理解錯(cuò)我的意思了,我的意思是,我們有沒有檢測(cè)U盤硬件是否有寫保護(hù)的拔碼,像有的U盤硬件上有這一樣,如果程序檢測(cè)出來(lái)有這個(gè)功能,就要去檢測(cè)是否寫保護(hù)打開或關(guān)閉.如果程序檢測(cè)到U盤本身硬件沒有寫保護(hù)那個(gè)拔碼,程序向下執(zhí)行時(shí)不需要再去判斷是否寫保護(hù)打開或關(guān)閉了 剛我試的盤就是由于硬件上沒有寫保護(hù),而我的程序里判斷是否寫保護(hù),結(jié)果,程序不向下運(yùn)行, 如: 手機(jī)上的擴(kuò)展卡,沒有寫保護(hù)拔碼.如果我在程序里面去判斷是否寫保護(hù),結(jié)果會(huì)認(rèn)為寫保護(hù)一直打開的,無(wú)法創(chuàng)文件,而事實(shí)是根本就沒有寫保護(hù), 又如: 有些U盤有這保護(hù)這一項(xiàng),如果我在程序里面加有判斷寫保護(hù)這一項(xiàng)會(huì)給用戶一個(gè)提醒,寫保護(hù)打開著, 現(xiàn)在是如果程序能檢測(cè)出此盤硬件是否有寫保護(hù)這一項(xiàng),而根據(jù)判斷去執(zhí)行相應(yīng)的程序.如何讓硬件本身有寫保護(hù)的盤和無(wú)寫保護(hù)的盤共存呢 謝謝了呀
U盤有沒有寫保護(hù)的功能是無(wú)法檢測(cè)到的.只能檢測(cè)是不是被寫保護(hù)了.您可以這樣做,在寫之前檢測(cè)有沒有被寫保護(hù),如果被寫保護(hù)的話給客戶提醒.
實(shí)際上不論U盤有沒有撥碼,即使有撥碼的話,我們也可以通過(guò)軟件上面來(lái)識(shí)別是否寫保護(hù),簡(jiǎn)單點(diǎn)理解就是,當(dāng)一個(gè)U盤處于寫保護(hù)的時(shí)候的話,在做初始化函數(shù)的時(shí)候是可以判斷其已經(jīng)寫保護(hù)了的。也就是通過(guò)軟件來(lái)判斷是否寫保護(hù)。即使象你所說(shuō),沒有寫保護(hù)撥碼的話,按照正常的判斷的話,是不會(huì)認(rèn)為寫保護(hù)一直打開著的,除非你的判斷方法有問(wèn)題。至于怎么判斷你可以按照3樓的方法來(lái)進(jìn)行判斷了。
UINT8 IsDiskWriteProtect( void ) { UINT8 mLength, mStatus, mDevSpecParam; mLength = 0x10; mBOC.mCBW.mCBW_Flag = 0x80; /* 傳輸方向?yàn)檩斎?*/ if ( CH374vRetryCount & (1<<5) )/* 根據(jù)子類選擇命令碼,位5為1則USB存儲(chǔ)設(shè)備的子類為6 */ { mBOC.mCBW.mCBW_DataLen0 = mLength; /* 數(shù)據(jù)傳輸長(zhǎng)度 */ mBOC.mCBW.mCBW_CB_Len = 0x06; /* 命令塊長(zhǎng)度 */ mBOC.mCBW.mCBW_CB_Buf[0] = 0x1A; /* 命令塊首字節(jié), MODE SENSE(6) */ mBOC.mCBW.mCBW_CB_Buf[1] = 0x00; mBOC.mCBW.mCBW_CB_Buf[2] = 0x3F; mBOC.mCBW.mCBW_CB_Buf[3] = 0x00; mBOC.mCBW.mCBW_CB_Buf[4] = mLength; mBOC.mCBW.mCBW_CB_Buf[5] = 0x00; } else { mBOC.mCBW.mCBW_DataLen0 = mLength; /* 數(shù)據(jù)傳輸長(zhǎng)度 */ mBOC.mCBW.mCBW_CB_Len = 0x0A; /* 命令塊長(zhǎng)度 */ mBOC.mCBW.mCBW_CB_Buf[0] = 0x5A; /* 命令塊首字節(jié), MODE SENSE(10) */ mBOC.mCBW.mCBW_CB_Buf[1] = 0x00; mBOC.mCBW.mCBW_CB_Buf[2] = 0x3F; mBOC.mCBW.mCBW_CB_Buf[3] = 0x00; mBOC.mCBW.mCBW_CB_Buf[4] = 0x00; mBOC.mCBW.mCBW_CB_Buf[5] = 0x00; mBOC.mCBW.mCBW_CB_Buf[6] = 0x00; mBOC.mCBW.mCBW_CB_Buf[7] = 0x00; mBOC.mCBW.mCBW_CB_Buf[8] = mLength; mBOC.mCBW.mCBW_CB_Buf[9] = 0x00; } mStatus = CH374BulkOnlyCmd( ); /* 執(zhí)行基于BulkOnly協(xié)議的命令,對(duì)USB存儲(chǔ)器執(zhí)行MODE SENSE命令 */ if ( mStatus == ERR_SUCCESS ) /* 操作成功 */ { mLength -= mBOC.mCBW.mCBW_DataLen0; /* 操作成功后mBOC.mCBW.mCBW_DataLen0為剩余長(zhǎng)度,計(jì)算得到實(shí)際傳輸長(zhǎng)度 */ if ( mLength > 3 ) { /* MODE SENSE命令返回?cái)?shù)據(jù)的長(zhǎng)度有效 */ if ( CH374vRetryCount & (1<<5) ) mDevSpecParam = *(pDISK_BASE_BUF+2); else mDevSpecParam = *(pDISK_BASE_BUF+3); /* MODE SENSE(10), device specific parameter */ if ( mDevSpecParam & 0x80 ) return( 0xFF ); /* U盤寫保護(hù) */ else return( ERR_SUCCESS ); /* U盤沒有寫保護(hù) */ } return( ERR_USB_DISK_ERR ); } mLength = 0x12; /* 如果真的需要REQUEST SENSE命令的返回?cái)?shù)據(jù),那么此處的長(zhǎng)度必須大于0x12 */ mBOC.mCBW.mCBW_Flag = 0x80; mBOC.mCBW.mCBW_DataLen0 = mLength; mBOC.mCBW.mCBW_CB_Len = 0x06; /* 命令塊長(zhǎng)度 */ mBOC.mCBW.mCBW_CB_Buf[0] = SPC_CMD_REQUEST_SENSE; mBOC.mCBW.mCBW_CB_Buf[1] = 0; mBOC.mCBW.mCBW_CB_Buf[2] = 0; mBOC.mCBW.mCBW_CB_Buf[3] = 0; mBOC.mCBW.mCBW_CB_Buf[4] = mLength; mBOC.mCBW.mCBW_CB_Buf[5] = 0; CH374BulkOnlyCmd( ); /* 執(zhí)行基于BulkOnly協(xié)議的命令,對(duì)USB存儲(chǔ)器執(zhí)行REQUEST SENSE命令 */ return( mStatus ); }
上面就是我用于檢測(cè)U盤是否寫保護(hù)的程序,單片機(jī)LPC2292+374T,現(xiàn)在的問(wèn)題是對(duì)于有寫保護(hù)這一項(xiàng)功能的盤來(lái)說(shuō)一切是正常的,如寫保護(hù)打開關(guān)閉都能檢測(cè)到的,而對(duì)于硬件沒有寫保護(hù)這一項(xiàng)功能的盤來(lái)說(shuō),程序執(zhí)行到上面程序里面就死了,不知死到哪了,沒有返回值,也不向下執(zhí)行,這是為什么呢.
我們測(cè)試都是可以正確返回的.我們大概測(cè)試了十幾個(gè)不同型號(hào)的不帶寫保護(hù)功能的U盤,你檢測(cè)一下程序在什么地方死掉了,用的什么牌子的U盤?
我用了三種類型的,一種是磁盤型的U盤,另一個(gè)是USB接口的SD卡,另一個(gè)是手機(jī)小型的擴(kuò)展卡,都不行的.能不能發(fā)一個(gè)你們測(cè)試好的判斷USB寫保護(hù)的子程序到我信箱呀,你們的子程序和我上面的一樣嗎,我的為什么不行呢,我用的是ARM,難道是大小端的問(wèn)題,但為什么帶有寫保護(hù)功能的U盤就一切OK呢.不明白.郵箱:個(gè)人信息保護(hù),已隱藏 麻煩你了,我上面的程序是仿51單片機(jī)的,
mStatus = CH374BulkOnlyCmd( ); /* 執(zhí)行基于BulkOnly協(xié)議的命令,對(duì)USB存儲(chǔ)器執(zhí)行MODE SENSE命令 */ 剛我防真一下,程序執(zhí)行到邊里面,一直處于判斷中斷和去讀寫374T,具體為什么,我不清楚, 但用一個(gè)帶有寫保護(hù)的U盤一下子就返回了,沒有一直停滯不前在 CH374BulkOnlyCmd( );這里面;麻煩了
對(duì)于硬件上沒有寫保護(hù)功能的盤就一直在下面程序循環(huán) void xQueryInterrupt( void ) /* 查詢CH374中斷 */ { #ifdef CH374_INT_WIRE /* 連接了CH374的中斷引腳 */ . while ( CH374_INT_WIRE ); /* 如果CH374的中斷引腳輸出高電平則等待 */ #else /* 未連接CH374的中斷引腳 */ while ( ( CH374_READ_REGISTER( REG_INTER_FLAG ) & ( BIT_IF_DEV_DETECT | BIT_IF_TRANSFER ) ) == 0 ); /* 查詢中斷標(biāo)志寄存器 */ #endif } 執(zhí)行到查詢中斷后,開始執(zhí)行
UINT8 CH374_READ_REGISTER( UINT8 mAddr ) /* 外部定義的被CH374程序庫(kù)調(diào)用的子程序,從指定寄存器讀取數(shù)據(jù) */ ? { Write374Index( mAddr ); e return( Read374Data( ) ); H3 }
void Write374Index( UINT8 mIndex ) /* 向CH374寫索引地址 */ {
CH374_IDX_PORT = mIndex;
要避免上面出現(xiàn)死循環(huán)的話,你可以在等待函數(shù)里面加一個(gè)超時(shí)。這樣的話就不會(huì)出現(xiàn)死機(jī)的現(xiàn)象。但是我們這邊測(cè)試的時(shí)候是沒有出現(xiàn)你說(shuō)的現(xiàn)象,你可以把U盤型號(hào)告訴我們或者把U盤寄給我們,我們來(lái)測(cè)試下看可以不可以。同時(shí),你是用查詢中斷引腳的方式還是去查詢寄存器的方式,你可以在單步執(zhí)行這個(gè)命令之后,去判斷下中斷引腳有沒有變低。
我們測(cè)試用的代碼和你用的是一樣的,當(dāng)U盤不支持寫功能時(shí),可能有及少數(shù)U盤不支持上述命令,但是函數(shù)會(huì)返回操作錯(cuò)誤的代碼.但是測(cè)試中大部分的U盤還是能夠支持這個(gè)命令的.
中斷腳變低, 在執(zhí)行U盤寫保護(hù)判斷時(shí),如果帶有寫保護(hù)功能的盤,在執(zhí)行mStatus = CH374BulkOnlyCmd( );后mStatus = ERR_SUCCESS直接執(zhí)行IF里面的語(yǔ)句直接返回一個(gè)有用值 ,而沒有寫保護(hù)功能的盤得到的返回值mStatus 等于0X2E,沒有去執(zhí)行IF里面的程序,而是執(zhí)行mLength = 0x12;下面的程序,正常是執(zhí)行IF里面的程序直接返回,而沒有寫保護(hù)功能的盤沒有執(zhí)行IF里面的程序,而執(zhí)行正常不應(yīng)該執(zhí)行的程序了,我感覺應(yīng)該是我程序的問(wèn)題,因?yàn)槲以嚵巳N類型的不帶寫保護(hù)的盤都不行,這是為什么呢
mStatus = CH374BulkOnlyCmd( ); /* 執(zhí)行基于BulkOnly協(xié)議的命令,對(duì)USB存儲(chǔ)器執(zhí)行MODE SENSE命令 */ if ( mStatus == ERR_SUCCESS ) { /* 操作成功 */ mLength -= mBOC.mCBW.mCBW_DataLen0; if ( mLength > 3 ) { /* MODE SENSE命令返回?cái)?shù)據(jù)的長(zhǎng)度有效 */ if ( CH374vRetryCount & (1<<5) ) mDevSpecParam = *(pDISK_BASE_BUF+2); /* MODE SENSE(6), device specific parameter */ else mDevSpecParam = *(pDISK_BASE_BUF+3); if ( mDevSpecParam & 0x80 ) return( 0xFF ); /* U盤寫保護(hù) */ else return( ERR_SUCCESS ); /* U盤沒有寫保護(hù) */ } return( ERR_USB_DISK_ERR ); }
mLength = 0x12; /* 如果真的需要REQUEST SENSE命令的返回?cái)?shù)據(jù),那么此處的長(zhǎng)度必須大于0x12 */