📄 usbcore.lst
字号:
757 2 {
758 3 //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
759 3 //0为标准请求,1为类请求,2为厂商请求。
760 3 switch((bmRequestType>>5)&0x03)
761 3 {
762 4 case 0: //标准请求
763 4 #ifdef DEBUG0
764 4 Prints("USB标准输出请求:");
765 4 #endif
766 4 //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
767 4 //请求的代码在bRequest中,对不同的请求代码进行散转
768 4 switch(bRequest)
769 4 {
770 5 case CLEAR_FEATURE: //清除特性
771 5 #ifdef DEBUG0
772 5 Prints("清除特性。\r\n");
773 5 #endif
774 5 break;
775 5
776 5 case SET_ADDRESS: //设置地址
777 5 #ifdef DEBUG0
778 5 Prints("设置地址。地址为:");
779 5 PrintHex(wValue&0xFF); //显示所设置的地址
780 5 Prints("\r\n");
781 5 #endif
782 5 D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
783 5 //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
784 5 SendLength=0;
785 5 NeedZeroPacket=1;
786 5 //将数据通过EP0返回
787 5 UsbEp0SendData();
788 5 break;
789 5
790 5 case SET_CONFIGURATION: //设置配置
791 5 #ifdef DEBUG0
792 5 Prints("设置配置。\r\n");
793 5 #endif
794 5 //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
795 5 //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
796 5 //保存当前配置值
797 5 ConfigValue=wValue&0xFF;
798 5 D12SetEndpointEnable(ConfigValue);
799 5 //返回一个0长度的状态数据包
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 14
800 5 SendLength=0;
801 5 NeedZeroPacket=1;
802 5 //将数据通过EP0返回
803 5 UsbEp0SendData();
804 5 break;
805 5
806 5 case SET_DESCRIPTOR: //设置描述符
807 5 #ifdef DEBUG0
808 5 Prints("设置描述符。\r\n");
809 5 #endif
810 5 break;
811 5
812 5 case SET_FEATURE: //设置特性
813 5 #ifdef DEBUG0
814 5 Prints("设置特性。\r\n");
815 5 #endif
816 5 break;
817 5
818 5 case SET_INTERFACE: //设置接口
819 5 #ifdef DEBUG0
820 5 Prints("设置接口。\r\n");
821 5 #endif
822 5 break;
823 5
824 5 default: //未定义的标准请求
825 5 #ifdef DEBUG0
826 5 Prints("错误:未定义的标准输出请求。\r\n");
827 5 #endif
828 5 break;
829 5 }
830 4 break;
831 4
832 4 case 1: //类请求
833 4 #ifdef DEBUG0
834 4 Prints("USB类输出请求:");
835 4 #endif
836 4 switch(bRequest)
837 4 {
838 5 case SET_IDLE:
839 5 #ifdef DEBUG0
840 5 Prints("设置空闲。\r\n");
841 5 #endif
842 5 //只需要返回一个0长度的数据包即可
843 5 SendLength=0;
844 5 NeedZeroPacket=1;
845 5 //将数据通过EP0返回
846 5 UsbEp0SendData();
847 5 break;
848 5
849 5 default:
850 5 #ifdef DEBUG0
851 5 Prints("未知请求。\r\n");
852 5 #endif
853 5 break;
854 5 }
855 4 break;
856 4
857 4 case 2: //厂商请求
858 4 #ifdef DEBUG0
859 4 Prints("USB厂商输出请求:\r\n");
860 4 #endif
861 4 break;
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 15
862 4
863 4 default: //未定义的请求。这里只显示一个报错信息。
864 4 #ifdef DEBUG0
865 4 Prints("错误:未定义的输出请求。\r\n");
866 4 #endif
867 4 break;
868 4 }
869 3 }
870 2 }
871 1 //普通数据输出
872 1 else //if(D12ReadEndpointLastStatus(0)&0x20)之else
873 1 {
874 2 D12ReadEndpointBuffer(0,16,Buffer);
875 2 D12ClearBuffer();
876 2 }
877 1 }
878 ////////////////////////End of function//////////////////////////////
879
880 /********************************************************************
881 函数功能:端点0输入中断处理函数。
882 入口参数:无。
883 返 回:无。
884 备 注:无。
885 ********************************************************************/
886 void UsbEp0In(void)
887 {
888 1 #ifdef DEBUG0
889 1 Prints("USB端点0输入中断。\r\n");
890 1 #endif
891 1 //读最后发送状态,这将清除端点0的中断标志位
892 1 D12ReadEndpointLastStatus(1);
893 1 //发送剩余的字节数
894 1 UsbEp0SendData();
895 1 }
896 ////////////////////////End of function//////////////////////////////
897
898 /********************************************************************
899 函数功能:端点1输出中断处理函数。
900 入口参数:无。
901 返 回:无。
902 备 注:无。
903 ********************************************************************/
904 void UsbEp1Out(void)
905 {
906 1 uint8 Buf[8]; //用来保存8字节的输出输出。
907 1 #ifdef DEBUG0
908 1 Prints("USB端点1输出中断。\r\n");
909 1 #endif
910 1 //读端点最后状态,这将清除端点1输出的中断标志位
911 1 D12ReadEndpointLastStatus(2);
912 1 //从端点1输出缓冲读回8字节数据
913 1 D12ReadEndpointBuffer(2,8,Buf);
914 1 //清除端点缓冲区
915 1 D12ClearBuffer();
916 1
917 1 //输出数据第一字节为LED状态,某位为1时,表示LED亮。
918 1 LEDs=~Buf[0];
919 1
920 1 //输出数据的第二字节非0时,清除发送计数器Count。
921 1 if(Buf[1]!=0)
922 1 {
923 2 Count=0;
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 16
924 2 }
925 1 }
926 ////////////////////////End of function//////////////////////////////
927
928 /********************************************************************
929 函数功能:端点1输入中断处理函数。
930 入口参数:无。
931 返 回:无。
932 备 注:无。
933 ********************************************************************/
934 void UsbEp1In(void)
935 {
936 1 #ifdef DEBUG0
937 1 Prints("USB端点1输入中断。\r\n");
938 1 #endif
939 1 //读最后发送状态,这将清除端点1输入的中断标志位
940 1 D12ReadEndpointLastStatus(3);
941 1 //端点1输入处于空闲状态
942 1 Ep1InIsBusy=0;
943 1 }
944 ////////////////////////End of function//////////////////////////////
945
946 /********************************************************************
947 函数功能:端点2输出中断处理函数。
948 入口参数:无。
949 返 回:无。
950 备 注:无。
951 ********************************************************************/
952 void UsbEp2Out(void)
953 {
954 1 #ifdef DEBUG0
955 1 Prints("USB端点2输出中断。\r\n");
956 1 #endif
957 1 //如果缓冲区中的数据还未通过串口发送完毕,则暂时不处理该中断,直接返回。
958 1 if(UsbEp2ByteCount!=0)return;
959 1
960 1 //读最后接收状态,这将清除端点2输出的中断标志位。
961 1 //注意端点2有个双缓冲机制,在清除中断之前,先检查是否两个缓冲区
962 1 //是否全满了,如果两个缓冲区全满的话,就不用清除中断标志。只有当
963 1 //两个缓冲区不全满的时候才需要清除中断标志。
964 1 if((D12ReadEndpointStatus(4)&0x60)!=0x60)
965 1 {
966 2 D12ReadEndpointLastStatus(4);
967 2 }
968 1
969 1 //读区端点2的数据。返回值为实际读到的数据字节数
970 1 UsbEp2ByteCount=D12ReadEndpointBuffer(4,BUF_LEN,UsbEp2Buffer);
971 1 //清除端点缓冲区
972 1 D12ClearBuffer();
973 1
974 1 //输出位置设为0
975 1 UsbEp2BufferOutputPoint=0;
976 1 }
977 ////////////////////////End of function//////////////////////////////
978
979 /********************************************************************
980 函数功能:端点2输入中断处理函数。
981 入口参数:无。
982 返 回:无。
983 备 注:无。
984 ********************************************************************/
985 void UsbEp2In(void)
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 17
986 {
987 1 #ifdef DEBUG0
988 1 Prints("USB端点2输入中断。\r\n");
989 1 #endif
990 1 //读最后发送状态,这将清除端点2输入的中断标志位
991 1 D12ReadEndpointLastStatus(5);
992 1 //端点2输入处于空闲状态
993 1 Ep2InIsBusy=0;
994 1 }
995 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1278 ----
CONSTANT SIZE = 970 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 8
IDATA SIZE = 16 ----
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 + -