高手们: 用CH375来读U盘,对于大部分U盘都能读,但有的U盘(我试了几个MP4都是这样)要想读出的话,必须在U盘插入之后立即初始化,才能读出来,否则就会显示无U盘插入 部分程序如下: //初始化U盘 //初始化U盘实际就是识别U盘的类型, 该操作不影响U盘中的数据 uint8 CH375_IniDisk(void) { uint8 i,mIntStatus; uint16 U_BytePerSector; CH375_WriteCMD(RESET_ALL); //复位全部 CH375_DelayNms(200); //延时40ms CH375_DelayNms(200); //延时40ms CH375_WriteCMD(CHECK_EXIST); //检查芯片是否存在 CH375_WriteDAT(0x55); //填数据0x55 取反为0xaa
if(CH375_ReadDAT()!= 0xaa) {return 1;}//不存在则退出 //////////////////////////////////// CH375_WriteCMD(SET_USB_MODE); //设置CH375模式
CH375_WriteDAT( HOST_RESET_BUS); // 7 delay_us(20);//_delay_us(40); CH375_WriteCMD(SET_USB_MODE); //设置CH375模式 delay_us(20); CH375_WriteDAT(HOST_ACTIVE_EOF); //主机模式,自动产生EOF 0x06
delay_us(20);//_delay_us(40); //延时20us for ( i = 0xff; i != 0; i -- ) /* 等待操作成功,通常需要等待10uS-20uS */ { mIntStatus=CH375_ReadDAT(); if ( mIntStatus == CMD_RET_SUCCESS ) break; /* 操作成功 */ } /////////////////////////////////////////////以上: 初始化CH375
CH375_DelayNms(200); CH375_WriteCMD(GET_STATUS); //延时500ms让U盘准备好 if(CH375_WaitInterrupt_NEW() == USB_INT_DISCONNECT){return 1;}//不成功则退出 CH375_WriteCMD(DISK_INIT); //初始化U盘 CH375_DelayNms(200); //延时500ms让U盘准备好 CH375_WriteCMD(GET_STATUS); // mIntStatus= CH375_WaitInterrupt_NEW(); if(mIntStatus != USB_INT_SUCCESS){return 1;}//不成功则退出 ///////////////////////////// CH375_WriteCMD( DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = CH375_WaitInterrupt_NEW( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */ CH375_DelayNms(200); CH375_WriteCMD( DISK_SIZE ); /* 获取USB存储器的容量 */
mIntStatus = CH375_WaitInterrupt_NEW( ); /* 等待中断并获取状态 */ } if ( mIntStatus!= USB_INT_SUCCESS ) return 1 ; /* 出现错误 */ //////////////////////////////// CH375_WriteCMD( RD_USB_DATA ); i = CH375_ReadDAT( ); /* 后续数据的长度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */ for ( i = 0; i != 8; i ++ ) { /* 根据长度读取数据 */ DATA_BUFFER[ i ] = CH375_ReadDAT( ); /* 读出数据并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盘容量数据中的每扇区字节数,大端格式 */ if ( i == 0x04 ) U_BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是1K字节 */ else if ( i == 0x08 ) U_BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是2K字节 */ else if ( i == 0x10 ) U_BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是4K字节 */ else U_BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默认的磁盘的物理扇区是512字节 */ U_BytePerSector = U_BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ CH375_WriteCMD( CMD_SET_PKT_P_SEC ); /* 设置USB存储器的每扇区数据包总数 */ CH375_WriteDAT( 0x39 ); CH375_WriteDAT( U_BlockPerSector ); /* 设置每扇区数据包总数 */ //LLM CH375_CS_H; return 0; //正常返回0 }