📄 isr.lst
字号:
211 1 }
212
213 //USB中断处理
214 usb_isr() interrupt 0
215 {
216 1 DISABLE;
217 1 fn_usb_isr();
218 1 ENABLE;
219 1
220 1 }
221
222 //USB中断服务子程序
223 void fn_usb_isr()
224 {
225 1 unsigned int i_st;
226 1
227 1
228 1 bEPPflags.bits.in_isr = 1;
229 1
230 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
231 1
232 1 if(i_st != 0) {
233 2 if(i_st & D12_INT_BUSRESET) {
234 3 bus_reset();//USB总线服务
235 3 bEPPflags.bits.bus_reset = 1;
236 3 }
237 2
238 2 if(i_st & D12_INT_EOT)
239 2 dma_eot();//DMA传输结束
240 2
241 2 if(i_st & D12_INT_SUSPENDCHANGE)
C51 COMPILER V6.12 ISR 10/08/2003 08:56:04 PAGE 5
242 2 bEPPflags.bits.suspend = 1;//挂起改变
243 2
244 2 if(i_st & D12_INT_ENDP0IN)
245 2 ep0_txdone();//端点0IN中断
246 2 if(i_st & D12_INT_ENDP0OUT)
247 2 ep0_rxdone();//端点0OUT中断
248 2 if(i_st & D12_INT_ENDP1IN)
249 2 ep1_txdone();//端点1IN中断
250 2 if(i_st & D12_INT_ENDP1OUT)
251 2 ep1_rxdone();//端点1OUT中断
252 2 if(i_st & D12_INT_ENDP2IN)
253 2 main_txdone();//端点2IN中断
254 2 if(i_st & D12_INT_ENDP2OUT)
255 2 main_rxdone();//端点2OUT中断
256 2 }
257 1
258 1 bEPPflags.bits.in_isr = 0;
259 1 }
260
261 //总线复位处理子程序
262 void bus_reset(void)
263 {
264 1 }
265
266 //端点0OUT中断
267 void ep0_rxdone(void)
268 {
269 1 unsigned char ep_last, i;
270 1
271 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
272 1
273 1 if (ep_last & D12_SETUPPACKET) {
274 2 //接收到SETUP包
275 2 ControlData.wLength = 0;
276 2 ControlData.wCount = 0;
277 2
278 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
279 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
280 3 //SETUP包出错,返回
281 3 D12_SetEndpointStatus(0, 1);
282 3 D12_SetEndpointStatus(1, 1);
283 3 bEPPflags.bits.control_state = USB_IDLE;
284 3 return;
285 3 }
286 2
287 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
288 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
289 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
290 2
291 2 //对控制端点的输入/输出进行应答
292 2 D12_AcknowledgeEndpoint(0);
293 2 D12_AcknowledgeEndpoint(1);
294 2
295 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
296 2 ControlData.wCount = 0;
297 2
298 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
299 3 //从主机传输数据
300 3 bEPPflags.bits.setup_packet = 1;
301 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
302 3 }
303 2 else {
C51 COMPILER V6.12 ISR 10/08/2003 08:56:04 PAGE 6
304 3 if (ControlData.DeviceRequest.wLength == 0) {
305 4 bEPPflags.bits.setup_packet = 1;
306 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
307 4 }
308 3 else {
309 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
310 5 //接收数据长度为0
311 5 bEPPflags.bits.control_state = USB_IDLE;
312 5 D12_SetEndpointStatus(0, 1);
313 5 D12_SetEndpointStatus(1, 1);
314 5 }
315 4 else {
316 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
317 5 }
318 4 } // set command with data
319 3 } // else set command
320 2 } // if setup packet
321 1
322 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
323 2 //接收数据
324 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
325 2 ControlData.dataBuffer + ControlData.wCount);
326 2 ControlData.wCount += i;
327 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
328 3 //数据接收完毕
329 3 bEPPflags.bits.setup_packet = 1;
330 3 bEPPflags.bits.control_state = USB_IDLE;
331 3 }
332 2 }
333 1 else {
334 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
335 2 }
336 1 }
337
338 //端点0IN处理
339 void ep0_txdone(void)
340 {
341 1 short i = ControlData.wLength - ControlData.wCount;
342 1 D12_ReadLastTransactionStatus(1); //清中断标志位
343 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
344 1 return;//非发送状态,返回
345 1
346 1 if( i >= EP0_PACKET_SIZE) {
347 2 //剩下数据大于16字节,发送16字节
348 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
349 2 ControlData.wCount += EP0_PACKET_SIZE;
350 2 bEPPflags.bits.control_state = USB_TRANSMIT;
351 2 }
352 1 else if( i != 0) {
353 2 //发送剩下数据
354 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
355 2 ControlData.wCount += i;
356 2 bEPPflags.bits.control_state = USB_IDLE;
357 2 }
358 1 else if (i == 0){
359 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
360 2 bEPPflags.bits.control_state = USB_IDLE;
361 2 }
362 1 }
363
364 //DMA结束处理
365 void dma_eot(void)
C51 COMPILER V6.12 ISR 10/08/2003 08:56:04 PAGE 7
366 {
367 1 }
368
369 //端点1OUT处理
370 void ep1_txdone(void)
371 {
372 1 D12_ReadLastTransactionStatus(3); //清中断标志位
373 1 }
374
375 //端点1IN处理
376 void ep1_rxdone(void)
377 {
378 1 unsigned char len;
379 1
380 1 D12_ReadLastTransactionStatus(2); //清中断标志位
381 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
382 1 if(len != 0)
383 1 bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
384 1 }
385
386 //主端点OUT控制
387 void main_txdone(void)
388 {
389 1 // unsigned char len,epstatus;
390 1
391 1 D12_ReadLastTransactionStatus(5); //清中断标志位
392 1 }
393
394 //主端点IN控制
395 void main_rxdone(void)
396 {
397 1 unsigned char len,epstatus;
398 1 unsigned char i;
399 1 //////////////////////////////
400 1 D12_ReadLastTransactionStatus(4); //清中断标志位
401 1
402 1 //接收数据
403 1 len = D12_ReadEndpoint(4, 64, EpBuf);
404 1 epstatus=D12_ReadEndpointStatus(4);
405 1 epstatus &= 0x60;
406 1 if (epstatus == 0x60)
407 1 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
408 1
409 1
410 1 }
*** WARNING C280 IN LINE 398 OF .\ISR.C: 'i': unreferenced local variable
411
412
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1288 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 11
IDATA SIZE = 86 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -