IC:CH374 请问:调用CH374Lib中的哪个函数能查询到U盘是否写保护?
在库里面没有提供这个函数,但你可以参考EXAM12,这个例子有检查U盘是否写保护的函数。
/* 检查U盘是否写保护, 返回ERR_SUCCESS说明可以写,返回0xFF说明只读/写保护,返回其它值说明是错误代码 */ /* 其它BulkOnly传输协议的命令可以参考这个例子处理,修改前必须了解USB MassStorage和SCSI规范 */ UINT8 IsDiskWriteProtect( void ) { UINT8 mLength, mStatus, mDevSpecParam; mLength = 0x10; mBOC.mCBW.mCBW_Flag = 0x80; /* 传输方向为输入 */ if ( CH374vRetryCount & (1<<5) ) { /* 根据子类选择命令码,位5为1则USB存储设备的子类为6 */ mBOC.mCBW.mCBW_DataLen0 = mLength; /* 数据传输长度 */ mBOC.mCBW.mCBW_CB_Len = 0x06; /* 命令块长度 */ mBOC.mCBW.mCBW_CB_Buf[0] = 0x1A; /* 命令块首字节, 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; /* 数据传输长度 */ mBOC.mCBW.mCBW_CB_Len = 0x0A; /* 命令块长度 */ mBOC.mCBW.mCBW_CB_Buf[0] = 0x5A; /* 命令块首字节, 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( ); /* 执行基于BulkOnly协议的命令,对USB存储器执行MODE SENSE命令 */ if ( mStatus == ERR_SUCCESS ) { /* 操作成功 */ mLength -= mBOC.mCBW.mCBW_DataLen0; /* 操作成功后mBOC.mCBW.mCBW_DataLen0为剩余长度,计算得到实际传输长度 */ if ( mLength > 3 ) { /* MODE SENSE命令返回数据的长度有效 */ if ( CH374vRetryCount & (1<<5) ) mDevSpecParam = *(pDISK_BASE_BUF+2); /* MODE SENSE(6), device specific parameter */ else mDevSpecParam = *(pDISK_BASE_BUF+3); /* MODE SENSE(10), device specific parameter */ if ( mDevSpecParam & 0x80 ) return( 0xFF ); /* U盘写保护 */ else return( ERR_SUCCESS ); /* U盘没有写保护 */ } return( ERR_USB_DISK_ERR ); } mLength = 0x12; /* 如果真的需要REQUEST SENSE命令的返回数据,那么此处的长度必须大于0x12 */ mBOC.mCBW.mCBW_Flag = 0x80; mBOC.mCBW.mCBW_DataLen0 = mLength; mBOC.mCBW.mCBW_CB_Len = 0x06; /* 命令块长度 */ 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( ); /* 执行基于BulkOnly协议的命令,对USB存储器执行REQUEST SENSE命令 */ return( mStatus ); } 这个是判断是否写保护的程序,具体的你可以参考MCS51下面的EXAM12
谢谢两位,已经找到了