📄 chapter9.lst
字号:
426 2 }
427 1 else if (ControlData.DeviceRequest.wValue == 1) //配置设备
428 1 {
429 2 single_transmit(0, 0); //发向一个空包响应
430 2 init_unconfig(); //进入地址状态,禁止0除外的所有端点
431 2 init_config(); //配置处理,允许端点收发
432 2 bEPPflags.bits.configuration = 1; //标志已配置
433 2 } else
434 1 stall_ep0(); //没有该请求,返回STALL
435 1 }
436
437
438 /****************************************
439 ** 函数名称: void get_interface(void)
440 ** 功能描述: 获取接口信息
441 *****************************************/
442 void get_interface(void)
443 {
444 1 uint8 idata txdat = 0; //本设备只有一个接口
445 1 single_transmit(&txdat, 1); //发送一个字节
446 1 }
447
448
449 /****************************************
450 ** 函数名称: void set_interface(void)
451 ** 功能描述: 设置接口信息
452 *****************************************/
453 void set_interface(void)
454 {
455 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
456 1 single_transmit(0, 0); //发送一个空的数据表示执行完毕
457 1 else
458 1 stall_ep0(); //没有该请求,返回STALL
459 1 }
460
461 void get_report(void)
462 {
463 1 single_transmit(0,0);
464 1 }
465
466 void get_idle(void)
467 {
468 1 single_transmit(&idle,1);
469 1 }
470
471 void get_protocol(void)
472 {
473 1 single_transmit(&protocol,1);
474 1 }
475
476 void set_report(void)
477 {
478 1 single_transmit(0,0);
479 1 }
480
481 void set_idle(void)
482 {
483 1 idle = ControlData.DeviceRequest.wValue;
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 9
484 1 single_transmit(0,0);
485 1 }
486
487 void set_protocol(void)
488 {
489 1 protocol = ControlData.DeviceRequest.wValue;
490 1 single_transmit(0,0);
491 1 }
492
493 /*************************************************************
494 ** 函数名称: void control_handler()
495 ** 功能描述: 控制传输
496 **************************************************************/
497 void control_handler()
498 {
499 1 uint8 idata type, req;
500 1
501 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE;
502 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;//读取请求代码
503 1 if (type == USB_STANDARD_REQUEST)
504 1 (*StandardDeviceRequest[req])(); //标准请求处理
505 1 //else if (type == USB_VENDOR_REQUEST) //厂商请求
506 1 // (*VendorDeviceRequest[req])();
507 1 else if(type == USB_CLASS_REQUEST)
508 1 (*ClassDeviceRequest[req])(); //类请求,如大容量类
509 1 else
510 1 stall_ep0(); //无效请求,返回STALL
511 1 }
512
513 /***************************************
514 ** 函数名称: void ep0_rxdone(void)
515 ** 功能描述: 通过端点索引 0 接收数据
516 ** 输 入: 无
517 ** 输 出: 无
518 ***************************************/
519 void ep0_rxdone(void)
520 {
521 1 uint8 idata ep_last, i;
522 1 uint8 idata req[sizeof(DEVICE_REQUEST)];
523 1
524 1 ep_last = D12_ReadLastTransactionStatus(0); //清除中断寄存器状态,取得最后处理状态
525 1 if (ep_last & D12_SETUPPACKET) //如果收到了建立包(Setup包)
526 1 {
527 2 ControlData.wLength = 0; //传输字节总数清0
528 2 ControlData.wCount = 0; //传输字节计数器清0
529 2 if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req) != sizeof(DEVICE_REQUEST) ) //从端点0读8个
-字节失败
530 2 {
531 3 D12_SetEndpointStatus(0, 1); //停止控制端点0
532 3 D12_SetEndpointStatus(1, 1); //停止控制端点1
533 3 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
534 3 return;
535 3 }
536 2 /******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
537 2 ControlData.DeviceRequest.bmRequestType = req[0];
538 2 ControlData.DeviceRequest.bRequest = req[1];
539 2 ControlData.DeviceRequest.wValue = req[3] * 256 + req[2];
540 2 ControlData.DeviceRequest.wIndex = req[5] * 256 + req[4];
541 2 ControlData.DeviceRequest.wLength = req[7] * 256 + req[6];
542 2
543 2 /******** 接收建立包成功 **********/
544 2 D12_AcknowledgeEndpoint(0); //对控制端点0进行建立包应答
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 10
545 2 D12_AcknowledgeEndpoint(1); //对控制端点1进行建立包应答
546 2 ControlData.wLength = ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
547 2 ControlData.wCount = 0;
548 2
549 2 if (ControlData.DeviceRequest.bmRequestType & (uint8)USB_ENDPOINT_DIRECTION_MASK) //如果控制传输是控制读
-取
550 2 {
551 3 bEPPflags.bits.setup_packet = 1;
552 3 bEPPflags.bits.control_state = USB_TRANSMIT; //设置为发送状态
553 3 bEPPflags.bits.transmit_not_end = 0;
554 3 }
555 2 else//控制传输是控制输出(主机OUT)
556 2 {
557 3 if (ControlData.DeviceRequest.wLength == 0)
558 3 {
559 4 bEPPflags.bits.setup_packet = 1;
560 4 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
561 4 }
562 3 else
563 3 {
564 4 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) //数据长度出错
565 4 {
566 5 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
567 5 D12_SetEndpointStatus(0, 1); //停止控制端点0
568 5 D12_SetEndpointStatus(1, 1); //停止控制端点1
569 5 }
570 4 else
571 4 bEPPflags.bits.control_state = USB_RECEIVE; //设置为接收状态
572 4 }// set command with data
573 3 }// else set command
574 2 }// if setup packet
575 1
576 1 /***** 下面为控制写入的数据阶段 ***************/
577 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) //如果为接收状态
578 1 {
579 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,ControlData.dataBuffer + ControlData.wCount); //从端点0接收数据
580 2 ControlData.wCount += i; //统计已接收的字节数
581 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
582 2 { //数据接收完毕
583 3 bEPPflags.bits.setup_packet = 1;
584 3 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
585 3 }
586 2 }
587 1 else
588 1 bEPPflags.bits.control_state = USB_IDLE; //设置等待状态
589 1 }
590
591 /***************************************
592 ** 函数名称: void ep0_txdone(void)
593 ** 功能描述: 通过端点索引 0 发送数据
594 ** 输 入: 无
595 ** 输 出: 无
596 ***************************************/
597 void ep0_txdone(void)
598 {
599 1 int16 idata i = ControlData.wLength - ControlData.wCount; //计算未发送的字节数
600 1
601 1 D12_ReadLastTransactionStatus(1); //清除中断寄存器标志位
602 1
603 1 if (bEPPflags.bits.control_state != USB_TRANSMIT) //非发送状态
604 1 {
605 2 single_transmit(0, 0);
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 11
606 2 return; //返回
607 2 }
608 1
609 1 if( i >= EP0_PACKET_SIZE) //未发送字节数大于16,发送16个字节
610 1 {
611 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
612 2 ControlData.wCount += EP0_PACKET_SIZE;
613 2 bEPPflags.bits.control_state = USB_TRANSMIT;
614 2 }
615 1 else if( i != 0) //发送所有未发送的字节
616 1 {
617 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
618 2 ControlData.wCount += i;
619 2 bEPPflags.bits.control_state = USB_IDLE; //置状态为等待状态
620 2 }
621 1 else if (i == 0)
622 1 {
623 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发0个字节
624 2 bEPPflags.bits.control_state = USB_IDLE;
625 2 }
626 1 }
627
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1677 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 84 ----
IDATA SIZE = 27 27
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 + -