plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-04-05 16:08
D12->51测试电路图

[url]http://www.driverdevelop.com/forum/upload/plasma/2002-04-05_D12_51.jpg [/url]


[编辑 -  4/5/02 作者: plasma]
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-04-06 21:29
调了几天51固件程序!有些问题似乎明白了!

在没有安装驱动程序时,主机提取51固件程序中设备描述表,然后设置USB地址。

启动驱动程序(如果没有正确的驱动程序启动安装先导),驱动程序读取设备描述表、配置描述符等描述符,设置配置。


[编辑 -  4/8/02 作者: plasma]
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-04-06 21:42
引脚参数定义:

sbit D12_suspend=P1^0;
sbit D12_int_n=P1^1;
sbit D12_eot_n=P1^2;
sbit D12_DMAck_n=P1^3;
sbit D12_DMAreq=P1^4;
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-04-09 10:46
liuzheng968
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-04-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-04-11 19:47
首先非常感谢PLASMA!
   我现在正在用PDIUSBD12和EOC33209(32位的RISC MCU)建立连接。如何来完成?能否将原码共享?
  
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2002-04-11 21:10
好吧!

现在把我已调试通过的共享。这是启动USB所必需的。

#include <reg51.h>
#include <usbtest.h>

char ii[5];
void main()
{
    P1=0xff;
    XmtBuff.out = 0x00;
    XmtBuff.in = 0x01;
    D12_COMMAND = 0xf3;D12_DATA = 0x06;D12_DATA = 0x03;//初始化频率 12MHz
    D12_COMMAND = 0xd0;D12_DATA = 0x80;//设置地址 0 使能
    D12_COMMAND = 0xf3;D12_DATA = 0x16;//连接主机
    while(1)
    {
        if(!D12_int_n)
        {
            D12_COMMAND = 0xf4;// 读中断寄存器
            XmtBuff.b[0] = D12_DATA;
            if(XmtBuff.b[0] & 0x80)
            {
              if(D12_suspend == 1)
              {   /** /
                  D12_suspend=0;//处理挂起事务
                  D12_COMMAND = 0xf6;//发送恢复命令
                  D12_suspend = 1;
                  /**/
              }
            }
            else
            {
              if(XmtBuff.b[0] & 0x15)// 收到 OUT 包
              {
                  if(ii[0]==12)
                  ii[0]=ii[0];
                  if(XmtBuff.b[0] & 0x01)
                  {
                      D12_COMMAND = 0x40;//读 OUT 最后状态
                      if(D12_DATA & 0x20)// 收到 SETUP 包
                      {
                          SETUP_read();
                          HandleSetup();
                      }
                  }else if(XmtBuff.b[0] & 0x04)
                  {
                      D12_COMMAND = 0x42;//读 OUT 最后状态
                  }else if(XmtBuff.b[0] & 0x10)
                  {
                      D12_COMMAND = 0x44;//读 OUT 最后状态
                  }
              } 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);// 读 IN 最后状态
                  XmtBuff.b[1] = D12_DATA;
                  //if(D12_DATA & 0x01)
                  {
                      ii[1]++;
                      //if(ii[1]==4)
                      //ii[0]=ii[0];
                      USB_submit();
                  }
              }
            }
        }
    }
}

void HandleSetup(void)
{
    if(ii[0]==10)
    ii[0]=ii[0];
    ii[0]++;
    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_COMMAND = 0xf0;// 读标准控制码
    XmtBuff.b[0] = D12_DATA;
    XmtBuff.b[1] = D12_DATA;
    for(i=0;i<8;i++)
    {
       XmtBuff.b = D12_DATA;
    }
    D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
    D12_COMMAND = 0xf2;// 清 OUT 缓冲区
}

