📄 chap_9.lst
字号:
C51 COMPILER V7.02b CHAP_9 09/24/2007 20:01:36 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN Chap_9.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Chap_9.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************Copyright (c)**************************************************
2 ** 广州周立功单片机发展有限公司
3 ** 研 究 所
4 ** 产品一部
5 **
6 ** http://www.zlgmcu.com
7 ** 文 件 名: Chap_9.c
8 ** 最后修改日期: 2004年11月15日
9 ** 描 述: USB驱动程序软件包: PDIUSBD12 设备端驱动程序 协议层
10 ** 版 本: V5.0
11 **********************************************************************************************************
-/
12
13 //#include <reg52.h>
14 #include "stc51.h"
15 #include "D12Config.h"
16 #include "D12CI.h"
17 #include "Chap_9.h"
18 #include "Descriptor.h"
19 #include "Protozlg.h"
20
21 //定义控制传输结构变量
22 CONTROL_XFER ControlData;
23
24 //定义USB事件标志变量
25 EPPFLAGS bEPPflags;
26
27 //*************************************************************************
28 //USB标准设备请求入口地址指针表
29 //*************************************************************************
30 code void (*StandardDeviceRequest[])(void) =
31 {
32 get_status,
33 clear_feature,
34 reserved,
35 set_feature,
36 reserved,
37 set_address,
38 get_descriptor,
39 reserved,
40 get_configuration,
41 set_configuration,
42 get_interface,
43 set_interface,
44 reserved,
45 reserved,
46 reserved,
47 reserved
48 };
49
50 //*************************************************************************
51 // USB 协议层函数
52 //*************************************************************************
53
54 /*************************************
C51 COMPILER V7.02b CHAP_9 09/24/2007 20:01:36 PAGE 2
55 ** 函数名称: void stall_ep0(void)
56 ** 功能描述: 使控制端点处于停止状态
57 **************************************/
58 void stall_ep0(void)
59 {
60 1 D12_SetEndpointStatus(0, 1);
61 1 D12_SetEndpointStatus(1, 1);
62 1 }
63
64
65 /*************************************
66 ** 函数名称: void reserved(void)
67 ** 功能描述: 保留子程序
68 **************************************/
69 void reserved(void)
70 {
71 1 stall_ep0(); //返回STALL
72 1 }
73
74
75 /**********************************************
76 ** 函数名称: void init_unconfig(void)
77 ** 功能描述: 进入地址状态,禁止0除外的所有端点
78 ***********************************************/
79 void init_unconfig(void)
80 {
81 1 D12_SetEndpointEnable(0); //禁止0除外的所有端点
82 1 }
83
84 /**********************************************
85 ** 函数名称: void init_config(void)
86 ** 功能描述: 配置处理,允许端点收发
87 ***********************************************/
88 void init_config(void)
89 {
90 1 D12_SetEndpointEnable(1); //使能普通/同步端点使能
91 1 }
92
93
94 /*********************************************************
95 ** 函数名称: void single_transmit(INT8U * buf, INT8U len)
96 ** 功能描述: 通过端点索引 1 发送数据(DATA 类型)
97 ** 输 入: INT8U * buf: 发送数据指针
98 INT8U len: 发送数据长度
99 ** 输 出: 无
100 **********************************************************/
101 void single_transmit(INT8U * buf, INT8U len)
102 {
103 1 if( len <= EP0_PACKET_SIZE) { //长度小于EP0最大信息包大小才允许发送
104 2 D12_WriteEndpoint(1, len, buf);
105 2 }
106 1 }
107
108 /*************************************************************
109 ** 函数名称: void code_transmit(INT8U * pRomData, INT16U len)
110 ** 功能描述: 通过端点索引 1 发送数据(CODE类型)
111 ** 输 入: INT8U *pRomData: 发送数据指针
112 INT16U len: 发送数据长度
113 ** 输 出: 无
114 **************************************************************/
115 void code_transmit(INT8U *pRomData, INT16U len)
116 {
C51 COMPILER V7.02b CHAP_9 09/24/2007 20:01:36 PAGE 3
117 1 ControlData.wCount = 0; //传输字节数计数器清0
118 1 if(ControlData.wLength > len)
119 1 ControlData.wLength = len; //传输数据总字节数不得超过len
120 1
121 1 ControlData.pData = pRomData; //传输数据指针指向pRomData
122 1 if( ControlData.wLength >= EP0_PACKET_SIZE) { //传输数据总字节数大于端点0最大信息包大小
123 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData); //发送端点0最大信息包大小个字节
124 2 ControlData.wCount += EP0_PACKET_SIZE; //统计已发送字节数
125 2
126 2 DISABLE();
127 2 bEPPflags.bits.control_state = USB_TRANSMIT; //标志数据发送状态
128 2 ENABLE();
129 2 }
130 1 else {
131 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData); //写入传输数据总字节数
132 2 ControlData.wCount += ControlData.wLength; //统计已发送字节数
133 2 DISABLE();
134 2 bEPPflags.bits.control_state = USB_IDLE; //标志空闲状态
135 2 ENABLE();
136 2 }
137 1 }
138
139 //*************************************************************************
140 // USB 标准设备请求服务程序
141 //*************************************************************************
142
143 /********************************************************************
144 ** 函数名称: void get_status(void)
145 ** 功能描述: 主机要求获取状态,设备返回16位的状态描述给主机
146 *********************************************************************/
147 void get_status(void)
148 {
149 1 INT8U endp, txdat[2], c;
150 1 INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
151 1 //取得设备请求类型
152 1 if (bRecipient == USB_RECIPIENT_DEVICE) { //对设备请求
153 2 if(bEPPflags.bits.remote_wakeup == 1)
154 2 txdat[0] = 3; //支持远程唤醒、自供电
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -