阅读:1421回复:7
有关D12上电复位后的动作,及其接收到的数据问题探求!
各位大虾:
D12上电复位后,首先 D12_COMMAND (0xd0);D12_DATAOUT(0x80);//设置地址 0 使能 D12_COMMAND(0xf3); D12_DATAOUT(0x0c6); D12_DATAOUT(0x05);//初始化频率 8MHz D12_COMMAND(0xf3);D12_DATAOUT(0x16);//连接主机 然后等待中断: if(!D12_int_n) { D12_COMMAND(0xf4);// 读中断寄存器 D12_DATAIN(); 读取中断寄存器的值如下:0xC0,0x80,0xC0, 读取pipe0寄存器的值如下:80,00,00,00,00,00,40,00 } 之后没有任何反映,请问大虾问题在哪儿? |
|
沙发#
发布于:2003-02-15 16:17
你没返回任何值主机当然没反应了,你收到的请求使返回描述符请求,你要返回18个字节的描述符,如果正确的话会再有中断过来。
|
|
板凳#
发布于:2003-02-19 11:21
Dear jinghuiren:
I meet with some problems in using the usb chip \'MX87L10\'which is compliant with the chip \"D12\".I will want you to help me. the first question is that when I pull up the chip with the PC read the interrupt register. the data is \'C0\'.then read the ep0 out buffer is\"80 00 00 00 00 00 40 00\".I can\'t receive \"80 06 00 01 00 00 40 00\" and ep0 OUT the last transaction status isn\'t \"20h\" forever. the interrupt register data is \"c0 \" or \"80\" or \"40\" forever. the program can\'t work in OUT or IN status. the below is the firmware source: D12_COMMAND (0xd0);D12_DATAOUT(0x80);//设置地址 0 enable D12_COMMAND (0xd8);D12_DATAOUT(0x01);//设置pipe 0 enable D12_COMMAND(0xf3); D12_DATAOUT(0x0c6); D12_DATAOUT(0x05); //set clock= 8MHz Wait3msec(); //wait for 3 m second while(1) { if(!D12_int_n) { D12_COMMAND(0xf4);// read interrupt register. XmtBuff.b[0] = D12_DATAIN(); //XmtBuff.b[0] = c0 ,means reset and suspend if(XmtBuff.b[0] & 0x40) //usb_reset { D12_COMMAND(0x40);//read ep0 OUT last transaction. data is “00” D12_DATAIN(); D12_COMMAND( 0x00);// select ep0 out D12_DATAIN(); D12_COMMAND (0xf1);// Acknowledge Setup D12_COMMAND (0xf2);// Clear Buffer } if(XmtBuff.b[0] & 0x80) { if(D12_suspend == 1) { D12_suspend=0;//process suspend status D12_COMMAND (0xf6);// send Resume D12_suspend = 1; } D12_COMMAND(0x40); //read ep0 OUT last transaction. data is “00h” //normally that is \"20h\" D12_DATAIN(); SETUP_read(); //read data is \"80 00 00 00 00 00 40 00\" if (XmtBuff.b[0] & 0x80) GetStatus(); } else { if(XmtBuff.b[0] & 0x15)// 收到 OUT 包 { if(ii[0]==12) ii[0]=ii[0]; if(XmtBuff.b[0] & 0x01) { D12_COMMAND(0x40);//读 ep0 OUT 最后状态 D12_DATAIN(); if(data2 & 0x20)// 收到 SETUP 包 { SETUP_read(); HandleSetup(); } } else if(XmtBuff.b[0] & 0x04) { D12_COMMAND ( 0x40);//读ep0 OUT 最后状态 D12_DATAIN(); XmtBuff.b[0] = data2; ep_read(0x00); } else if(XmtBuff.b[0] & 0x10) { D12_COMMAND( 0x44);//读ep2 OUT 最后状态 D12_DATAIN(); } } else if(XmtBuff.b[0] & 0x2a)// 收到 IN 包 { if(ii[1]==18) ii[0]=ii[0]; if(XmtBuff.b[0] & 0x02) XmtBuff.in = 1; else if(XmtBuff.b[0] & 0x08) XmtBuff.in = 3; else if(XmtBuff.b[0] & 0x20) XmtBuff.in = 5; D12_COMMAND(XmtBuff.in | 0x40);// XmtBuff.b[1] =D12_DATAIN(); } } } } } void SETUP_read(void) { char i; D12_COMMAND( 0x00);// select ep0 out D12_DATAIN(); D12_COMMAND( 0xf0);// read Buffer XmtBuff.b[0] = D12_DATAIN(); XmtBuff.b[1] = D12_DATAIN(); for(i=0;i<8;i++) { XmtBuff.b = D12_DATAIN(); } D12_COMMAND (0xf1);// D12_COMMAND (0xf2);// } |
|
|
地板#
发布于:2003-02-19 11:26
MX87l10 的电路图
|
|
|
地下室#
发布于:2003-02-19 11:33
请问jinghuiren 。上面的程序我应该如何修改呢?谢谢!
|
|
5楼#
发布于:2003-02-19 16:05
if (XmtBuff.b[0] & 0x80)
GetStatus(); 上面两行程序是什么意思? 我觉得按你的意思应该这样来做: if (XmtBuff.b[0] & 0x80) { if(XmtBuff.b[1] & 0x06) { if(XmtBuff.b[3] & 0x01) GetDescriptor();//返回18个字节的描述符 } if() . . . } 不过这样很麻烦的,你不如把不那八个字节的setup里的内容分类,然后用switch()来处理。 |
|
6楼#
发布于:2003-02-19 17:01
if (XmtBuff.b[0] & 0x80)
GetStatus(); 前面读取ep0 OUT数据为“80 00 00 00 00 00 40 00”,然而又不是取设备描述符,因此我认为取状态。实在是不知道该如何处理? 先将源代码附上:见附件 void HandleSetup(void) { if(XmtBuff.b[0] & 0x20)//类请求跳转表 { if (XmtBuff.b[1] <= 0x0B) { //(*ClassFunctionTable[XmtBuff.b[1]])(); return; } } else { if (XmtBuff.b[1] <= 0x0B)//标准请求跳转表 { if (XmtBuff.b[1] == 15) { SetConfiguration(); }else { (*StandardFunctionTable[XmtBuff.b[1]])(); } } return; } } void SETUP_read(void) { char i; D12_COMMAND( 0x00);// 选择端点0(指针指向0位置) D12_DATAIN(); D12_COMMAND( 0xf0);// 读标准控制码 D12_DATAIN(); XmtBuff.b[0] = data2; D12_DATAIN(); XmtBuff.b[1] = data2; for(i=0;i<8;i++) { D12_DATAIN(); XmtBuff.b = data2; } D12_COMMAND (0xf1);// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令 D12_COMMAND (0xf2);// 清 OUT 缓冲区 } void USB_submit(void) { if(XmtBuff.rLength>XmtBuff.pNum)XmtBuff.rLength = XmtBuff.pNum; D12_COMMAND (XmtBuff.in);// 选择 IN 端点(指针指向0位置) D12_DATAIN(); D12_COMMAND ( 0xf0);// 写缓冲区 D12_DATAOUT(0x00); D12_DATAOUT(XmtBuff.rLength); for(XmtBuff.b[7]=0;XmtBuff.b[7]<XmtBuff.rLength ;XmtBuff.b[7]++) { D12_DATAOUT ( *(XmtBuff.p++)); } XmtBuff.pNum-=XmtBuff.rLength; if(XmtBuff.in == 1)D12_COMMAND ( 0xf1);// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令 D12_COMMAND( 0xfa);// 设置 IN 缓冲区有效(满标志) } void voidfunction(void) { D12_COMMAND ( 0x40);// 0 端点停止(用于发送Stall包) D12_DATAOUT(0x01); D12_COMMAND (0x41);// 1 端点停止(用于发送Stall包) D12_DATAOUT( 0x01); D12_COMMAND( 0xf1);// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令 } void SetAddress(void) { D12_COMMAND(0xd0);//设置新地址使能 D12_DATAOUT( 0x80 | XmtBuff.b[2]); XmtBuff.rLength = 0; USB_submit(); } void GetDescriptor(void) { ii[2]++; XmtBuff.rLength=16; switch (XmtBuff.b[3]) { case 0x01: //USB_DEVICE XmtBuff.pNum = sizeof(device_descriptor); XmtBuff.p = device_descriptor; break; case 0x02:// USB_CONFIGURATION XmtBuff.pNum = Configuration_Descriptor[2]; XmtBuff.p = Configuration_Descriptor; if(XmtBuff.b[6]<16)XmtBuff.pNum = XmtBuff.b[6]; break; case 0x03: //USB_STRING switch(XmtBuff.b[2]) { case 0x00 : XmtBuff.pNum = sizeof(USBStringLanguageDescription); XmtBuff.p = USBStringLanguageDescription; break; case 0x01 : XmtBuff.pNum = sizeof(USBStringDescription1); XmtBuff.p = USBStringDescription1; break; case 0x02 : XmtBuff.pNum = sizeof(USBStringDescription2); XmtBuff.p = USBStringDescription2; break; default : voidfunction(); return; } break; default : voidfunction(); return; } USB_submit(); } void SetConfiguration(void) { if (XmtBuff.b[0] == 0x00) { XmtBuff.rLength = 0; USB_submit(); D12_COMMAND (0xd8); if(XmtBuff.b[2] == 0x00) { D12_DATAOUT( 0x00); // 使用端点0 }else if(XmtBuff.b[2] == 0x01) { D12_DATAOUT( 0x01); // 使用端点1 } } else voidfunction(); } void GetStatus(void) { switch (XmtBuff.b[0]) { case 0x80://返回设备状态 //发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。 XmtBuff.b[0] = 0x03; XmtBuff.b[1] = 0x00; break; case 0x81://返回接口状态 //发送两个字节数据:第一字节为0;第二字节为0。 //XmtBuff.b[5] 为接口号 XmtBuff.b[0] = 0x00; XmtBuff.b[1] = 0x00; break; case 0x82://返回端点状态 //发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。 //XmtBuff.b[5] D7为方向,D3~0为端点号 XmtBuff.b[0] = 0x00; XmtBuff.b[1] = 0x00; break; } XmtBuff.rLength = 2; XmtBuff.pNum = 2; XmtBuff.p = XmtBuff.b; USB_submit(); } |
|
|
7楼#
发布于:2003-02-19 17:41
怎么会呢,我枚举的时候没遇到这个描述符呀,是不是读取得有问题呀,你能跟踪一下试试吗,我现在也是焦头烂额的,没有时间看你的源程序,而且我做的和你的优点区别,不是一时半会能看懂的,我估计是你读去setup包有问题,或者是你的数据线中某一根有问题,你量一下对应80 06 00 01中01的那根数据线是不是有问题?看源程序事没太大的用处,只要你您检查读去函数没有错,那就可能是硬件问题了。
|
|