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

📄 main.c.lss

📁 AVR单片机控制的PDIUSBD12原程序
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 6e0:	ac 01       	movw	r20, r24
 6e2:	60 e1       	ldi	r22, 0x10	; 16
 6e4:	81 e0       	ldi	r24, 0x01	; 1
 6e6:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 6ea:	80 91 2e 01 	lds	r24, 0x012E
 6ee:	90 91 2f 01 	lds	r25, 0x012F
 6f2:	40 96       	adiw	r24, 0x10	; 16
 6f4:	90 93 2f 01 	sts	0x012F, r25
 6f8:	80 93 2e 01 	sts	0x012E, r24
 6fc:	80 91 22 01 	lds	r24, 0x0122
 700:	8f 73       	andi	r24, 0x3F	; 63
 702:	80 64       	ori	r24, 0x40	; 64
 704:	24 c0       	rjmp	.+72     	; 0x74e <ep0_txdone+0xb2>
 706:	20 97       	sbiw	r28, 0x00	; 0
 708:	d1 f0       	breq	.+52     	; 0x73e <ep0_txdone+0xa2>
 70a:	80 91 30 01 	lds	r24, 0x0130
 70e:	90 91 31 01 	lds	r25, 0x0131
 712:	20 91 2e 01 	lds	r18, 0x012E
 716:	30 91 2f 01 	lds	r19, 0x012F
 71a:	82 0f       	add	r24, r18
 71c:	93 1f       	adc	r25, r19
 71e:	ac 01       	movw	r20, r24
 720:	6c 2f       	mov	r22, r28
 722:	81 e0       	ldi	r24, 0x01	; 1
 724:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 728:	80 91 2e 01 	lds	r24, 0x012E
 72c:	90 91 2f 01 	lds	r25, 0x012F
 730:	8c 0f       	add	r24, r28
 732:	9d 1f       	adc	r25, r29
 734:	90 93 2f 01 	sts	0x012F, r25
 738:	80 93 2e 01 	sts	0x012E, r24
 73c:	05 c0       	rjmp	.+10     	; 0x748 <ep0_txdone+0xac>
 73e:	ae 01       	movw	r20, r28
 740:	60 e0       	ldi	r22, 0x00	; 0
 742:	81 e0       	ldi	r24, 0x01	; 1
 744:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 748:	80 91 22 01 	lds	r24, 0x0122
 74c:	8f 73       	andi	r24, 0x3F	; 63
 74e:	80 93 22 01 	sts	0x0122, r24
 752:	df 91       	pop	r29
 754:	cf 91       	pop	r28
 756:	08 95       	ret

