📄 usb.lst
字号:
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE USB
OBJECT MODULE PLACED IN .\usb.obj
COMPILER INVOKED BY: D:\files\keil\C51\BIN\C51.EXE ..\usb.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\usb.obj)
line level source
1 #include <usb.h>
*** WARNING C318 IN LINE 1 OF ..\usb.c: can't open file 'usb.h'
2 #include <delay.h>
*** WARNING C318 IN LINE 2 OF ..\usb.c: can't open file 'delay.h'
3
4 #include <c8051f020.h>
5 #include <c8051f.h>
*** WARNING C318 IN LINE 5 OF ..\usb.c: can't open file 'c8051f.h'
6 #include <delay.h>
*** WARNING C318 IN LINE 6 OF ..\usb.c: can't open file 'delay.h'
7 #include <stdio.h>
8
9 EVENT_FLAGS EventFlags; //定义为全局变量,用于与主程序的通信
*** ERROR C129 IN LINE 9 OF ..\USB.C: missing ';' before 'EventFlags'
10 CONTROL_XFER xdata ControlData; //保存SETUP包请求类型和请求数据
11 unsigned char xdata EndPoint1Buffer[4]; //控制端点缓存
12 unsigned char xdata EndPoint2Buffer[64];//主端点缓存
13
14 //硬件提取层,多路地址/数据总线方式读写
15 void Outportb(unsigned int Addr, unsigned char Data)
16 {
17 PDIUSB_A0=Addr;
18 Delay1us(5);
19 *((unsigned char xdata *) (0x8000+Addr)) = Data;
20 }
21
22 unsigned char Inportb(unsigned int Addr)
23 {
24 PDIUSB_A0=Addr;
25 Delay1us(5);
26 return *((unsigned char xdata *)(0x8000+Addr));
27 }
28 //**************************************************************************
29 #define D12_DATA 0
30 #define D12_COMMAND 1
31 //PDIUSBD12命令接口函数
32 void D12_SetMode(unsigned char bConfig,unsigned char bClkDiv)
33 {
34 PDIUSB_CS=0;
35 Outportb(D12_COMMAND,0xF3);
36 Outportb(D12_DATA,bConfig);
37 Outportb(D12_DATA,bClkDiv);
38 PDIUSB_CS=1;
39 }
40 //设置端点
41 void D12_SetEndpointStatus(unsigned char bEndp,unsigned char bStalled)
42 {
43 PDIUSB_CS=0;
44 Outportb(D12_COMMAND,0x40+bEndp);
45 Outportb(D12_DATA,bStalled);
46 PDIUSB_CS=1;
47 }
48 //应答!!!!!
49 void D12_AcknowledgeEndpoint(unsigned char endp)
50 {
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 2
51 PDIUSB_CS=0;
52 Outportb(D12_COMMAND,endp);
53 Outportb(D12_COMMAND,0xF1);
54 //if(endp==0)
55 // Outportb(D12_COMMAND,0xF2);
56 PDIUSB_CS=1;
57 }
58 //设置地址使能
59 void D12_SetAddressEnable(unsigned char bAddress,unsigned char bEnable)
60 {
61 PDIUSB_CS=0;
62 Outportb(D12_COMMAND,0xd0);
63 if(bEnable) bAddress |= 0x80;
64 Outportb(D12_DATA,bAddress);
65 PDIUSB_CS=1;
66 }
67 //设置端点使能
68 void D12_SetEndpointEnable(unsigned char bEnable)
69 {
70 PDIUSB_CS=0;
71 Outportb(D12_COMMAND,0xD8);
72 if(bEnable)
73 Outportb(D12_DATA,1);
74 else
75 Outportb(D12_DATA,0);
76 PDIUSB_CS=1;
77 }
78 //读中断寄存器
79 unsigned short D12_ReadInterruptRegister(void)
80 {
81 unsigned char b1;
82 unsigned int j;
83 PDIUSB_CS=0;
84 Outportb(D12_COMMAND,0xF4);
85 b1=Inportb(D12_DATA);
86 j=Inportb(D12_DATA);
87 j<<=8;
88 j+=b1;
89 PDIUSB_CS=1;
90 return j;
91 }
92 //读取端点状态
93 unsigned char D12_ReadEndpointStatus(unsigned char EndPoint)
94 {
95 unsigned char BackValue;
96 PDIUSB_CS=0;
97 if(EventFlags.Bits.InISR == 0)
98 EA = 0;
99
100 Outportb(D12_COMMAND, 0x80 + EndPoint);//读取端点状态
101 BackValue = Inportb(D12_DATA);
102
103 if(EventFlags.Bits.InISR == 0)
104 EA = 1;
105
106 PDIUSB_CS=1;
107 return BackValue;
108 }
109 //读端点最后处理状态
110 unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
111 {
112 unsigned char i;
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 3
113 PDIUSB_CS=0;
114 Outportb(D12_COMMAND,0x40+bEndp);
115 i=Inportb(D12_DATA);
116 PDIUSB_CS=1;
117 return i;
118 }
119 //读端口
120 unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,unsigned char *buf)
121 {
122 unsigned char i,j;
123 PDIUSB_CS=0;
124 Outportb(D12_COMMAND,endp);
125 if((Inportb(D12_DATA)&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newer
126 return 0;
127 Outportb(D12_COMMAND,0x80+endp);
128 i=Inportb(D12_DATA);
129 i=i&0x60;
130
131
132 Outportb(D12_COMMAND,0xF0);
133 j=Inportb(D12_DATA);
134 j=Inportb(D12_DATA);
135 if(j>len)
136 j=len;
137 for(i=0;i<j;i++)
138 *(buf+i)=Inportb(D12_DATA);
139 Outportb(D12_COMMAND,0xF2);
140
141 PDIUSB_CS=1;
142 return j;
143 }
144
145 unsigned char D12_ReadEndpoint_Int(unsigned char endp,unsigned char len,unsigned char *buf)
146 {
147 unsigned char i,j;
148 PDIUSB_CS=0;
149 Outportb(D12_COMMAND,endp);
150 i=Inportb(D12_DATA);
151 if((i&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newer
152 return 0;
153 if(i&0x02) printf("Eendpoint%d stalled\n",(int)endp);
154 Outportb(D12_COMMAND,0x80+endp);
155 i=Inportb(D12_DATA);
156 printf("ep%d status:%#x\n",(int)endp,(int)i);
157 i=i&0x60;
158
159
160 Outportb(D12_COMMAND,0xF0);
161 j=Inportb(D12_DATA);
162 j=Inportb(D12_DATA);
163 printf("data len:%d\n",(int)j);
164 if(j>len)
165 j=len;
166 for(i=0;i<j;i++)
167 *(buf+i)=Inportb(D12_DATA);
168 Outportb(D12_COMMAND,0xF2);
169 PDIUSB_CS=1;
170 return j;
171 }
172
173 unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,unsigned char * buf)
174 {
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 4
175 unsigned char i;
176 PDIUSB_CS=0;
177 Outportb(D12_COMMAND,endp);
178 Inportb(D12_DATA);
179 Outportb(D12_COMMAND,0xF0);
180 Outportb(D12_DATA,0);
181 Outportb(D12_DATA,len);
182 for(i=0;i<len;i++)
183 Outportb(D12_DATA,*(buf+i));
184 Outportb(D12_COMMAND,0xFA);
185 PDIUSB_CS=1;
186 return len;
187 }
188
189 unsigned char D12_WriteEndpoint_Int(unsigned char endp,unsigned char len,unsigned char * buf)
190 {
191 unsigned char i;
192 PDIUSB_CS=0;
193 Outportb(D12_COMMAND,endp);
194 Inportb(D12_DATA);
195 Outportb(D12_COMMAND,0xF0);
196 Outportb(D12_DATA,0);
197 Outportb(D12_DATA,len);
198 for(i=0;i<len;i++)
199 Outportb(D12_DATA,*(buf+i));
200 Outportb(D12_COMMAND,0xFA);
201 PDIUSB_CS=1;
202 return len;
203 }
204
205 void DisconnectUSB(void)
206 {
207 D12_SetMode(0x0e,0x43);//SET TO ONE? by newer
208 }
209
210 void InitialUSBInt(void);
211 void ConnectUSB(void)
212 {
213 EventFlags.Value = 0x0000;
214 D12_SetMode(0x1e,0x43);
215 Delay1ms(100);
216 InitialUSBInt();
217 }
218
219 void ReconnectUSB(void)
220 {
221 SUSPEND = 0;
222 DisconnectUSB();
223 Delay1ms(1000);
224 ConnectUSB();
225 }
226
227 void InitialUSBInt(void)
228 {
229 IT0=0; //低电平中断触发
230 EX0=1; //允许外部中断
231 PX0=0; //优先级低
232 EA =1;
233 }
234
235 //**************************************************************************
236 //Port And Macros And Structure And Union Definitions
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 5
237 #define SWAP(x) ((((x) & 0x00FF) << 8) | (((x) >> 8) & 0x00FF)) //交换高低8位
238 #define MSB(x) (((x) >> 8) & 0x00FF) //取数据高8位
239 #define LSB(x) ((x) & 0x00FF) //取数据低8位
240
241 //**************************************************************************
242 //**************************************************************************
243 //中断服务程序
244 void EP0_Out(void)
245 {
246 unsigned char ep_last,i;
247 ep_last=D12_ReadLastTransactionStatus(0);//interrupt symbol
248
249 printf("ep_last=%#x\n",(int)ep_last);
250
251 if(ep_last&D12_SETUPPACKET)
252 { //recieved SETUP packet ---by newer
253 ControlData.wLength=0;
254 ControlData.wCount=0;
255 if(D12_ReadEndpoint_Int(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&(ControlData.DeviceRequ
-est)))!=sizeof(DEVICE_REQUEST))
256 {
257 printf("DeviceReqest size error!\n");
258 D12_SetEndpointStatus(0,1);
259 D12_SetEndpointStatus(1,1);
260 EventFlags.Bits.ControlState=0; //should define USB_IDLE first --by newer
261 return;
262 }
263 printf("bmRequestType=%#x\t,bRequest=%d\t",(int)ControlData.DeviceRequest.bmRequestType,(int)ControlDa
-ta.DeviceRequest.bRequest);
264 printf("wValue=%d\t,wIndex=%#x\t,wLength=%d\n",ControlData.DeviceRequest.wValue,ControlData.DeviceRequ
-est.wIndex,ControlData.DeviceRequest.wLength);
265 ControlData.DeviceRequest.wValue=SWAP(ControlData.DeviceRequest.wValue);
266 ControlData.DeviceRequest.wIndex=SWAP(ControlData.DeviceRequest.wIndex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -