south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1421回复:7

有关D12上电复位后的动作,及其接收到的数据问题探求!

楼主#
更多 发布于:2003-02-15 12:01
各位大虾:
  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
}

  之后没有任何反映,请问大虾问题在哪儿?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-15 16:17
你没返回任何值主机当然没反应了,你收到的请求使返回描述符请求,你要返回18个字节的描述符,如果正确的话会再有中断过来。
south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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_MX87L10 data sheet.pdf (138KB)  1
south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-19 11:26
MX87l10 的电路图
附件名称/大小 下载次数 最后更新
2003-02-19_MX87l10 designed .pdf (20KB)  1
south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-19 11:33
请问jinghuiren 。上面的程序我应该如何修改呢?谢谢!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
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()来处理。
south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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();
}
附件名称/大小 下载次数 最后更新
2003-02-19_200030128.zip (41KB)  4
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-19 17:41
怎么会呢,我枚举的时候没遇到这个描述符呀,是不是读取得有问题呀,你能跟踪一下试试吗,我现在也是焦头烂额的,没有时间看你的源程序,而且我做的和你的优点区别,不是一时半会能看懂的,我估计是你读去setup包有问题,或者是你的数据线中某一根有问题,你量一下对应80 06 00 01中01的那根数据线是不是有问题?看源程序事没太大的用处,只要你您检查读去函数没有错,那就可能是硬件问题了。
游客

返回顶部