如题。 我的1G优佰特就每次初始化后检测是否连接(写DISK_READY),都返回1F。其他的MP3都行。请教各位大侠该怎么办?
大扇区的U盘暂时不支持(即扇区大于512B)
引用回复:大扇区的U盘暂时不支持(即扇区大于512B) 我用Winhex查看我的U盘,的确是512字节/扇区啊,有没有其他情况导致不能读取的? 当我写DISK_INIT时,U盘的灯会亮,但再写DISK_READY就一直返回1FH。 PS:我的U盘没MBR。 请多指教。
那我想问你下你用的是什么单片机?还有写DISK_INIT以后返回的值是多少?你把那段程序发出来看一下!!
引用回复:那我想问你下你用的是什么单片机?还有写DISK_INIT以后返回的值是多少?你把那段程序发出来看一下!!
我用的是c8051f020单片机,写DISK_INIT后返回0x14. 下面是程序,初步调试中,有点乱,截了前面一段。
void main() { char va[64]; char *pt; unsigned char temp,i; WDTCN = 0xDE;//关看门狗 WDTCN = 0xAD; XBR2 = 0x40;//开交叉开关 Oscillator_Init();外部晶振11.0592 IE=0x80; //开总中断 EIE2|=0x20;//开中断7 CH375HM_INDEX_WR(0x05);//reset all CH375HM_INDEX_WR(0x15);//设置06模式 CH375HM_DATA_WR(0x06); temp=CH375HM_DATA_RD(); while(sta!=0x15);//U盘是否连接
CH375HM_INDEX_WR(0x51);//disk_init while(sta!=0x14);//这里会返回操作成功,0x14 sta=0x1f;//复位状态值 CH375HM_INDEX_WR(0x59);//disk_ready? while(sta!=0x14); //这里一直返回0x1F sta=0x1f; /*下面读00000030扇区*/ CH375HM_INDEX_WR(0x54); CH375HM_DATA_WR(0x30); CH375HM_DATA_WR(0x00); CH375HM_DATA_WR(0x00); CH375HM_DATA_WR(0x00); CH375HM_DATA_WR(0x01); .... .... }
因为你的单片机是高速的,那么可能会出现你说的DISK_READY返回0X1F的情况,所以建议你在disk_init以后,不要立即就写disk_ready,延时几十毫秒的时间再写disk_ready测试一下看看是否可以!
引用回复:因为你的单片机是高速的,那么可能会出现你说的DISK_READY返回0X1F的情况,所以建议你在disk_init以后,不要立即就写disk_ready,延时几十毫秒的时间再写disk_ready测试一下看看是否可以!
我延时了上百ms还是不行,甚至我断点运行,让它在写了DISK_INIT后停了几秒钟在检测还是返回0x1f.还有没有其它原因呢
你的U盘初始化程序处理的太简单了,这样的话很有些U盘支持不起来的。在检测到U盘连接上来之后,你用下面这段程序试一下: UINT8 mInitDisk( void ) { /* 初始化磁盘 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ mDelaymS( 250 ); if(j==5) return(Status); } CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 检查USB 存储设备的错误 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ){ /* 出现错误 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 检查USB 存储设备是否就绪*/ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ } } return( 0 ); /* U盘已经成功初始化 */ }
多谢你的程序,现在已经能读了,原来有些优盘就是老返回没准备好,只要继续读就能读出来. 不过我又遇到个问题,就是只能连续调用两次读扇区函数,调用第二次时优盘灯熄,第三次就根本读不出,下面是程序. 读扇区程序: unsigned char Rd_Sector(unsigned long LBA) { unsigned char sta,i,j,Next_Num=0; unsigned char xdata *pt; sta=0x1f; pt=Data_Buf; CH375HM_INDEX_WR( DISK_READ ); //第三次调用时在这优盘灯就熄了,写完LBA和扇区数后不产生中断. CH375HM_DATA_WR( (unsigned char)LBA ); /* LBA的最低8位 */ CH375HM_DATA_WR( (unsigned char)( LBA >> 8 ) ); CH375HM_DATA_WR( (unsigned char)( LBA >> 16 ) ); CH375HM_DATA_WR( (unsigned char)( LBA >> 24 ) ); /* LBA的最高8位 */ CH375HM_DATA_WR( 1 ); /* 扇区数 */ Delay(); for(i=0;i<8;i++) { sta=Wait_Int(); if(sta==0x1f||sta==0x14) return sta;//读失败 CH375HM_INDEX_WR(RD_USB_DATA); Next_Num=CH375HM_DATA_RD(); for(j=0;j { *pt=CH375HM_DATA_RD(); pt++; } CH375HM_INDEX_WR(DISK_RD_GO); } return 0xff;//读成功 }
下面是读写函数
void CH375HM_INDEX_WR(index) //写指令 {
P2=index; USB_A0=1; P2MDOUT=0xff; USB_RD=1;
USB_CS=0; USB_WR=0; Delay(); USB_WR=1;//具体一点是在这,灯熄了 USB_CS=1; USB_A0=1; P2=0xff; } void CH375HM_DATA_WR(Data) //写数据 { P2=Data; P2MDOUT=0xff; USB_A0=0; USB_CS=0; USB_WR=0; Delay(); USB_WR=1; USB_CS=1; USB_A0=1; P2=0xff; }
unsigned char CH375HM_DATA_RD(void) //读数据 { unsigned char m; P2MDOUT=0x00; USB_A0=0; USB_CS=0; USB_RD=0; Delay(); m=P2; USB_RD=1; USB_CS=1; USB_A0=1; return (m); }
有没有什么问题?多指教.
我已经找出原因了,原来是读完所有512字节后没有去响应最后一次中断,把循环次数该为9次就行了.