大家好! 我在用CMD_DISK_SIZE 命令时,读出的前八字节为00 08 00 01 75 00 00 00,剩余字节为KingstonDataTraveler 2.0;
这个怎么回事啊?这个命令怎么读出了这么多字节的数据?
我正在用CH375搞产品,USB的部分刚开始接触,希望版主、各位网友指点。先谢谢啦。
大家好! 我在用CMD_DISK_SIZE 命令时,读出的前八字节为00 08 00 01 75 00 00 00,剩余字节为KingstonDataTraveler 2.0;
这个怎么回事啊?这个命令怎么读出了这么多字节的数据?
我正在用CH375搞产品,USB的部分刚开始接触,希望版主、各位网友指点。先谢谢啦。
CMD_DISK_SIZE命令的反回的长度是多少?以这个长度为基准读取容量数据
你可以跟下CMD_DISK_SIZE这个命令返回的数据长度,看看是不是8个字节.你在CMD_DISK_SIZE之前有没有使用CMD_DISK_INQUIRY这个命令?如果有的话在做CMD_DISK_SIZE之前将缓冲区清空,你再去跟下程序看是否执行该命令之后还会有你所说的上述数据.
返回的数据长度尽然为:36字节。 我没有用CMD_DISK_INQUIRY,我一直认为我的芯片为CH375,今天看了一下发现是CH375A。 我的部分程序如下(先前在此板上调试设备,完成自发自收功能,然后现在搞主机模式): 写命令子程序: void CH375_WriteCmd(uint8 CH375Command) { uint8 Command_Temp = CH375Command; CH375_CS=0; CH375_1Cmd_0Data = 1; CH375Port = Command_Temp; SDelay(2); CH375_Write=0; SDelay(1); CH375Disable(); } ************************************************** 写数据子程序: void CH375_WriteData(uint8 CH375Data) { uint8 CH375Data_Temp = CH375Data; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port = CH375Data_Temp; SDelay(2); CH375_Write=0; SDelay(1); CH375_Write=1; } ***************************************** 读数据子程序: uint8 CH375_ReadData() { uint8 USBData; CH375Port=0XFF; CH375_CS=0; CH375_Read=0; SDelay(2); USBData=CH375Port; SDelay(1); CH375_Read=1; return USBData; } ********************************************** 获取U盘大小子程序: void CH375_Acq_DiskSize() { CH375_WriteCmd(CMD_DISK_SIZE); while(!Disk_Ok); //等待CMD_DISK_SIZE中断 Disk_Ok=0; USB_ReadData(); //从缓冲区读数据 } ************************************************* 缓冲区读数据子程序: void USB_ReadData() { uint8 Count_Temp; CH375_WriteCmd(CMD_RD_USB_DATA); USBData_Len=CH375_ReadData(); //接收长度 if(USBData_Len>64) { USBData_Len=64; } UartTrans("\nDataLen:",9,0); UartTransData(USBData_Len); //串口打印长度 UartTrans("\n",1,0); for(Count_Temp=0;Count_Temp< USBData_Len;Count_Temp++) //接收数据块 { USBBuffer[Count_Temp]=CH375_ReadData(); } USBRecFlag=1; CH375Disable(); } **************************** 打印缓冲区内容: while(USBRecFlag) //收到数据标志位,从串口打印 { //UartTransData('@'); USBRecFlag=0; UartTrans("Disk Size:\n",11,0); UartTrans(USBBuffer,8,0); //打印前八字节 UartTrans("\nDisk Info:\n",12,0); UartTrans(USBBuffer,USBData_Len-8,8); //打印剩余字节 UartTrans("\n",1,0); USBReset(); //清缓冲区 SDelay(100); }
你先做DISK_INQURY命令跟下这个命令返回的数据,紧跟着将数据缓冲区清除,然后再做DISK_SIZE命令,你对比下两个命令返回的数据和长度,看你的数据来说应该是CMD_DISK_INQURY命令返回的数据.另外,你手头上有没有CH375B?可以的话,换成CH375B实验下.
另外,你是使用我们的子程序库吗?是的话,你可不可以将你的所使用的库的详细信息提供下,包括单片机型号,编译器和编译器的版本.
我用的是自己的程序,以前不知道你们提供这些库。 我的原先的程序有点问题:在执行完CMD_DISK_INIT后没有判断中断,而USB_INT_SUCCESS中断中我将DiskOk的标志位设为1;后面就开始执行CMD_DISK_SIZE,我判断此命令是否成功的依据就是DiskOk,这个被上步的命令CMD_DISK_INIT已经置位了,所以CMD_DISK_SIZE在不知是否被CH375成功接收的情况下51开始读数据,结果出来的就是U盘的型号等信息,不知道这个是否正常?文档中没有说明。 现在将上述的Bug更改之后,发现CMD_DISK_SIZE返回了错误的中断状态USB_INT_DISK_ERR;
这个该如何解决?DISK_R_SENSE 这个命令怎么使用?
建议你去下载CH375EVT这个文件包,去参考\PUB\MCS51C\MISCELL下EV0.C这个示例程序.至于你所说的DISK_R_SENSE命令是在操作U盘失败后,你可以发该命令向设备要失败的信息,然后对该命令进行重试.
上述问题搞定了。呵呵
CMD_SET_PKT_P_SEC这个命令怎么在我的CH375INC。H中没有呢?
网上下载CH375EVT.ZIP,查看\CH375EVT\PUB\MCS51C\INCLUDE
顺便给各位网友说一点: 若U盘等初始化有问题,可以更换U盘试一试,会得到意想不到的效果。
我就是被我这个Kinstone的U盘给害惨了。