我想编写USB设备枚举过程的代码,CH375B为06H的USB主机方式,如果使用 CMD_DISK_INIT命令,枚举过程工作正常,可以读取U盘的容量.而使用自己 编写的代码,虽然各个命令的中断返回USB_INT_SUCCESS,但不能读取U盘 容量,下面是枚举过程用到的部分代码,CH375B检测到设备插入后,调用 EnumDevice().希望各位高手帮忙,指教.
#define CMD_375 XBYTE [0x8100] #define DATA_375 XBYTE [0x8000] #define uchar unsigned char #define uint unsigned int #define USB_MODE 0x06 #define USB_ADDR 0x02 uchar Status,buf[65],len;
uchar ReadData375() { uchar val; val=DATA_375; return val; }
void WriteCMD375(uchar val) { CMD_375=val; }
void WriteDATA375(uchar val) { DATA_375=val; }
void ReadUSBData() { uchar i; WriteCMD375(CMD_RD_USB_DATA); _nop_(); len=ReadData375(); buf[0]=len; for(i=1;i<=len;i++) { buf[i]=ReadData375(); } }
void WaitINT() { Status=0; while(CH375INT); WriteCMD375(CMD_GET_STATUS); Status=ReadData375(); }
uchar ResetDevice() { SetUSBMode(7); delay40ms(7); SetUSBMode(6); delay40ms(5); WaitINT(); return(Status); }
uchar get_desc(uchar type) { WriteCMD375(CMD_GET_DESCR); WriteDATA375(type); WaitINT(); return(Status); }
uchar set_addr(uchar val) { WriteCMD375(CMD_SET_ADDRESS); WriteDATA375(val); WaitINT(); if(Status==USB_INT_SUCCESS) { WriteCMD375(CMD_SET_USB_ADDR); WriteDATA375(val); delay40ms(5); } return(Status); }
uchar set_config(uchar val) { WriteCMD375(CMD_SET_CONFIG); WriteDATA375(val); WaitINT(); return(Status); }
void set_retry() { WriteCMD375(CMD_SET_RETRY); WriteDATA375(0x25); WriteDATA375(0x89); }
void ReadDiskSize() { uchar i,j=5,tlen; while(j) { WriteCMD375(CMD_DISK_SIZE); WaitINT(); if(Status == USB_INT_SUCCESS) { WriteCMD375(CMD_RD_USB_DATA); tlen=ReadData375();//数据长度 SendByte(0xAD); for(i=0;i { SendByte(ReadData375()); } SendByte(0xDA); break; } else { SendByte(0xFE);SendByte(0xEF); j--; WriteCMD375(CMD_DISK_R_SENSE); WaitINT(); if(Status!=USB_INT_SUCCESS) { WriteCMD375(CMD_RD_USB_DATA); len=ReadData375(); for(i=0;i { SendByte(ReadData375()); } } } } }
void EnumDevice() { delay40ms(5);//等待200ms EX0=0;//用查询中断方法 if(ResetDevice()==USB_INT_CONNECT) { if(get_desc(1)==USB_INT_SUCCESS) { ReadUSBData(); if(ResetDevice()==USB_INT_CONNECT) { if(set_addr(USB_ADDR)==USB_INT_SUCCESS) { if(get_desc(1)==USB_INT_SUCCESS) { ReadUSBData(); if(get_desc(2)==USB_INT_SUCCESS) { ReadUSBData(); if(set_config(1)==USB_INT_SUCCESS) { CH375ACT=0;//指示灯 set_retry(); ReadDiskSize(); } } } } } } } EX0=1; }