void USB_submit(void)
{
    ii[3]++;

    if(XmtBuff.rLength>XmtBuff.pNum)XmtBuff.rLength = XmtBuff.pNum;

    D12_COMMAND = XmtBuff.in;// 选择 IN 端点(指针指向0位置)
    D12_COMMAND = 0xf0;// 写缓冲区
    D12_DATA = 0x00;
    D12_DATA = XmtBuff.rLength;

    for(XmtBuff.b[7]=0;XmtBuff.b[7]<XmtBuff.rLength ;XmtBuff.b[7]++)
    {
        D12_DATA = *(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_DATA = 0x01;
    D12_COMMAND = 0x41;// 1 端点停止(用于发送Stall包)
    D12_DATA = 0x01;
    D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
}

void SetAddress(void)
{
    ii[4]++;
    D12_COMMAND = 0xd0;//设置新地址使能
    D12_DATA = 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_DATA = 0x00;  // 使用端点0
        }else if(XmtBuff.b[2] == 0x01)
        {
            D12_DATA = 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();
}

plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2002-04-11 21:15
//自定义头文件 usbtest.h

sbit D12_suspend=P1^0;
sbit D12_int_n=P1^1;
sbit D12_eot_n=P1^2;
sbit D12_DMAck_n=P1^3;
sbit D12_DMAreq=P1^4;
sbit p15=P1^5;
sbit p16=P1^6;
sbit p17=P1^7;

#define D12_COMMAND (*(unsigned char xdata *)0x8000)
#define D12_DATA    (*(unsigned char xdata *)0x0000)

void HandleSetup(void);
void SETUP_read(void);
void USB_submit(void);

void GetStatus(void);
void ClearFeature(void);
void SetFeature(void);
void SetAddress(void);
void GetDescriptor(void);
void SetDescriptor(void);
void GetConfiguration(void);
void SetConfiguration(void);
void GetInterface(void);
void SetInterface(void);

void voidfunction(void);

code void (* StandardFunctionTable[])(void)=
{
   GetStatus,voidfunction,voidfunction,voidfunction,
   voidfunction,SetAddress,GetDescriptor,voidfunction,
   voidfunction,SetConfiguration,voidfunction,voidfunction
};
/**/
void GetReport(void);
void GetIdle(void);
void GetProtocol(void);
void SetIdle(void);
void SetProtocol(void);

code void (* ClassFunctionTable[])(void)=
{
  voidfunction, GetReport, GetIdle,GetProtocol,
  voidfunction, voidfunction, voidfunction,voidfunction,
  voidfunction, voidfunction, SetIdle,SetProtocol
};
/**/

typedef struct
{
    unsigned char b[8];
    unsigned char out;
    unsigned char in;
    unsigned char rLength;
    unsigned char pNum;
    unsigned char *p;
}TRANSMIT_STRUCT;
TRANSMIT_STRUCT XmtBuff;

code char device_descriptor[] =
{
 0x12, // 描述表大小 (18 bytes)
 0x01, // 设备描述表类型
 0x10, 0x01,    // 兼容设备版本号(BCD码)
 0x00, // 设备类码
 0x00, // 子类码
 0x00, // 协议码
 0x10,          // 端点0最大包大小(8,16,32,64)
 0x71, 0x04,    // 厂商ID
 0x11, 0x11,    // 产品ID
 0x01, 0x00,    // 设备发行号(BCD码)
 0x01, // 厂商信息字符串索引
 0x02, // 产品信息字符串索引
 0x00, // 设备序列号字符串索引(不支持设为0)
 0x01 // 配置数
};

code char Configuration_Descriptor[] =
{
 0x09,          // 配置描述表长度
 0x02,          // 配置描述表类型
 0x20,0x00,     // 配置描述表及附带表长度
 0x01,          // 接口配置数
 0x01,          // 配置描述表标识
 0x00,          // 配置描述表字符串描述表索引
 0xa0,          // 配置属性
 0x64           // 总线供电最大值(*2mA)
};

code char Interface_Descriptor[] =
{
 0x09, // 接口描述表长度(9)
 0x04, // 接口描述表类型
 0x00, // 接口数(0)
 0x00, // 轮寻设置(0 号端点)
 0x02, // 端点数 (4)
 0x03, // 接口类属
 0x01, // 子类码
 0x02, // 协议码
 0x00   // 接口字符串描述表索引(不支持)
};

code char Endpoint_Descriptor_t[] =
{
 0x07, // 端点描述表长度(7)
 0x05, // 端点描述表类型
 0x81, // IN 端点(1)
 0x02, // 传输模式(0 控制、1 同步、2 批、3 中断传输)
 0x10, 0x00,    // 最大包大小(16)
 0x0A   // 轮寻时间 (10ms)
};

code char Endpoint_Descriptor_r[] =
{
 0x07, // 端点描述表长度(7)
 0x05, // 端点描述表类型
 0x01, // OUT 端点(1)
 0x02, // 传输模式(0 控制、1 同步、2 批、3 中断传输)
 0x10, 0x00,    // 最大包大小(16)
 0x0A   // 轮寻时间 (10ms)
};

code char USBStringLanguageDescription[] =
{
 sizeof(USBStringLanguageDescription), // 字符串描述表长度
 0x03, // 字符串描述表类型
 0x09, // 语言标识(9 英语)
 0x04 // 子语言标识: Default
};

code char USBStringDescription1[] =
{
sizeof(USBStringDescription1),
        0x03,
        \'C\',0,\'y\',0,\'p\',0,\'r\',0,\'e\',0,\'s\',0,\'s\',0,\' \'
};

code char USBStringDescription2[] =
{
sizeof(USBStringDescription2),
        0x03,
        \'C\',0,\'y\',0,\'p\',0,\'r\',0,\'e\',0,\'s\',0,\'s\',0,\' \'
};

Asind
驱动牛犊
驱动牛犊
  • 注册日期2001-07-22
  • 最后登录2002-11-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2002-04-12 19:29
是啊,能不能把C51和D12的驱动程序给我啊,我现在毕业设计就做这个,把RS-232转成USB,都不知道要怎么做?能不能把程序发给我啊?太谢谢了! 我的E-Mail是Brisk_su@hotmail.com
Asind
驱动牛犊
驱动牛犊
  • 注册日期2001-07-22
  • 最后登录2002-11-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2002-04-12 19:32
能不能把C51跟D12的驱动程序发给我啊,我的毕业设计就是做这个,都不知道要怎么做,那位大哥有没有这部分的程序,能不能发给我啊?太谢谢了,我的E-Mail是Brisk_su@hotmail.com!
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2002-04-16 13:19
plasma
把你的d12->c51 code给我一份好吗?谢谢了,我的e_mail:
eintonb@weststarchips.com 谢谢!
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2002-04-17 16:36
plasma
在吗?帮帮忙了!
ysfc51
驱动牛犊
驱动牛犊
  • 注册日期2001-10-01
  • 最后登录2009-12-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2002-04-18 00:33
plasmai 不是已经给出来了吗?
千山千幅画 一步一重天
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2002-04-18 00:55
在上面!
我已把电路图和所有程序都贴出来了。
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2002-04-18 09:35
那你用的是什么编译器呢?
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2002-04-18 14:05
请问:keil c compiler 中
下面的错误是什么错误?
是RAM不够吗?怎样解决呢?

-----------------------------------------------------------
LINK/LOCATE RUN COMPLETE. 7 WARNING(S), 0 ERROR(S)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_D12_READENDPOINTSTATUS?D12CI *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?D12_GETDMA?D12CI
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?D12_READCURRENTFRAMENUMBER?D12CI
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_D12_READMAINENDPOINT?D12CI
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?ON_EXIT?MAINLOOP
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?RECONNECT_USB?MAINLOOP
*** WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_D12_WRITEENDPOINT?D12CI CALLER1: ?PR?USB_ISR?ISR CALLER2: ?C_C51STARTUP
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED MODULE: C:\\KEIL\\C51\\LIB\\C51S.LIB (-----) LIMIT: 0800H BYTES Target not created
-----------------------------------------------------------
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
35楼#
发布于:2002-04-18 18:55
引用:
-------------------------------------------
D12_COMMAND = 0xf3;D12_DATA = 0x06;D12_DATA = 0x03;
D12_COMMAND = 0xd0;D12_DATA = 0x80
D12_COMMAND = 0xf3;D12_DATA = 0x16
--------------------------


plasma:

和第一页不一样呢?
前面是
D12_DATA = 0x0e;D12_DATA = 0x1e
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2002-04-19 15:47
D12_COMMAND = 0xf3;D12_DATA = 0x16
D12_COMMAND = 0xf3;D12_DATA = 0x1e

详见D12芯片命令说明设置中断响应.

仿真系统是 伟福E2000/T
编译器 keil c


[编辑 -  4/19/02 作者: plasma]
plasma
驱动小牛
驱动小牛
  • 注册日期2002-02-19
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2002-04-19 15:57
程序中:

char ii[5];

是为了测试用的,上传时我忘了删掉了.
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2002-04-23 20:16
plasma:
   我用usbview 看descriptor时,发现open pipes = 0;所以,我
无法加载驱动程序,请问,应该怎样open pipes呢?对了,无法
加载驱动程序是不是没用打开pipe呢?谢谢!!!
kill008
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2011-08-15
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2002-04-24 13:56
plasma:

open pipes = 0 的原因是set_configuration 请求的wvalue_low
 = 0 ,即not configurationed ,如果pc 发的set_configuration
请求的wvalue_low = 1 的话就没问题,但pc 就不发wvalue_low = 1,
的set_configuration 的请求,so 该怎样解决呢?   谢谢!
游客

返回顶部