00000758 <main_rxdone>:
//	LED();
}
//主端点OUT控制
void main_rxdone(void)
{
 758:	1f 93       	push	r17
	unsigned char len,epstatus,j;
	j=D12_ReadLastTransactionStatus(4);			//清中断标志位
 75a:	84 e0       	ldi	r24, 0x04	; 4
 75c:	0e 94 9b 01 	call	0x336 <D12_ReadLastTransactionStatus>
	epstatus=D12_ReadEndpointStatus(4);			//读取缓冲区状态
 760:	84 e0       	ldi	r24, 0x04	; 4
 762:	0e 94 bc 01 	call	0x378 <D12_ReadEndpointStatus>
	epstatus &=0x60;
 766:	18 2f       	mov	r17, r24
 768:	10 76       	andi	r17, 0x60	; 96
	//接收数据
	len=D12_ReadEndpoint(4,64,EpBuf);
 76a:	40 91 20 01 	lds	r20, 0x0120
 76e:	50 91 21 01 	lds	r21, 0x0121
 772:	60 e4       	ldi	r22, 0x40	; 64
 774:	84 e0       	ldi	r24, 0x04	; 4
 776:	0e 94 e9 01 	call	0x3d2 <D12_ReadEndpoint>
	if(epstatus==0x60)
 77a:	10 36       	cpi	r17, 0x60	; 96
 77c:	41 f4       	brne	.+16     	; 0x78e <main_rxdone+0x36>
		len=D12_ReadEndpoint(4,64,EpBuf);		//读取双缓冲区数据
 77e:	40 91 20 01 	lds	r20, 0x0120
 782:	50 91 21 01 	lds	r21, 0x0121
 786:	60 e4       	ldi	r22, 0x40	; 64
 788:	84 e0       	ldi	r24, 0x04	; 4
 78a:	0e 94 e9 01 	call	0x3d2 <D12_ReadEndpoint>
 78e:	1f 91       	pop	r17
 790:	08 95       	ret

00000792 <fn_usb_isr>:
 792:	cf 93       	push	r28
 794:	df 93       	push	r29
 796:	f8 94       	cli
 798:	80 91 22 01 	lds	r24, 0x0122
 79c:	80 62       	ori	r24, 0x20	; 32
 79e:	80 93 22 01 	sts	0x0122, r24
 7a2:	0e 94 77 01 	call	0x2ee <D12_ReadInterruptRegister>
 7a6:	ec 01       	movw	r28, r24
 7a8:	00 97       	sbiw	r24, 0x00	; 0
 7aa:	31 f1       	breq	.+76     	; 0x7f8 <fn_usb_isr+0x66>
 7ac:	86 ff       	sbrs	r24, 6
 7ae:	05 c0       	rjmp	.+10     	; 0x7ba <fn_usb_isr+0x28>
 7b0:	80 91 22 01 	lds	r24, 0x0122
 7b4:	82 60       	ori	r24, 0x02	; 2
 7b6:	80 93 22 01 	sts	0x0122, r24
 7ba:	c7 ff       	sbrs	r28, 7
 7bc:	05 c0       	rjmp	.+10     	; 0x7c8 <fn_usb_isr+0x36>
 7be:	80 91 22 01 	lds	r24, 0x0122
 7c2:	84 60       	ori	r24, 0x04	; 4
 7c4:	80 93 22 01 	sts	0x0122, r24
 7c8:	c1 ff       	sbrs	r28, 1
 7ca:	02 c0       	rjmp	.+4      	; 0x7d0 <fn_usb_isr+0x3e>
 7cc:	0e 94 4e 03 	call	0x69c <ep0_txdone>
 7d0:	c0 ff       	sbrs	r28, 0
 7d2:	02 c0       	rjmp	.+4      	; 0x7d8 <fn_usb_isr+0x46>
 7d4:	0e 94 cd 02 	call	0x59a <ep0_rxdone>
 7d8:	c3 ff       	sbrs	r28, 3
 7da:	02 c0       	rjmp	.+4      	; 0x7e0 <fn_usb_isr+0x4e>
 7dc:	0e 94 b8 02 	call	0x570 <ep1_txdone>
 7e0:	c2 ff       	sbrs	r28, 2
 7e2:	02 c0       	rjmp	.+4      	; 0x7e8 <fn_usb_isr+0x56>
 7e4:	0e 94 bc 02 	call	0x578 <ep1_rxdone>
 7e8:	c5 ff       	sbrs	r28, 5
 7ea:	02 c0       	rjmp	.+4      	; 0x7f0 <fn_usb_isr+0x5e>
 7ec:	0e 94 b4 02 	call	0x568 <main_txdone>
 7f0:	c4 ff       	sbrs	r28, 4
 7f2:	02 c0       	rjmp	.+4      	; 0x7f8 <fn_usb_isr+0x66>
 7f4:	0e 94 ac 03 	call	0x758 <main_rxdone>
 7f8:	80 91 22 01 	lds	r24, 0x0122
 7fc:	8f 7d       	andi	r24, 0xDF	; 223
 7fe:	80 93 22 01 	sts	0x0122, r24
 802:	78 94       	sei
 804:	df 91       	pop	r29
 806:	cf 91       	pop	r28
 808:	08 95       	ret

0000080a <reserved>:
**********************************/
//保留子程序
void reserved(void)
{
	stall_ep0();				//返回STALL
 80a:	0e 94 aa 02 	call	0x554 <stall_ep0>
 80e:	08 95       	ret

00000810 <init_unconfig>:
}
//进入地址状态,禁止0除外的所有端点
void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	//禁止除0外的所有端点
 810:	80 e0       	ldi	r24, 0x00	; 0
 812:	0e 94 3c 01 	call	0x278 <D12_SetEndpointEnable>
 816:	08 95       	ret

00000818 <init_config>:
}
//配置处理,允许端点收发
void init_config(void)
{
	D12_SetEndpointEnable(1);	//允许端点收发
 818:	81 e0       	ldi	r24, 0x01	; 1
 81a:	0e 94 3c 01 	call	0x278 <D12_SetEndpointEnable>
 81e:	08 95       	ret

00000820 <single_transmit>:
}
//通过端点索引1发送数据(Data类型)
void single_transmit(unsigned char *buf,unsigned char len)
{
 820:	ac 01       	movw	r20, r24
	if(len <= EP0_PACKET_SIZE)
 822:	61 31       	cpi	r22, 0x11	; 17
 824:	18 f4       	brcc	.+6      	; 0x82c <single_transmit+0xc>
	{
		D12_WriteEndpoint(1,len,buf);
 826:	81 e0       	ldi	r24, 0x01	; 1
 828:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
 82c:	08 95       	ret

0000082e <code_transmit>:
	}
}
//通过端点索引1发送数据(CODE类型)
void code_transmit(unsigned char *pRomData,unsigned short len)
{
 82e:	ac 01       	movw	r20, r24
	ControlData.wCount=0;
 830:	10 92 2f 01 	sts	0x012F, r1
 834:	10 92 2e 01 	sts	0x012E, r1
	if(ControlData.wLength>len)
 838:	80 91 2c 01 	lds	r24, 0x012C
 83c:	90 91 2d 01 	lds	r25, 0x012D
 840:	68 17       	cp	r22, r24
 842:	79 07       	cpc	r23, r25
 844:	20 f4       	brcc	.+8      	; 0x84e <code_transmit+0x20>
		ControlData.wLength=len;				//发送数据长度控制
 846:	70 93 2d 01 	sts	0x012D, r23
 84a:	60 93 2c 01 	sts	0x012C, r22
	ControlData.pData=pRomData;
 84e:	50 93 31 01 	sts	0x0131, r21
 852:	40 93 30 01 	sts	0x0130, r20
	if(ControlData.wLength>=EP0_PACKET_SIZE)
 856:	80 91 2c 01 	lds	r24, 0x012C
 85a:	90 91 2d 01 	lds	r25, 0x012D
 85e:	40 97       	sbiw	r24, 0x10	; 16
 860:	b0 f0       	brcs	.+44     	; 0x88e <code_transmit+0x60>
	{
		D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
 862:	60 e1       	ldi	r22, 0x10	; 16
 864:	81 e0       	ldi	r24, 0x01	; 1
 866:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
		ControlData.wCount += EP0_PACKET_SIZE;
 86a:	80 91 2e 01 	lds	r24, 0x012E
 86e:	90 91 2f 01 	lds	r25, 0x012F
 872:	40 96       	adiw	r24, 0x10	; 16
 874:	90 93 2f 01 	sts	0x012F, r25
 878:	80 93 2e 01 	sts	0x012E, r24
		DISABLE;
 87c:	f8 94       	cli
		bEPPflags.bits.control_state=USB_TRANSMIT;	//标志发送状态
 87e:	80 91 22 01 	lds	r24, 0x0122
 882:	8f 73       	andi	r24, 0x3F	; 63
 884:	80 64       	ori	r24, 0x40	; 64
 886:	80 93 22 01 	sts	0x0122, r24
		ENABLE;
 88a:	78 94       	sei
 88c:	08 95       	ret
	}
	else
	{
		D12_WriteEndpoint(1,ControlData.wLength,pRomData);
 88e:	60 91 2c 01 	lds	r22, 0x012C
 892:	81 e0       	ldi	r24, 0x01	; 1
 894:	0e 94 4d 02 	call	0x49a <D12_WriteEndpoint>
		ControlData.wCount += ControlData.wLength;
 898:	80 91 2e 01 	lds	r24, 0x012E
 89c:	90 91 2f 01 	lds	r25, 0x012F
 8a0:	20 91 2c 01 	lds	r18, 0x012C
 8a4:	30 91 2d 01 	lds	r19, 0x012D
 8a8:	82 0f       	add	r24, r18
 8aa:	93 1f       	adc	r25, r19
 8ac:	90 93 2f 01 	sts	0x012F, r25
 8b0:	80 93 2e 01 	sts	0x012E, r24
		DISABLE;
 8b4:	f8 94       	cli
		bEPPflags.bits.control_state=USB_IDLE;	//标志发送状态	
 8b6:	80 91 22 01 	lds	r24, 0x0122
 8ba:	8f 73       	andi	r24, 0x3F	; 63
 8bc:	80 93 22 01 	sts	0x0122, r24
		ENABLE;
 8c0:	78 94       	sei
 8c2:	08 95       	ret

000008c4 <get_status>:
	}
}
/**********************************
USB标准请求服务子程序
**********************************/
//获取状态
void get_status(void)
{
 8c4:	cf 93       	push	r28
 8c6:	df 93       	push	r29
 8c8:	cd b7       	in	r28, 0x3d	; 61
 8ca:	de b7       	in	r29, 0x3e	; 62
 8cc:	22 97       	sbiw	r28, 0x02	; 2
 8ce:	0f b6       	in	r0, 0x3f	; 63
 8d0:	f8 94       	cli
 8d2:	de bf       	out	0x3e, r29	; 62
 8d4:	0f be       	out	0x3f, r0	; 63
 8d6:	cd bf       	out	0x3d, r28	; 61
	unsigned char endp,txdat[2];
	unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 8d8:	80 91 24 01 	lds	r24, 0x0124
 8dc:	8f 71       	andi	r24, 0x1F	; 31
	unsigned char c;
	if(bRecipient == USB_RECIPIENT_DEVICE)
 8de:	49 f4       	brne	.+18     	; 0x8f2 <get_status+0x2e>
	{																//返回设备状态
		if(bEPPflags.bits.remote_wakeup==1)
 8e0:	80 91 22 01 	lds	r24, 0x0122
 8e4:	84 ff       	sbrs	r24, 4
 8e6:	02 c0       	rjmp	.+4      	; 0x8ec <get_status+0x28>
			txdat[0]=3;												//支持远程唤醒,自供电
 8e8:	83 e0       	ldi	r24, 0x03	; 3
 8ea:	01 c0       	rjmp	.+2      	; 0x8ee <get_status+0x2a>
		else
			txdat[0]=1;
 8ec:	81 e0       	ldi	r24, 0x01	; 1
 8ee:	89 83       	std	Y+1, r24	; 0x01
 8f0:	18 c0       	rjmp	.+48     	; 0x922 <get_status+0x5e>
		txdat[1]=0;
		single_transmit(txdat,2);									//发送数据
	}
	else
		if(bRecipient == USB_RECIPIENT_INTERFACE)
 8f2:	81 30       	cpi	r24, 0x01	; 1
 8f4:	a9 f0       	breq	.+42     	; 0x920 <get_status+0x5c>
		{															//返回接口状态
			txdat[0]=0;
			txdat[1]=0;
			single_transmit(txdat,2);								//发送数据
		}
		else
			if(bRecipient == USB_RECIPIENT_ENDPOINT)
 8f6:	82 30       	cpi	r24, 0x02	; 2
 8f8:	e1 f4       	brne	.+56     	; 0x932 <get_status+0x6e>
			{														//返回端点状态
				endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 8fa:	90 91 28 01 	lds	r25, 0x0128
 8fe:	89 2f       	mov	r24, r25
 900:	83 70       	andi	r24, 0x03	; 3
 902:	28 2f       	mov	r18, r24
 904:	33 27       	eor	r19, r19
				if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 906:	97 ff       	sbrs	r25, 7
 908:	05 c0       	rjmp	.+10     	; 0x914 <get_status+0x50>
					c=D12_SelectEndpoint(endp*2+1);				//读取输入端点状态
 90a:	22 0f       	add	r18, r18
 90c:	33 1f       	adc	r19, r19
 90e:	82 2f       	mov	r24, r18
 910:	8f 5f       	subi	r24, 0xFF	; 255
 912:	02 c0       	rjmp	.+4      	; 0x918 <get_status+0x54>
				else
					c=D12_SelectEndpoint(endp*2);					//读取输出端点状态
 914:	82 2f       	mov	r24, r18
 916:	88 0f       	add	r24, r24
 918:	0e 94 8f 01 	call	0x31e <D12_SelectEndpoint>
				if(c & D12_STALL)
 91c:	81 fd       	sbrc	r24, 1
 91e:	e6 cf       	rjmp	.-52     	; 0x8ec <get_status+0x28>
					txdat[0]=1;										//端点禁止
				else
					txdat[0]=0;										//端点有效
 920:	19 82       	std	Y+1, r1	; 0x01
				txdat[1]=0;
 922:	fe 01       	movw	r30, r28
 924:	31 96       	adiw	r30, 0x01	; 1
 926:	11 82       	std	Z+1, r1	; 0x01
				single_transmit(txdat,2);							//发送数据
 928:	62 e0       	ldi	r22, 0x02	; 2
 92a:	cf 01       	movw	r24, r30
 92c:	0e 94 10 04 	call	0x820 <single_transmit>
 930:	02 c0       	rjmp	.+4      	; 0x936 <get_status+0x72>
			}
			else
				stall_ep0();										//非标准请求,发STALL
 932:	0e 94 aa 02 	call	0x554 <stall_ep0>
 936:	22 96       	adiw	r28, 0x02	; 2
 938:	0f b6       	in	r0, 0x3f	; 63
 93a:	f8 94       	cli
 93c:	de bf       	out	0x3e, r29	; 62
 93e:	0f be       	out	0x3f, r0	; 63
 940:	cd bf       	out	0x3d, r28	; 61
 942:	df 91       	pop	r29
 944:	cf 91       	pop	r28
 946:	08 95       	ret

00000948 <clear_feature>:
}
//清除特性
void clear_feature(void)
{
	unsigned char endp;											//读取请求类型中的接收方
	unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 948:	80 91 24 01 	lds	r24, 0x0124
 94c:	8f 71       	andi	r24, 0x1F	; 31
	if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
 94e:	71 f4       	brne	.+28     	; 0x96c <clear_feature+0x24>
 950:	80 91 26 01 	lds	r24, 0x0126
 954:	90 91 27 01 	lds	r25, 0x0127
 958:	01 97       	sbiw	r24, 0x01	; 1
 95a:	31 f5       	brne	.+76     	; 0x9a8 <clear_feature+0x60>
	{//清除远程唤醒特性
		DISABLE;
 95c:	f8 94       	cli
		bEPPflags.bits.remote_wakeup=0;
 95e:	80 91 22 01 	lds	r24, 0x0122
 962:	8f 7e       	andi	r24, 0xEF	; 239
 964:	80 93 22 01 	sts	0x0122, r24
		ENABLE;
 968:	78 94       	sei
 96a:	18 c0       	rjmp	.+48     	; 0x99c <clear_feature+0x54>
		single_transmit(0,0);										//返回应答
	}
	else
		if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
 96c:	82 30       	cpi	r24, 0x02	; 2
 96e:	e1 f4       	brne	.+56     	; 0x9a8 <clear_feature+0x60>
 970:	80 91 26 01 	lds	r24, 0x0126
 974:	90 91 27 01 	lds	r25, 0x0127
 978:	89 2b       	or	r24, r25
 97a:	b1 f4       	brne	.+44     	; 0x9a8 <clear_feature+0x60>
		{	//清除端点禁止特性,恢复其使用
			endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 97c:	80 91 28 01 	lds	r24, 0x0128
			if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 980:	68 2f       	mov	r22, r24
 982:	60 78       	andi	r22, 0x80	; 128

⌨️ 快捷键说明

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