📄 isr.lst
字号:
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN .\Obj\Isr.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c LARGE OPTIMIZE(2,SPEED) BROWSE MODP2 PRINT(.\Obj\Isr.lst) OBJECT(.\Ob
-j\Isr.obj)
line level source
1 #include "..\..\Driver\inc\includes.h"
2
3 #include "mainloop.h"
4 #include "usb100.h"
5
6 extern byte_count byte_cnt;
7
8 extern void bus_reset(void);
9
10 extern void ep0_txdone(void);
11 extern void ep0_rxdone(void);
12
13 extern void ep1_txdone(void);
14 extern void ep1_rxdone(void);
15
16 extern void main_txdone(void);
17 extern void main_rxdone(void);
18
19 extern void dma_eot(void);
20
21 /*
22 //*************************************************************************
23 // Public static data
24 //*************************************************************************
25 */
26
27 extern EPPFLAGS bEPPflags;
28
29 /* Control endpoint TX/RX buffers */
30 extern CONTROL_XFER ControlData;
31
32 /* ISR static vars */
33 unsigned char GenEpBuf[EP1_PACKET_SIZE];
34 unsigned char idata EpBuf[EP2_PACKET_SIZE];
35 IO_REQUEST idata ioRequest;
36 unsigned char ioSize, ioCount;
37 unsigned long ClockTicks = 0;
38
39 extern BOOL bNoRAM;
40
41
42 //USB中断处理
43 usb_isr() interrupt 0
44 {
45 1 DISABLE;
46 1 bEPPflags.bits.bUSB_Busy = 1;
47 1 // fn_usb_isr();
48 1 ENABLE;
49 1 }
50
51 //USB中断服务子程序
52 void fn_usb_isr()
53 {
54 1 unsigned int i_st;
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 2
55 1
56 1 bEPPflags.bits.in_isr = 1;
57 1
58 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
59 1
60 1 if(i_st != 0)
61 1 {
62 2 if(i_st & D12_INT_BUSRESET)
63 2 {
64 3 bus_reset();//USB总线服务
65 3 bEPPflags.bits.bus_reset = 1;
66 3 }
67 2
68 2 if(i_st & D12_INT_EOT)
69 2 {
70 3 dma_eot();//DMA传输结束
71 3 }
72 2 if(i_st & D12_INT_SUSPENDCHANGE)
73 2 {
74 3 bEPPflags.bits.suspend = 1;//挂起改变
75 3 }
76 2
77 2 if(i_st & D12_INT_ENDP0IN) //从主机的角度看为输入
78 2 {
79 3 ep0_txdone();//端点0IN中断
80 3 }
81 2 if(i_st & D12_INT_ENDP0OUT)
82 2 {
83 3 ep0_rxdone();//端点0OUT中断
84 3 }
85 2 if(i_st & D12_INT_ENDP1IN)
86 2 {
87 3 ep1_txdone();//端点1IN中断
88 3 }
89 2 if(i_st & D12_INT_ENDP1OUT)
90 2 {
91 3 ep1_rxdone();//端点1OUT中断
92 3 }
93 2 if(i_st & D12_INT_ENDP2IN)
94 2 {
95 3 main_txdone();//端点2IN中断
96 3 }
97 2 if(i_st & D12_INT_ENDP2OUT)
98 2 {
99 3 main_rxdone();//端点2OUT中断
100 3 }
101 2 }
102 1
103 1 bEPPflags.bits.in_isr = 0;
104 1 bEPPflags.bits.bUSB_Busy = 0;
105 1 // ENABLE;
106 1 }
107
108 sbit D12SUSPD = P3^3;
109
110 //总线复位处理子程序
111 void bus_reset(void)
112 {
113 1 D12SUSPD = 1;
114 1
115 1 ComShowString(1,"收到总线复位信号");
116 1 }
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 3
117
118 //DMA结束处理
119 void dma_eot(void)
120 {
121 1 }
122
123
124 //端点0OUT中断
125 //主机发,设备接收数据后的处理。
126 void ep0_rxdone(void)
127 {
128 1 unsigned char ep_last, i;
129 1
130 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
131 1
132 1 if (ep_last & D12_SETUPPACKET)
133 1 {
134 2 //接收到SETUP包
135 2 ControlData.wLength = 0;
136 2 ControlData.wCount = 0;
137 2
138 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
139 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
140 2 {
141 3 //SETUP包出错,返回
142 3 D12_SetEndpointStatus(0, 1);
143 3 D12_SetEndpointStatus(1, 1); //刷新缓冲区。
144 3 bEPPflags.bits.control_state = USB_IDLE;
145 3 return;
146 3 }
147 2
148 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
149 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
150 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
151 2
152 2 //对控制端点的输入/输出进行应答
153 2 D12_AcknowledgeEndpoint(0); //使缓冲区有效。
154 2 D12_AcknowledgeEndpoint(1);
155 2
156 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
157 2 ControlData.wCount = 0;
158 2 //当主机设置包为读取数据时,将状态切换成发送状态。
159 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
160 2 {
161 3 //从主机传输数据
162 3 bEPPflags.bits.setup_packet = 1;
163 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
164 3 }
165 2 else //接收数据。
166 2 {
167 3 if (ControlData.DeviceRequest.wLength == 0)
168 3 {
169 4 bEPPflags.bits.setup_packet = 1;
170 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
171 4 }
172 3 else //附加数据的设置包
173 3 {
174 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
175 4 {
176 5 //接收数据长度出错。
177 5 bEPPflags.bits.control_state = USB_IDLE;
178 5 D12_SetEndpointStatus(0, 1);
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 4
179 5 D12_SetEndpointStatus(1, 1);
180 5 }
181 4 else
182 4 {
183 5
184 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
185 5 }
186 4 } // set command with data
187 3 } // else set command
188 2 } // if setup packet
189 1
190 1 else if (bEPPflags.bits.control_state == USB_RECEIVE)
191 1 {
192 2 //读取设置包的数据部分.
193 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
194 2 ControlData.dataBuffer + ControlData.wCount);
195 2 ControlData.wCount += i;
196 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) //ControlData.wLength由第1包设置.
197 2 {
198 3 //数据接收完毕
199 3 bEPPflags.bits.setup_packet = 1; //接收设置包完毕,
200 3 bEPPflags.bits.control_state = USB_IDLE;
201 3 }
202 2 }
203 1 else
204 1 {
205 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
206 2 }
207 1 }
208
209 //端点0IN处理MC发送,主机接收.
210 void ep0_txdone(void)
211 {
212 1 short i = ControlData.wLength - ControlData.wCount;
213 1 D12_ReadLastTransactionStatus(1); //清中断标志位
214 1
215 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
216 1 return;//非发送状态,返回
217 1
218 1 if( i >= EP0_PACKET_SIZE)
219 1 {
220 2 //剩下数据大于16字节,发送16字节
221 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
222 2 ControlData.wCount += EP0_PACKET_SIZE;
223 2 bEPPflags.bits.control_state = USB_TRANSMIT;
224 2 }
225 1 else if( i != 0)
226 1 {
227 2 //发送剩下数据 ,数据个数为i个.
228 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
229 2 ControlData.wCount += i;
230 2 bEPPflags.bits.control_state = USB_IDLE;
231 2 }
232 1 else if (i == 0)
233 1 {
234 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
235 2 bEPPflags.bits.control_state = USB_IDLE;
236 2 }
237 1 }
238
239
240
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 5
241 //端点1OUT处理
242 void ep1_txdone(void)
243 {
244 1 D12_ReadLastTransactionStatus(3); //清中断标志位
245 1 }
246
247 //端点1IN处理
248 void ep1_rxdone(void)
249 {
250 1 unsigned char len;
251 1
252 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
253 1 if(len != 0)
254 1 bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
255 1 D12_ReadLastTransactionStatus(2); //清中断标志位
256 1
257 1 }
258
259 //主端点OUT控制
260 void main_txdone(void)
261 {
262 1 // unsigned char len,epstatus;
263 1
264 1
265 1 D12_ReadLastTransactionStatus(5); //清中断标志位
266 1
267 1 //可添加用户代码(进行检测端点号5IN令牌的操作)
268 1 if(byte_cnt.word>0)
269 1 {
270 2 if(byte_cnt.word<64)
271 2 {
272 3 D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
273 3 byte_cnt.word=0;
274 3 }
275 2 else
276 2 {
277 3 byte_cnt.word=byte_cnt.word-64;
278 3 D12_WriteEndpoint(5, 64, EpBuf);
279 3 }
280 2 }
281 1 }
282
283 //主端点IN控制
284 void main_rxdone(void)
285 {
286 1 unsigned char len; //,epstatus;
287 1
288 1 D12_ReadLastTransactionStatus(4); //清中断标志位
289 1 //接收数据
290 1 len = D12_ReadEndpoint(4, 64, EpBuf);
291 1 // epstatus=D12_ReadEndpointStatus(4);
292 1 // epstatus &= 0x60;
293 1 // if (epstatus == 0x60)
294 1 // len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
295 1
296 1 }
297
298
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1284 ----
C51 COMPILER V7.50 ISR 04/16/2007 15:22:56 PAGE 6
CONSTANT SIZE = 17 ----
XDATA SIZE = 22 8
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 70 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -