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] |
|
21楼#
发布于:2002-04-06 21:29
调了几天51固件程序!有些问题似乎明白了!
在没有安装驱动程序时,主机提取51固件程序中设备描述表,然后设置USB地址。 启动驱动程序(如果没有正确的驱动程序启动安装先导),驱动程序读取设备描述表、配置描述符等描述符,设置配置。 [编辑 - 4/8/02 作者: plasma] |
|
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; |
|
23楼#
发布于:2002-04-09 10:46
|
|
24楼#
发布于:2002-04-11 19:47
首先非常感谢PLASMA!
我现在正在用PDIUSBD12和EOC33209(32位的RISC MCU)建立连接。如何来完成?能否将原码共享? |
|
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(); } |
|
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,\' \' }; |
|
27楼#
发布于:2002-04-12 19:29
是啊,能不能把C51和D12的驱动程序给我啊,我现在毕业设计就做这个,把RS-232转成USB,都不知道要怎么做?能不能把程序发给我啊?太谢谢了! 我的E-Mail是Brisk_su@hotmail.com
|
|
28楼#
发布于:2002-04-12 19:32
能不能把C51跟D12的驱动程序发给我啊,我的毕业设计就是做这个,都不知道要怎么做,那位大哥有没有这部分的程序,能不能发给我啊?太谢谢了,我的E-Mail是Brisk_su@hotmail.com!
|
|
29楼#
发布于:2002-04-16 13:19
plasma
把你的d12->c51 code给我一份好吗?谢谢了,我的e_mail: eintonb@weststarchips.com 谢谢! |
|
30楼#
发布于:2002-04-17 16:36
plasma
在吗?帮帮忙了! |
|
31楼#
发布于:2002-04-18 00:33
plasmai 不是已经给出来了吗?
|
|
|
32楼#
发布于:2002-04-18 00:55
在上面!
我已把电路图和所有程序都贴出来了。 |
|
33楼#
发布于:2002-04-18 09:35
那你用的是什么编译器呢?
|
|
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 ----------------------------------------------------------- |
|
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 |
|
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] |
|
37楼#
发布于:2002-04-19 15:57
程序中:
char ii[5]; 是为了测试用的,上传时我忘了删掉了. |
|
38楼#
发布于:2002-04-23 20:16
plasma:
我用usbview 看descriptor时,发现open pipes = 0;所以,我 无法加载驱动程序,请问,应该怎样open pipes呢?对了,无法 加载驱动程序是不是没用打开pipe呢?谢谢!!! |
|
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 该怎样解决呢? 谢谢! |
|