📄 chap_9.lst
字号:
867 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
868 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
869 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = (UC) Temp;
870 2 D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
871 2 wait_ep0tx();
872 2 ep0out_ack();
873 2 }
874 1 }
875
876
877 //Set_Feature特性设置
878 //不支持测试模式
879 void set_feature(void)
880 {
881 1 unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
882 1 //端点
883 1 if(bRecipient == 0x02 && USB_Device_Request.wValue == 0x0000)
884 1 {
885 2 switch(USB_Device_Request.wIndex)
886 2 {
887 3 case 0x8000 :
888 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
889 3 break;
890 3 case 0x0000 :
891 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
892 3 break;
893 3 case 0x8100 :
894 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
895 3 break;
896 3 case 0x0100 :
897 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
898 3 break;
899 3 case 0x8200 :
900 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
901 3 break;
902 3 case 0x0200 :
903 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
904 3 break;
905 3 case 0x8300 :
906 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
907 3 break;
908 3 case 0x0300 :
909 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
910 3 break;
911 3 case 0x8400 :
912 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
913 3 break;
914 3 case 0x0400 :
915 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
916 3 break;
917 3 case 0x8500 :
918 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
919 3 break;
920 3 case 0x0500 :
921 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
922 3 break;
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 16
923 3 case 0x8600 :
924 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
925 3 break;
926 3 case 0x0600 :
927 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
928 3 break;
929 3 case 0x8700 :
930 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
931 3 break;
932 3 case 0x0700 :
933 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
934 3 break;
935 3 default :
936 3 break;
937 3 }
938 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
939 2 Kernel_Flag.BITS.Endpt_Stall = 1;
940 2 D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
941 2 //D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
942 2 ep0in_ack();
943 2 USB_Device.BITS.Halt = 0;
944 2 }
945 1 else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
946 1 { //远程唤醒
947 2 USB_Device.BITS.Remote_Wakeup = 1;
948 2 ep0in_ack();
949 2 }
950 1 else
951 1 {
952 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
953 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
954 2 while(!USB_Int_Flag.BITS.EP0SETUP)
955 2 {
956 3 //读取ISP1581中断寄存器
957 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
958 3 //回写ISP1581中断寄存器
959 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
960 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
961 3 return;
962 3 }
963 2 USB_Int_Flag.BITS.EP0TX = 0;
964 2 }
965 1 }
966
967
968 //Get_Interface 获取接口状态
969 void get_interface(void)
970 {
971 1 if(USB_Device_Request.wValue != 0)
972 1 {
973 2 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
974 2 while(!USB_Int_Flag.BITS.EP0SETUP)
975 2 {
976 3 //读取ISP1581中断寄存器
977 3 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
978 3 //回写ISP1581中断寄存器
979 3 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
980 3 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
981 3 return;
982 3 }
983 2 USB_Int_Flag.BITS.EP0TX = 0;
984 2 }
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 17
985 1 else
986 1 {
987 2 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
988 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
989 2 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
990 2 if(!USB_Device.BITS.Alter_Interface)
991 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
992 2 else
993 2 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
994 2 wait_ep0tx();
995 2 ep0in_ack();
996 2 }
997 1 }
998
999
1000
1001 //Set_Interface 设置接口状态
1002 void set_interface(void)
1003 {
1004 1 if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0x0100)
1005 1 USB_Device.BITS.Alter_Interface = 1;
1006 1
1007 1 if(USB_Device_Request.wIndex == 0x0100 && USB_Device_Request.wValue == 0)
1008 1 USB_Device.BITS.Alter_Interface = 0;
1009 1
1010 1 if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0)
1011 1 USB_Device.BITS.Alter_Interface = 0;
1012 1
1013 1 ep0in_ack();
1014 1 }
1015
1016
1017
1018 //端点0IN状态响应
1019 void ep0in_ack(void)
1020 {
1021 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
1022 1 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
1023 1 wait_ep0tx();
1024 1 LED=~LED; //LED显示状态
1025 1 }
1026
1027
1028
1029 //等待端点0IN状态响应
1030 void wait_ep0tx(void)
1031 {
1032 1 //end of status stage
1033 1 while(!USB_Int_Flag.BITS.EP0TX)
1034 1 {
1035 2 //读取ISP1581中断寄存器
1036 2 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
1037 2 //回写ISP1581中断寄存器
1038 2 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
1039 2 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
1040 2 return;
1041 2 }
1042 1 USB_Int_Flag.BITS.EP0TX = 0;
1043 1 }
1044
1045
1046 //端点0OUT状态响应
C51 COMPILER V7.50 CHAP_9 10/30/2007 16:17:28 PAGE 18
1047 void ep0out_ack(void)
1048 {
1049 1 //设置状态响应
1050 1 //acknowledge status stage
1051 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
1052 1 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
1053 1 wait_ep0rx();
1054 1 LED=~LED; //LED显示状态
1055 1 }
1056
1057
1058
1059 //等待端点0OUT状态响应
1060 void wait_ep0rx(void)
1061 {
1062 1 while(!USB_Int_Flag.BITS.EP0RX)
1063 1 {
1064 2 //读取ISP1581中断寄存器
1065 2 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
1066 2 //回写ISP1581中断寄存器
1067 2 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
1068 2 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
1069 2 return;
1070 2 }
1071 1 USB_Int_Flag.BITS.EP0RX = 0;
1072 1 }
1073
1074
1075
1076 //从端点读数据
1077 unsigned int read_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
1078 {
1079 1 unsigned int datalen;
1080 1
1081 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
1082 1 datalen = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB;
1083 1 datalen <<= 8;
1084 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -