⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbd12.s

📁 1.实现单片机驱动USBD12的固件
💻 S
📖 第 1 页 / 共 5 页
字号:
	brsh L146
	.dbline 637
; 		ControlData.wLength = len;						//传输数据总字节数不得超过len
	sts _ControlData+8+1,R23
	sts _ControlData+8,R22
L146:
	.dbline 639
; 
; 	ControlData.pData = pRomData;						//传输数据指针指向pRomData
	sts _ControlData+12+1,R21
	sts _ControlData+12,R20
	.dbline 640
; 	if( ControlData.wLength >= EP0_PACKET_SIZE) 
	lds R24,_ControlData+8
	lds R25,_ControlData+8+1
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	brlo L151
	.dbline 641
; 	{		//传输数据总字节数大于端点0最大信息包大小
	.dbline 642
; 		Write_EP(1, EP0_PACKET_SIZE, ControlData.pData);	//发送端点0最大信息包大小个字节
	movw R2,R20
	std y+0,R2
	std y+1,R3
	ldi R18,16
	ldi R16,1
	xcall _Write_EP
	.dbline 643
; 		ControlData.wCount += EP0_PACKET_SIZE;						//统计已发送字节数
	lds R24,_ControlData+10
	lds R25,_ControlData+10+1
	adiw R24,16
	sts _ControlData+10+1,R25
	sts _ControlData+10,R24
	.dbline 645
; 
; 		UEN_GINT();
	bclr 7
	.dbline 646
; 		USB_FLAG.control_state = USB_TRANSMIT;				//标志数据发送状态			
	ldi R24,1
	sts _USB_FLAG+5,R24
	.dbline 647
; 		EN_GINT();
	bset 7
	.dbline 648
; 	}
	xjmp L152
L151:
	.dbline 650
	.dbline 651
	std y+0,R20
	std y+1,R21
	lds R18,_ControlData+8
	ldi R16,1
	xcall _Write_EP
	.dbline 652
	lds R2,_ControlData+8
	lds R3,_ControlData+8+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	sts _ControlData+10+1,R5
	sts _ControlData+10,R4
	.dbline 653
	bclr 7
	.dbline 654
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 655
	bset 7
	.dbline 656
L152:
	.dbline -2
	.dbline 657
; 	else 
; 	{
; 		Write_EP(1, ControlData.wLength, pRomData);		//写入传输数据总字节数
; 		ControlData.wCount += ControlData.wLength;					//统计已发送字节数
; 		UEN_GINT();
; 		USB_FLAG.control_state = USB_IDLE;					//标志空闲状态
; 		EN_GINT();
; 	}
; }
L144:
	adiw R28,2
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r len 22 i
	.dbsym r pRomData 20 pc
	.dbend
	.dbfunc e USB_INT1 _USB_INT1 fV
;              b -> <dead>
;              a -> <dead>
;        int_sta -> R20,R21
	.even
_USB_INT1::
	xcall push_lset
	xcall push_gset1
	.dbline -1
	.dbline 665
