📄 03.htm
字号:
***********<BR>void delay(unsigned int
x) <BR>{<BR>unsigned
int i;<BR>unsigned int
j;<BR>for(i=0;i<x;i++)<BR>for(j=0;j<230;j++);<BR>}<BR>//********************************************<BR><BR>unsigned
char remove_enable;<BR><BR>void
read_usb_status(void) //读USB状态寄存器<BR>{<BR>status_Register=0;<BR>if(EORINT){status_bus_reset=1;USBINT=USBINT
&
(~0x10);return;}<BR>if(SPINT){status_suspend_change=1;USBINT=USBINT
&
(~0x01);return;}<BR>UEPNUM=0;<BR>if(RXSETUP){status_setup_packet=1;status_control_out_port=1;return;}<BR>status_control_out_port
= RXOUTB0;<BR>status_control_in_port =
NAKIN;<BR>cls_NAKIN();<BR>UEPNUM=1;<BR>status_main_in_port=NAKIN;<BR>cls_NAKIN();<BR>UEPNUM=2;<BR>status_main_out_port=(RXOUTB0
|| RXOUTB1);<BR>USBINT=0x00;<BR>}<BR><BR>void
set_endpoint_enable(void) //端点使能<BR>{<BR>UEPNUM=0;<BR>UEPCONX=0x80;<BR>UEPNUM=1;<BR>UEPCONX=0x86;<BR>UEPNUM=2;<BR>UEPCONX=0x82;<BR>}<BR><BR><BR>unsigned
char error_count;<BR>void error(unsigned char
number) //出错处理<BR>{<BR>number=0;<BR>error_count++;<BR>LCD_go_home();<BR>prints(" ");<BR>LCD_line_feed();<BR>prints(" ");<BR>LCD_go_home();<BR>prints("Error:");<BR>printf(error_count);<BR>}<BR><BR>unsigned
char read_endpoint_buff(unsigned char endp,unsigned char
len,unsigned char * buff) //读终端点缓冲<BR>{<BR>unsigned
char
i,j;<BR>UEPNUM=endp; //选择端点<BR>j=UBYCTX; //读字节数<BR>if(j>len)j=len;<BR>for(i=0;i<j;i++)<BR> {<BR> buff[i]=UEPDATX;<BR> }<BR>if(RXOUTB0){UEPSTAX=UEPSTAX
& (~0x42); return j;} //清除RXOUTB0
位<BR>if(RXOUTB1){UEPSTAX=UEPSTAX & (~0x42); return
j;} //清除RXOUTB1 位<BR>}<BR><BR>unsigned char
write_endpoint_buff(unsigned char endp,unsigned char len,unsigned
char * buff) //写终端点缓冲<BR>{<BR>unsigned char
i;<BR>remove_enable=0;<BR>UEPNUM=endp; //选择端点<BR>for(i=0;i<len;i++) //填数据寄存器<BR> {<BR> UEPDATX=buff[i];<BR> }<BR>UEPSTAX=UEPSTAX
| 0x10; //设置TXRDY位<BR>while(!( UEPSTAX
& 0x01
)); //等待TXCMP<BR>UEPSTAX=UEPSTAX
&
(~0x01); //清除TXCMP<BR>return
len;<BR>}<BR><BR>void
disconnect_usb(void)<BR>{<BR>USB_CONNECT=1;<BR>delay(100);<BR>}<BR><BR>void
connect_usb(void) //连接USB<BR>{<BR>USB_CONNECT=0;<BR>}<BR><BR>void
init_usb(void) //初始化USB<BR>{<BR>usb_flags_Register=0;<BR>SCSI_Command=1;<BR>SCSI_Data=0;<BR>csw.dCSWSignature=0x55534253;<BR><BR>USBIEN=0x00; //不允许USB中断<BR>USBCLK=0x03; <BR>USBCON=0x80;<BR>set_endpoint_enable();<BR>UEPRST=0x07; //端点FIFO复位<BR>UEPRST=0x00;<BR>}<BR><BR>void
usb_bus_reset(void) //USB总线复位处理<BR>{<BR>usb_flags_Register=0;<BR>SCSI_Command=1;<BR>SCSI_Data=0;<BR>csw.dCSWSignature=0x55534253;<BR>USBADDR=0x80;<BR>LCD_go_home();<BR>prints(" ");<BR>LCD_line_feed();<BR>prints(" ");<BR>LCD_go_home();<BR>prints("移动硬盘模式");<BR>LCD_line_feed();<BR>prints("运行中......");<BR>remove_enable=0;<BR>}<BR><BR>void
usb_bus_suspend(void) //USB总线挂起处理<BR>{<BR>LCD_go_home();<BR>prints("现在可以安全的
");<BR>LCD_line_feed();<BR>prints("拔下USB 连线了
");<BR>remove_enable=1;<BR>}<BR><BR>void
set_usb_address(void) //设置地址<BR>{<BR>USB_set_addr=1;<BR>write_endpoint_buff(0,0,0);<BR>USBADDR=0x80
| (Control_Data.DeviceRequest.wValue);<BR>USBCON=USBCON |
0x01;<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>}<BR><BR>void
get_status(unsigned char
receiver) //获取状态响应<BR>{<BR>unsigned
char status[2];<BR>switch
(receiver)<BR> {<BR> case
0: //获取设备状态<BR> status[0]=0x00;<BR> status[1]=0x00;<BR> break;<BR> case
1: //获取接口状态<BR> status[0]=0x00;<BR> status[0]=0x00;<BR> break;<BR> case
2: //获取端点状态<BR> status[0]=0x00;<BR> status[1]=0x00;<BR> break;<BR> }<BR> UEPNUM=0;<BR> UEPSTAX=(UEPSTAX
|
0x80); //数据阶段的输入<BR> write_endpoint_buff(0,2,status);<BR> UEPSTAX=(UEPSTAX
& (~0x80));<BR> USB_usb_endp0_in=0;<BR>}<BR><BR>void
clear_feature(unsigned char
receiver) <BR>{<BR>receiver=0;<BR>write_endpoint_buff(0,0,0);<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>}<BR><BR>void
set_feature(unsigned char
receiver)<BR>{<BR>receiver=0;<BR>write_endpoint_buff(0,0,0);<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>}<BR><BR>void
set_descriptor(void)<BR>{<BR>write_endpoint_buff(0,0,0);<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>}<BR><BR>void
set_configuration(void)<BR>{<BR>write_endpoint_buff(0,0,0);<BR>USBCON=USBCON
|
0x02;<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>UEPNUM=1;<BR>UEPCONX
= 0x86 ;<BR>UEPNUM=2;<BR>UEPCONX =
0x82;<BR>LCD_go_home();<BR>prints(" ");<BR>LCD_line_feed();<BR>prints(" ");<BR>LCD_go_home();<BR>prints("移动硬盘模式");<BR>LCD_line_feed();<BR>prints("运行中......");<BR>}<BR><BR>void
get_configuration(void) //获取配置状态<BR>{<BR>unsigned
char value=0x01;<BR>UEPNUM=0;<BR>UEPSTAX=(UEPSTAX |
0x80); //数据阶段的输入<BR>write_endpoint_buff(0,1,&value);<BR>UEPSTAX=(UEPSTAX
& (~0x80));<BR>USB_usb_endp0_in=0;<BR>}<BR><BR>void
set_interface(void) //设置接口<BR>{<BR>write_endpoint_buff(0,0,0);<BR>USB_usb_endp0_in=0;<BR>USB_setup_packet_out=0;<BR>}<BR><BR>void
get_interface(void) //获取接口状态<BR>{<BR>unsigned
char value=0x01;<BR>UEPNUM=0;<BR>UEPSTAX=(UEPSTAX |
0x80); //数据阶段的输入<BR>write_endpoint_buff(0,1,&value);<BR>UEPSTAX=(UEPSTAX
& (~0x80));<BR>USB_usb_endp0_in=0;<BR>}<BR><BR>void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -