📄 chap_9.lst
字号:
C51 COMPILER V7.50 CHAP_9 10/09/2006 14:43:39 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN chap_9.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE chap_9.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <d12config.h>
3 #include <D12main.h>
4 #include "Descriptor.h"
5 #include "Chap_9.h"
6
7 /***************************************
8 ** 函数名称: void ep0_rxdone(void)
9 ** 功能描述: 通过端点索引 0 接收数据
10 ** 输 入: 无
11 ** 输 出: 无
12 ***************************************/
13 void ep0_rxdone(void)
14 {
15 1 INT8U ep_last, i;
16 1 INT8U req[sizeof(DEVICE_REQUEST)];
17 1
18 1 ep_last = D12_ReadLastTransactionStatus(0); //清除中断寄存器状态,取得最后处理状态
*** WARNING C206 IN LINE 18 OF CHAP_9.C: 'D12_ReadLastTransactionStatus': missing function-prototype
*** ERROR C267 IN LINE 18 OF CHAP_9.C: 'D12_ReadLastTransactionStatus': requires ANSI-style prototype
19 1 if (ep_last & D12_SETUPPACKET) { //如果收到了建立包(Setup包)
*** ERROR C202 IN LINE 19 OF CHAP_9.C: 'D12_SETUPPACKET': undefined identifier
20 2 ControlData.wLength = 0; //传输字节总数清0
*** ERROR C202 IN LINE 20 OF CHAP_9.C: 'ControlData': undefined identifier
21 2 ControlData.wCount = 0; //传输字节计数器清0
*** ERROR C202 IN LINE 21 OF CHAP_9.C: 'ControlData': undefined identifier
22 2 if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req)
23 2 != sizeof(DEVICE_REQUEST) ) {
24 3 //从端点0读8个字节失败
25 3 D12_SetEndpointStatus(0, 1); //停止控制端点0
26 3 D12_SetEndpointStatus(1, 1); //停止控制端点1
27 3 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
28 3 return;
29 3 }
30 2 /******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
31 2 ControlData.DeviceRequest.bmRequestType = req[0];
32 2 ControlData.DeviceRequest.bRequest = req[1];
33 2 ControlData.DeviceRequest.wValue = req[3] * 256 + req[2];
34 2 ControlData.DeviceRequest.wIndex = req[5] * 256 + req[4];
35 2 ControlData.DeviceRequest.wLength = req[7] * 256 + req[6];
36 2
37 2 /******** 接收建立包成功 **********/
38 2 D12_AcknowledgeEndpoint(0); //对控制端点0进行建立包应答
39 2 D12_AcknowledgeEndpoint(1); //对控制端点1进行建立包应答
40 2 ControlData.wLength = ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
41 2
42 2 if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
43 3 //如果控制传输是控制读取
44 3 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
45 3 bEPPflags.bits.control_state = USB_TRANSMIT; //设置为发送状态
46 3 }
47 2 else{ //控制传输是控制写入
48 3 if (ControlData.DeviceRequest.wLength == 0) {
49 4 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
50 4 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
C51 COMPILER V7.50 CHAP_9 10/09/2006 14:43:39 PAGE 2
51 4 }
52 3 else {
53 4 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
54 5 //数据长度出错
55 5 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
56 5 D12_SetEndpointStatus(0, 1); //停止控制端点0
57 5 D12_SetEndpointStatus(1, 1); //停止控制端点1
58 5 }
59 4 else
60 4 bEPPflags.bits.control_state = USB_RECEIVE; //设置为接收状态
61 4 }// set command with data
62 3 }// else set command
63 2 }// if setup packet
64 1
65 1 /***** 下面为控制写入的数据阶段 ***************/
66 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) { //如果为接收状态
67 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
68 2 ControlData.dataBuffer + ControlData.wCount); //从端点0接收数据
69 2 ControlData.wCount += i; //统计已接收的字节数
70 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
- //数据接收完毕
71 3 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
72 3 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
73 3 }
74 2 }else
75 1 bEPPflags.bits.control_state = USB_IDLE; //设置等待状态
76 1 }
77
78 /***************************************
79 ** 函数名称: void ep0_txdone(void)
80 ** 功能描述: 通过端点索引 0 发送数据
81 ** 输 入: 无
82 ** 输 出: 无
83 ***************************************/
84 void ep0_txdone(void)
85 {
86 1 INT16 i = ControlData.wLength - ControlData.wCount; //计算未发送的字节数
87 1
88 1 D12_ReadLastTransactionStatus(1); //清除中断寄存器标志位
89 1
90 1 if (bEPPflags.bits.control_state != USB_TRANSMIT){ //非发送状态
91 2 single_transmit(0, 0);
92 2 return; //返回
93 2 }
94 1
95 1 if( i >= EP0_PACKET_SIZE) { //未发送字节数大于16,发送16个字节
96 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
97 2 ControlData.wCount += EP0_PACKET_SIZE;
98 2 bEPPflags.bits.control_state = USB_TRANSMIT;
99 2 }
100 1 else if( i != 0) { //发送所有未发送的字节
101 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
102 2 ControlData.wCount += i;
103 2 bEPPflags.bits.control_state = USB_IDLE; //置状态为等待状态
104 2 }
105 1 else if (i == 0){
106 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发0个字节
107 2 bEPPflags.bits.control_state = USB_IDLE;
108 2 }
109 1 }
110 /*************************************************************
111 ** 函数名称: void control_handler(void)
C51 COMPILER V7.50 CHAP_9 10/09/2006 14:43:39 PAGE 3
112 ** 功能描述: 控制传输
113 **************************************************************/
114 void control_handler(void)
115 {
116 1 INT8U type, req;
117 1
118 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
119 1 //读取请求代码
120 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
121 1 if (type == USB_STANDARD_REQUEST)
122 1 (*StandardDeviceRequest[req])(); //标准请求处理
123 1 //else if (type == USB_VENDOR_REQUEST) //厂商请求
124 1 // (*VendorDeviceRequest[req])();
125 1 //else if(type == USB_CLASS_REQUEST)
126 1 // (*ClassDeviceRequest[req])(); //类请求,如大容量类
127 1 else
128 1 stall_ep0(); //无效请求,返回STALL
129 1 }
C51 COMPILATION COMPLETE. 1 WARNING(S), 4 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -