[求助]CH375B的设备枚举过程

我想编写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; }

到公司网站上下载CH375EVT.ZIP 参考CH375EVT\PUB\MCS51C\MISCELL\CH375EV0.C,该例程是演示读写U盘物理扇区,还有获取磁盘容量部分的代码


U盘的初始化需要按流程去走,在获取容量前必须先做DISK_INIT 读写U盘的底层操作是很复杂的,建议用户考虑使用我们的子程序库(CH375LIB.ZIP)


我只是想了解枚举过程的底层操作,如果使用子程序库,硬件资源紧张,不能做


1、想要完全了解这个过程,必须需要熟悉BulkOnly传输协议和SCSI命令集,才能理解枚举过程 2、如果资源不够,那么可以考虑CH376芯片,只要几百字节程序空间,几十字节RAM


建议不要这样做,最起码要做完DISK_INIT,如果每一步都去获取,那你要了解USB协议,还有U盘枚举的过程。 另外,磁盘容量在获取的时候,如果不成功延时100-200MS再去重试。


只有登录才能回复,可以选择微信账号登录