; /*******************************************
; 函数名称: USB_INT1
; 功    能: D12中断服务函数
; 参    数: 无   
; 返回值  : 无
; /********************************************/
; void USB_INT1(void)
; {
	.dbline 668
;     uint int_sta;	
;  	uchar a,b;
; 	UEN_GINT();					        //进入D12中断服务程序时关中断
	bclr 7
	.dbline 670
; 
; 	USB_FLAG.in_isr = 1;//-----------------------------
	ldi R24,1
	sts _USB_FLAG+4,R24
	.dbline 671
; 	int_sta=Read_IntR();				//读取PDIUSBD12中断寄存器值
	xcall _Read_IntR
	movw R20,R16
	.dbline 676
; 	//a=int_sta;
; 	//b=int_sta>>8;
; 	//Uart_sendB(a);
; 	//Uart_sendB(b);	
; 	if(int_sta!=0) 
	cpi R16,0
	cpc R16,R17
	breq L163
X1:
	.dbline 677
; 	{
	.dbline 678
; 		if(int_sta&INT_BUSRESET)
	sbrs R20,6
	rjmp L165
	.dbline 679
; 			USB_FLAG.bus_reset=1;			//USB总线复位标志	
	ldi R24,1
	sts _USB_FLAG,R24
L165:
	.dbline 680
; 		if(int_sta&INT_ENDP0IN)
	sbrs R20,1
	rjmp L167
	.dbline 681
; 			Ep0_txdone();							//控制端点发送数据处理
	xcall _Ep0_txdone
L167:
	.dbline 682
; 		if(int_sta&INT_ENDP0OUT)
	sbrs R20,0
	rjmp L169
	.dbline 683
; 			Ep0_rxdone();							//控制端点接收数据处理
	xcall _Ep0_rxdone
L169:
	.dbline 684
; 		if(int_sta&INT_ENDP1IN)
	sbrs R20,3
	rjmp L171
	.dbline 685
; 			Ep1_txdone();							//端点 1发送数据处理
	xcall _Ep1_txdone
L171:
	.dbline 686
; 		if(int_sta&INT_ENDP1OUT)
	sbrs R20,2
	rjmp L173
	.dbline 687
; 			Ep1_rxdone();							//端点 1接收数据处理
	xcall _Ep1_rxdone
L173:
	.dbline 688
; 		if(int_sta&INT_ENDP2IN)
	sbrs R20,5
	rjmp L175
	.dbline 689
; 			Ep2_txdone();							//端点 2发送数据处理
	xcall _Ep2_txdone
L175:
	.dbline 690
; 		if(int_sta&INT_ENDP2OUT)
	sbrs R20,4
	rjmp L177
	.dbline 691
; 			Ep2_rxdone();							//端点 2接收数据处理
	xcall _Ep2_rxdone
L177:
	.dbline 692
; 	}
L163:
	.dbline 693
;    	USB_FLAG.in_isr = 0;
	clr R2
	sts _USB_FLAG+4,R2
	.dbline 695
; 	
;    	EN_GINT();							//退出D12中断服务程序时开中断
	bset 7
	.dbline -2
	.dbline 696
; }
L161:
	xcall pop_gset1
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym l b 1 c
	.dbsym l a 1 c
	.dbsym r int_sta 20 i
	.dbend
	.dbfunc e Ep0_rxdone _Ep0_rxdone fV
;              i -> R20
;        ep_last -> R20
	.even
_Ep0_rxdone::
	xcall push_gset1
	sbiw R28,2
	.dbline -1
	.dbline 704
; /*******************************************
; 函数名称: Ep0_rxdone
; 功    能: 通过端点索引 0 接收数据
; 参    数: 无   
; 返回值  : 无
; /********************************************/
; void Ep0_rxdone(void)
; {
	.dbline 706
; 	uchar ep_last,i;
; 	ep_last=Read_LttransSta(0);			 //清除中断寄存器状态,取得最后处理状态
	clr R16
	xcall _Read_LttransSta
	mov R20,R16
	.dbline 707
; 	if (ep_last&SETUPPACKET) 
	sbrs R16,5
	rjmp L181
	.dbline 708
; 	{					 //如果收到了建立包(Setup包)
	.dbline 709
; 		ControlData.wLength=0;				 		 //传输字节总数清0
	clr R2
	clr R3
	sts _ControlData+8+1,R3
	sts _ControlData+8,R2
	.dbline 710
; 		ControlData.wCount=0;					 		 //传输字节计数器清0
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 711
; 		if(Read_EP(0,sizeof(ControlData.DeviceRequest),(uchar * )(&(ControlData.DeviceRequest)))!= sizeof(DEVICE_REQUEST))//从端点0读8个字节失败 
	ldi R24,<_ControlData
	ldi R25,>_ControlData
	std y+0,R24
	std y+1,R25
	ldi R18,8
	clr R16
	xcall _Read_EP
	cpi R16,8
	breq L185
	.dbline 712
; 		{												 		 
	.dbline 713
; 			Set_EPsta(0,1);				 //停止控制端点0
	ldi R18,1
	clr R16
	xcall _Set_EPsta
	.dbline 714
; 			Set_EPsta(1,1);			 	 //停止控制端点1
	ldi R18,1
	ldi R16,1
	xcall _Set_EPsta
	.dbline 715
; 			USB_FLAG.control_state = USB_IDLE;	 //设置为等待状态
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 716
; 			return;
	xjmp L180
L185:
	.dbline 719
; 		}		
; 		/********  接收建立包成功 **********///-------------------------
; 		Ack_EP(0);						 //对控制端点0进行建立包应答
	clr R16
	xcall _Ack_EP
	.dbline 720
; 		Ack_EP(1);						 //对控制端点1进行建立包应答
	ldi R16,1
	xcall _Ack_EP
	.dbline 721
; 		ControlData.wLength=ControlData.DeviceRequest.wLength; 	 //取出要传输数据的总字节数
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	sts _ControlData+8+1,R3
	sts _ControlData+8,R2
	.dbline 722
; 		ControlData.wCount = 0;//------------------------------
	clr R2
	clr R3
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 724
; 		
; 		if(ControlData.DeviceRequest.bmRequestType&(uchar)USB_ENDPOINT_DIRECTION_MASK)
	lds R2,_ControlData
	sbrs R2,7
	rjmp L191
	.dbline 725
; 		{
	.dbline 727
;  														//如果控制传输是控制读取
; 			 USB_FLAG.setup_packet=1;			//通知control_handler()处理Setup包
	ldi R24,1
	sts _USB_FLAG+2,R24
	.dbline 728
; 			 USB_FLAG.control_state=USB_TRANSMIT;	         	   //设置为发送状态
	sts _USB_FLAG+5,R24
	.dbline 729
; 		}
	xjmp L182
L191:
	.dbline 731
; 		else
; 		{								 			//控制传输是控制写入
	.dbline 732
; 			  if(ControlData.DeviceRequest.wLength==0) 
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	tst R2
	brne L195
	tst R3
	brne L195
X2:
	.dbline 733
; 			  {
	.dbline 734
; 				  USB_FLAG.setup_packet=1;			       //通知control_handler()处理Setup包				  
	ldi R24,1
	sts _USB_FLAG+2,R24
	.dbline 735
; 				  USB_FLAG.control_state=USB_IDLE;	       //设置为等待状态
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 736
; 			  }
	xjmp L182
L195:
	.dbline 738
; 			  else 
; 			  {
	.dbline 739
; 				    if(ControlData.DeviceRequest.wLength>MAX_CTLDAT_SIZE) 
	ldi R24,8
	ldi R25,0
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	cp R24,R2
	cpc R25,R3
	brsh L200
	.dbline 740
; 					{	
	.dbline 742
; 																	 //数据长度出错
; 					     USB_FLAG.control_state=USB_IDLE;	 //设置为等待状态	
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 743
; 					     Set_EPsta(0,1);			  	 //停止控制端点0
	ldi R18,1
	clr R16
	xcall _Set_EPsta
	.dbline 744
; 				 	     Set_EPsta(1,1);			     //停止控制端点1
	ldi R18,1
	ldi R16,1
	xcall _Set_EPsta
	.dbline 745
; 				    }
	xjmp L182
L200:
	.dbline 747
; 				    else
; 					{
	.dbline 748
; 					    USB_FLAG.control_state=USB_RECEIVE;  //设置为接收状态
	ldi R24,2
	sts _USB_FLAG+5,R24
	.dbline 749
; 					}
	.dbline 750
; 			  }// set command with data
	.dbline 751
; 		 }// else set command
	.dbline 752
; 	}// if setup packet
	xjmp L182
L181:
	.dbline 755
; 
; 	/*****  下面为控制写入的数据阶段  ***************/
; 	else if(USB_FLAG.control_state==USB_RECEIVE) 
	lds R24,_USB_FLAG+5
	cpi R24,2
	brne L205
	.dbline 756
; 	{	  	     //如果为接收状态
	.dbline 757
; 			 i=Read_EP(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);	 	     //从端点0接收数据
	ldi R24,<_ControlData+14
	ldi R25,>_ControlData+14
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	add R2,R24
	adc R3,R25
	std y+0,R2
	std y+1,R3
	ldi R18,16
	clr R16
	xcall _Read_EP
	mov R20,R16
	.dbline 758
; 			 ControlData.wCount+=i;					 			  //统计已接收的字节数
	mov R2,R20
	clr R3
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	sts _ControlData+10+1,R5
	sts _ControlData+10,R4
	.dbline 759
; 			 if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength) 
	cpi R16,16
	brne L215
	lds R2,_ControlData+8
	lds R3,_ControlData+8+1
	cp R4,R2
	cpc R5,R3
	brlo L206
L215:
	.dbline 760
; 			 {  		                                                          	//数据接收完毕
	.dbline 761
; 				 USB_FLAG.setup_packet=1;			     	  //通知control_handler()处理Setup包				  
	ldi R24,1
	sts _USB_FLAG+2,R24
	.dbline 762
; 				 USB_FLAG.control_state=USB_IDLE;	          //设置为等待状态
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 763
; 			 }
	.dbline 764
; 	}
	xjmp L206
L205:
	.dbline 766
; 	else 
; 	{
	.dbline 767
; 		 	 USB_FLAG.control_state = USB_IDLE;				  //设置等待状态
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 768
; 	}
L206:
L182:
	.dbline -2
	.dbline 769
; }
L180:
	adiw R28,2
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r ep_last 20 c
	.dbend
	.dbfunc e Ep0_txdone _Ep0_txdone fV
;              i -> R20,R21
	.even
_Ep0_txdone::
	xcall push_gset1
	sbiw R28,2
	.dbline -1
	.dbline 777
; /*******************************************
; 函数名称: Ep0_txdone
; 功    能: 通过端点索引 0 发送数据
; 参    数: 无   
; 返回值  : 无
; /********************************************/
; void Ep0_txdone(void)
; {
	.dbline 778
; 	uint i=ControlData.wLength-ControlData.wCount;	//计算未发送的字节数
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	lds R20,_ControlData+8
	lds R21,_ControlData+8+1
	sub R20,R2
	sbc R21,R3
	.dbline 780
; 
; 	Read_LttransSta(1); 					//清除中断寄存器标志位
	ldi R16,1
	xcall _Read_LttransSta
	.dbline 782
; 
; 	if (USB_FLAG.control_state!=USB_TRANSMIT)
	lds R24,_USB_FLAG+5
	cpi R24,1
	breq L222
	.dbline 783
; 	{	//非发送状态	
	.dbline 784
; 		return;											//返回
	xjmp L219
L222:
	.dbline 786
; 	}	
; 	if(i>=EP0_PACKET_SIZE) 
	cpi R20,16
	ldi R30,0
	cpc R21,R30
	brlo L225
	.dbline 787
; 	{							//未发送字节数大于16,发送16个字节
	.dbline 788
; 		Write_EP(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
	lds R2,_ControlData+12
	lds R3,_ControlData+12+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+0,R4
	std y+1,R5
	ldi R18,16
	ldi R16,1
	xcall _Write_EP
	.dbline 789
; 		ControlData.wCount+= EP0_PACKET_SIZE;
	lds R24,_ControlData+10
	lds R25,_ControlData+10+1
	adiw R24,16
	sts _ControlData+10+1,R25
	sts _ControlData+10,R24
	.dbline 790
; 		USB_FLAG.control_state=USB_TRANSMIT;	
	ldi R24,1
	sts _USB_FLAG+5,R24
	.dbline 791
; 	}
	xjmp L226
L225:
	.dbline 792
; 	else if(i!=0) 
	cpi R20,0
	cpc R20,R21
	breq L231
X3:
	.dbline 793
; 	{									//发送所有未发送的字节
	.dbline 794
; 		Write_EP(1,i,ControlData.pData+ControlData.wCount);
	lds R2,_ControlData+12
	lds R3,_ControlData+12+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+0,R4
	std y+1,R5
	mov R18,R20
	ldi R16,1
	xcall _Write_EP
	.dbline 795
; 		ControlData.wCount+=i;
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	add R2,R20
	adc R3,R21
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 796
; 		USB_FLAG.control_state=USB_IDLE;		//置状态为等待状态
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 797
; 	}
	xjmp L232
L231:
	.dbline 798
; 	else if (i == 0)
	cpi R20,0
	cpc R20,R21
	brne L237
X4:
	.dbline 799
; 	{
	.dbline 800
; 		Write_EP(1, 0, 0); 					//发送完毕,发0个字节
	clr R2
	clr R3
	std y+0,R2
	std y+1,R3
	clr R18
	ldi R16,1
	xcall _Write_EP
	.dbline 801
; 		USB_FLAG.control_state = USB_IDLE;
	clr R2
	sts _USB_FLAG+5,R2
	.dbline 802
; 	}
L237:
L232:
L226:
	.dbline -2
	.dbline 803
; }
L219:
	adiw R28,2
	xcall pop_gset1
	.dbline 0 ; fu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -