📄 usb.lst
字号:
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE USB
OBJECT MODULE PLACED IN usb.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE usb.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h> /* special function register declarations */
2 #include <stdio.h>
3 #include <string.h>
4 #include "d12.h"
5
6
7 unsigned char rcv_data_len;
8
9 void main(void)
10 {
11 1
12 1 init_port(); //初始化I/O口
13 1 init_serial(); //初始化串行口
14 1 init_timer0(); //初始化定时器0
15 1 init_special_interrupts(); //设置中断
16 1 MCU_D12CS = 0x1;
17 1 MCU_D12CS = 0x0;
18 1 bEPPflags.value = 0;
19 1 reconnect_USB(); //重新连接USB
20 1 while( TRUE )
21 1 {
22 2 if (bEPPflags.bits.timer)
23 2 {
24 3 DISABLE; //定时器溢出,检测按键状态
25 3 bEPPflags.bits.timer = 0;
26 3 ENABLE;
27 3 if(bEPPflags.bits.configuration)//设备未配置返回
28 3 check_key_LED();
29 3 }
30 2 if (bEPPflags.bits.bus_reset)
31 2 { //设备复位处理
32 3 DISABLE;
33 3 bEPPflags.bits.bus_reset = 0;
34 3 ENABLE;
35 3 // Release D12's SUSPEND pin after bus reset
36 3 // Enable 74HCT123 pulse generation before disconnect
37 3 D12SUSPD = 1;
38 3 }
39 2 if (bEPPflags.bits.suspend)
40 2 { //挂起改变处理
41 3 DISABLE;
42 3 bEPPflags.bits.suspend= 0;
43 3 ENABLE;
44 3 if(D12SUSPD == 1)
45 3 { //挂起处理
46 4 D12SUSPD = 0;
47 4 P0 = 0xFF;
48 4 P1 = 0xFF;
49 4 P2 = 0xFF;
50 4 P3 = 0xFF;
51 4 D12_SetDMA(0xC3);
52 4 D12SUSPD = 1;
53 4 PCON |= 0x02;
54 4 while (1);
55 4 }
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 2
56 3 }
57 2 if (bEPPflags.bits.setup_packet)
58 2 { //Setup包处理
59 3 DISABLE;
60 3 bEPPflags.bits.setup_packet = 0;
61 3 ENABLE;
62 3 control_handler(); //调用请求处理子程序
63 3 D12SUSPD = 1;
64 3 }
65 2 if(bEPPflags.bits.ep1_rxdone)
66 2 {
67 3 D12_WriteEndpoint(3,rcv_data_len,GenEpBuf);
68 3 bEPPflags.bits.ep1_rxdone = 0 ;
69 3 }
70 2 if(bEPPflags.bits.ep2_rxdone)
71 2 {
72 3 D12_WriteEndpoint(5,rcv_data_len,EpBuf);
73 3 bEPPflags.bits.ep2_rxdone = 0 ;
74 3 }
75 2 }
76 1 }
77
78 //返回stall应答
79 void stall_ep0(void)
80 {
81 1 D12_SetEndpointStatus(0, 1);
82 1 D12_SetEndpointStatus(1, 1);
83 1 }
84
85 //断开USB总线
86 void disconnect_USB(void)
87 {
88 1 // Initialize D12 configuration
89 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
90 1 }
91
92 //连接USB总线
93 void connect_USB(void)
94 {
95 1 // reset event flags
96 1 DISABLE;
97 1 bEPPflags.value = 0;//清除所有状态
98 1 ENABLE;
99 1 // V2.1 enable normal+sof interrupt
100 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
101 1 // Initialize D12 configuration
102 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
103 1 }
104
105 //重新连接到USB总线
106 void reconnect_USB(void)
107 {
108 1 unsigned long clk_cnt;
109 1 MCU_LED0 = 0;
110 1 MCU_LED1 = 0;
111 1 // Pull-down D12's SUSPEND pin
112 1 // Disable 74HCT123 pulse generation before disconnect
113 1 // Release D12's SUSPEND pin after receiving bus reset from host
114 1 D12SUSPD = 0;
115 1 disconnect_USB();
116 1 printf("Wait for 1 second ...\n");
117 1 clk_cnt = ClockTicks;
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 3
118 1 while(ClockTicks < clk_cnt + 20) ;
119 1 connect_USB();
120 1 MCU_LED0 = 1;
121 1 MCU_LED1 = 1;
122 1 }
123
124 //恢复到未配置状态
125 void init_unconfig(void)
126 {
127 1 // unsigned char i;
128 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
129 1 }
130
131 //设置配置状态
132 void init_config(void)
133 {
134 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
135 1 }
136
137 //从端点号1发送数据
138 void single_transmit(unsigned char * buf, unsigned char len)
139 {
140 1 if( len <= EP0_PACKET_SIZE)
141 1 {
142 2 D12_WriteEndpoint(1, len, buf);
143 2 }
144 1 }
145 //发送端点号1建立代码
146 void code_transmit(unsigned char code * pRomData, unsigned short len)
147 {
148 1
149 1 ControlData.wCount = 0;
150 1 if(ControlData.wLength > len) ControlData.wLength = len;
151 1 ControlData.pData = pRomData;
152 1 if( ControlData.wLength >= EP0_PACKET_SIZE)
153 1 {
154 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
155 2 ControlData.wCount += EP0_PACKET_SIZE;
156 2 DISABLE;
157 2 bEPPflags.bits.control_state = USB_TRANSMIT;
158 2 ENABLE;
159 2 }
160 1 else
161 1 {
162 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
163 2 ControlData.wCount += ControlData.wLength;
164 2 DISABLE;
165 2 bEPPflags.bits.control_state = USB_IDLE;
166 2 ENABLE;
167 2 }
168 1 }
169
170 //LED和按键处理子程序
171 void check_key_LED(void)
172 {
173 1 static unsigned char c, last_key = 0xf;
174 1
175 1 c = MCU_SWM0 & MCU_SWM1;
176 1 c &= 0x0f;
177 1 if (c != last_key)
178 1 {
179 2 D12_WriteEndpoint(3, 1, &c);//发送按键状态
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 4
180 2 }
181 1 last_key = c;
182 1 if(bEPPflags.bits.ep1_rxdone)
183 1 {
184 2 DISABLE;
185 2 bEPPflags.bits.ep1_rxdone = 0;
186 2 ENABLE;
187 2 MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
188 2 MCU_LED1 = !(GenEpBuf[3] & 0x2);
189 2 }
190 1 }
191
192 void help_devreq(unsigned char typ, unsigned char req)
193 {
194 1 typ >>= 5;
195 1 if(typ == USB_STANDARD_REQUEST)
196 1 {
197 2 }
198 1 else if(bEPPflags.bits.verbose) printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[t
-yp],req);
199 1 }
200
201 //请求处理子程序
202 void control_handler()
203 {
204 1 unsigned char type, req;
205 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
206 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
207 1 help_devreq(type, req); //显示设备请求
208 1 if (type == USB_STANDARD_REQUEST) (*StandardDeviceRequest[req])();//调用标准请求
209 1 else if (type == USB_VENDOR_REQUEST) (*VendorDeviceRequest[req])();//调用厂商请求
210 1 else stall_ep0();
211 1 }
212
213
214 //定时器0中断处理
215 timer_isr() interrupt 1
216 {
217 1 DISABLE;
218 1 ClockTicks++;
219 1 bEPPflags.bits.timer = 1;
220 1 ENABLE;
221 1 }
222
223 //USB中断处理
224 usb_isr() interrupt 0
225 {
226 1 DISABLE;
227 1 fn_usb_isr();
228 1 ENABLE;
229 1 }
230
231 //USB中断服务子程序
232 void fn_usb_isr()
233 {
234 1 unsigned int i_st;
235 1
236 1 bEPPflags.bits.in_isr = 1;
237 1
238 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
239 1
240 1 if(i_st != 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -