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

📄 usb.lss

📁 菲利普的pdiusb d12芯片和avr mega8的usb通讯试验代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:

	return c;
}
 7e8:	89 2f       	mov	r24, r25
 7ea:	99 27       	eor	r25, r25
 7ec:	08 95       	ret

000007ee <D12_ReadLastTransactionStatus>:

/************************************************************
** 函数名称: D12_ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点状态
************************************************************/
#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
	INT8U c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0x80 + bEndp);	//读取端点状态命令
	c = inportb(D12_DATA);					//读取端点状态

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return c;
}
#endif

/************************************************************
** 函数名称: D12_ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点最后处理的状态
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);	//输出读取最后处理状态寄存器命令
 7ee:	80 5c       	subi	r24, 0xC0	; 192
 7f0:	68 2f       	mov	r22, r24
 7f2:	83 e0       	ldi	r24, 0x03	; 3
 7f4:	9f ef       	ldi	r25, 0xFF	; 255
 7f6:	0e 94 84 05 	call	0xb08 <outportb>
	return inportb(D12_DATA);				//读取状态
 7fa:	82 e0       	ldi	r24, 0x02	; 2
 7fc:	9f ef       	ldi	r25, 0xFF	; 255
 7fe:	0e 94 9e 05 	call	0xb3c <inportb>
}
 802:	99 27       	eor	r25, r25
 804:	08 95       	ret

00000806 <D12_SetEndpointStatus>:

/************************************************************
** 函数名称: D12_SetEndpointStatus()
** 功能描述: 设置端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
	         INT8U bStalled: 状态值
** 输   出: 端点状态
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
 806:	cf 93       	push	r28
 808:	98 2f       	mov	r25, r24
 80a:	c6 2f       	mov	r28, r22
	if(bEPPflags.bits.in_isr == 0)
 80c:	80 91 60 01 	lds	r24, 0x0160
 810:	85 fd       	sbrc	r24, 5
 812:	01 c0       	rjmp	.+2      	; 0x816 <D12_SetEndpointStatus+0x10>
		DISABLE();
 814:	f8 94       	cli

	outportb(D12_COMMAND, 0x40 + bEndp);	//发送设置端点状态命令
 816:	90 5c       	subi	r25, 0xC0	; 192
 818:	69 2f       	mov	r22, r25
 81a:	83 e0       	ldi	r24, 0x03	; 3
 81c:	9f ef       	ldi	r25, 0xFF	; 255
 81e:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, bStalled);			//设置端点状态
 822:	6c 2f       	mov	r22, r28
 824:	82 e0       	ldi	r24, 0x02	; 2
 826:	9f ef       	ldi	r25, 0xFF	; 255
 828:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 82c:	80 91 60 01 	lds	r24, 0x0160
 830:	85 fd       	sbrc	r24, 5
 832:	01 c0       	rjmp	.+2      	; 0x836 <D12_SetEndpointStatus+0x30>
		ENABLE();
 834:	78 94       	sei
 836:	cf 91       	pop	r28
 838:	08 95       	ret

0000083a <D12_ReadEndpoint>:
}

/************************************************************
** 函数名称: D12_SendResume()
** 功能描述: 传输恢复
** 输   入: 无
** 输   出: 无
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
	outportb(D12_COMMAND, 0xF6);			//设置发送恢复
}
#endif


/************************************************************
** 函数名称: D12_ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输   入: 无
** 输   出: 当前帧号
************************************************************/
#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
	INT16U i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xF5);			//发送读取当前帧数目命令
	i= inportb(D12_DATA);					//读取帧数目的低8位
	j = inportb(D12_DATA);					//读取帧数目的高8位

	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return i;								//返目当前帧数目
}
#endif


/************************************************************
** 函数名称: D12_ReadEndpoint()
** 功能描述: 读取端点数据
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	    	 INT8U len:	     要读取的数据长度
	     	 INT8U * buf:    接收数据指针
** 输   出: 实际读得的字节数
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
 83a:	0f 93       	push	r16
 83c:	1f 93       	push	r17
 83e:	cf 93       	push	r28
 840:	df 93       	push	r29
 842:	98 2f       	mov	r25, r24
 844:	06 2f       	mov	r16, r22
 846:	ea 01       	movw	r28, r20
	INT8U i, j;

	if(bEPPflags.bits.in_isr == 0)
 848:	80 91 60 01 	lds	r24, 0x0160
 84c:	85 fd       	sbrc	r24, 5
 84e:	01 c0       	rjmp	.+2      	; 0x852 <D12_ReadEndpoint+0x18>
		DISABLE();
 850:	f8 94       	cli

	outportb(D12_COMMAND, endp);						//发送选择端点命令
 852:	69 2f       	mov	r22, r25
 854:	83 e0       	ldi	r24, 0x03	; 3
 856:	9f ef       	ldi	r25, 0xFF	; 255
 858:	0e 94 84 05 	call	0xb08 <outportb>
	if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {		//如果缓冲区为空
 85c:	82 e0       	ldi	r24, 0x02	; 2
 85e:	9f ef       	ldi	r25, 0xFF	; 255
 860:	0e 94 9e 05 	call	0xb3c <inportb>
 864:	80 fd       	sbrc	r24, 0
 866:	08 c0       	rjmp	.+16     	; 0x878 <D12_ReadEndpoint+0x3e>
		if(bEPPflags.bits.in_isr == 0)
 868:	80 91 60 01 	lds	r24, 0x0160
 86c:	85 fd       	sbrc	r24, 5
 86e:	01 c0       	rjmp	.+2      	; 0x872 <D12_ReadEndpoint+0x38>
			ENABLE();
 870:	78 94       	sei
		return 0;										//则返回读到0字节
 872:	80 e0       	ldi	r24, 0x00	; 0
 874:	90 e0       	ldi	r25, 0x00	; 0
 876:	27 c0       	rjmp	.+78     	; 0x8c6 <D12_ReadEndpoint+0x8c>
	}

	outportb(D12_COMMAND, 0xF0);						//发送读缓冲区命令
 878:	60 ef       	ldi	r22, 0xF0	; 240
 87a:	83 e0       	ldi	r24, 0x03	; 3
 87c:	9f ef       	ldi	r25, 0xFF	; 255
 87e:	0e 94 84 05 	call	0xb08 <outportb>
	j = inportb(D12_DATA);								//读取保留字节
 882:	82 e0       	ldi	r24, 0x02	; 2
 884:	9f ef       	ldi	r25, 0xFF	; 255
 886:	0e 94 9e 05 	call	0xb3c <inportb>
	j = inportb(D12_DATA);								//读取数据字节的数目/长度
 88a:	82 e0       	ldi	r24, 0x02	; 2
 88c:	9f ef       	ldi	r25, 0xFF	; 255
 88e:	0e 94 9e 05 	call	0xb3c <inportb>
 892:	18 2f       	mov	r17, r24

	if(j > len)											//如果大于要求读的字节数目
 894:	08 17       	cp	r16, r24
 896:	08 f4       	brcc	.+2      	; 0x89a <D12_ReadEndpoint+0x60>
		j = len;										//则只读取要求的字节长度
 898:	10 2f       	mov	r17, r16
		
	for(i=0; i<j; i++)
 89a:	00 e0       	ldi	r16, 0x00	; 0
 89c:	01 17       	cp	r16, r17
 89e:	38 f4       	brcc	.+14     	; 0x8ae <D12_ReadEndpoint+0x74>
		*(buf+i) = inportb(D12_DATA);					//读取要求的字节数目/长度
 8a0:	82 e0       	ldi	r24, 0x02	; 2
 8a2:	9f ef       	ldi	r25, 0xFF	; 255
 8a4:	0e 94 9e 05 	call	0xb3c <inportb>
 8a8:	89 93       	st	Y+, r24
 8aa:	0f 5f       	subi	r16, 0xFF	; 255
 8ac:	f7 cf       	rjmp	.-18     	; 0x89c <D12_ReadEndpoint+0x62>

	outportb(D12_COMMAND, 0xF2);						//清缓冲区,新的信息包才可以重新被接受
 8ae:	62 ef       	ldi	r22, 0xF2	; 242
 8b0:	83 e0       	ldi	r24, 0x03	; 3
 8b2:	9f ef       	ldi	r25, 0xFF	; 255
 8b4:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 8b8:	80 91 60 01 	lds	r24, 0x0160
 8bc:	85 fd       	sbrc	r24, 5
 8be:	01 c0       	rjmp	.+2      	; 0x8c2 <D12_ReadEndpoint+0x88>
		ENABLE();
 8c0:	78 94       	sei

	return j;											//返回读到的字节数
 8c2:	81 2f       	mov	r24, r17
 8c4:	99 27       	eor	r25, r25
 8c6:	df 91       	pop	r29
 8c8:	cf 91       	pop	r28
 8ca:	1f 91       	pop	r17
 8cc:	0f 91       	pop	r16
 8ce:	08 95       	ret

000008d0 <D12_WriteEndpoint>:
}

/************************************************************
** 函数名称: D12_WriteEndpoint()
** 功能描述: 把数据写入端点
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	     	 INT8U len:	     要写入的数据长度
	     	 INT8U * buf:    发送数据指针
** 输   出: 实际写入的字节数
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
 8d0:	0f 93       	push	r16
 8d2:	1f 93       	push	r17
 8d4:	cf 93       	push	r28
 8d6:	df 93       	push	r29
 8d8:	98 2f       	mov	r25, r24
 8da:	06 2f       	mov	r16, r22
 8dc:	ea 01       	movw	r28, r20
	INT8U i;

	if(bEPPflags.bits.in_isr == 0)
 8de:	80 91 60 01 	lds	r24, 0x0160
 8e2:	85 fd       	sbrc	r24, 5
 8e4:	01 c0       	rjmp	.+2      	; 0x8e8 <D12_WriteEndpoint+0x18>
		DISABLE();
 8e6:	f8 94       	cli

	outportb(D12_COMMAND, endp);			//发送选择端点命令
 8e8:	69 2f       	mov	r22, r25
 8ea:	83 e0       	ldi	r24, 0x03	; 3
 8ec:	9f ef       	ldi	r25, 0xFF	; 255
 8ee:	0e 94 84 05 	call	0xb08 <outportb>
	i = inportb(D12_DATA);					//可选地读取一个字节
 8f2:	82 e0       	ldi	r24, 0x02	; 2
 8f4:	9f ef       	ldi	r25, 0xFF	; 255
 8f6:	0e 94 9e 05 	call	0xb3c <inportb>

	outportb(D12_COMMAND, 0xF0);			//发送写缓冲区命令	
 8fa:	60 ef       	ldi	r22, 0xF0	; 240
 8fc:	83 e0       	ldi	r24, 0x03	; 3
 8fe:	9f ef       	ldi	r25, 0xFF	; 255
 900:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, 0);					//写入一个保留字节
 904:	60 e0       	ldi	r22, 0x00	; 0
 906:	82 e0       	ldi	r24, 0x02	; 2
 908:	9f ef       	ldi	r25, 0xFF	; 255
 90a:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, len);				//写入即将写入的字节数目
 90e:	60 2f       	mov	r22, r16
 910:	82 e0       	ldi	r24, 0x02	; 2
 912:	9f ef       	ldi	r25, 0xFF	; 255
 914:	0e 94 84 05 	call	0xb08 <outportb>

	for(i=0; i<len; i++)
 918:	10 e0       	ldi	r17, 0x00	; 0
 91a:	10 17       	cp	r17, r16
 91c:	38 f4       	brcc	.+14     	; 0x92c <D12_WriteEndpoint+0x5c>
		{outportb(D12_DATA, *(buf+i));		//写入指定的字节
 91e:	69 91       	ld	r22, Y+
 920:	82 e0       	ldi	r24, 0x02	; 2
 922:	9f ef       	ldi	r25, 0xFF	; 255
 924:	0e 94 84 05 	call	0xb08 <outportb>
 928:	1f 5f       	subi	r17, 0xFF	; 255
 92a:	f7 cf       	rjmp	.-18     	; 0x91a <D12_WriteEndpoint+0x4a>
		}

	outportb(D12_COMMAND, 0xFA);			//使缓冲区有效
 92c:	6a ef       	ldi	r22, 0xFA	; 250
 92e:	83 e0       	ldi	r24, 0x03	; 3
 930:	9f ef       	ldi	r25, 0xFF	; 255
 932:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 936:	80 91 60 01 	lds	r24, 0x0160
 93a:	85 fd       	sbrc	r24, 5
 93c:	01 c0       	rjmp	.+2      	; 0x940 <D12_WriteEndpoint+0x70>
		ENABLE();
 93e:	78 94       	sei

	return len;								//返回写入的字节数
}
 940:	80 2f       	mov	r24, r16
 942:	99 27       	eor	r25, r25
 944:	df 91       	pop	r29
 946:	cf 91       	pop	r28
 948:	1f 91       	pop	r17
 94a:	0f 91       	pop	r16
 94c:	08 95       	ret

0000094e <D12_AcknowledgeEndpoint>:

/************************************************************
** 函数名称: D12_AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
 94e:	1f 93       	push	r17
 950:	18 2f       	mov	r17, r24
	outportb(D12_COMMAND, endp);			//选择端点
 952:	68 2f       	mov	r22, r24
 954:	83 e0       	ldi	r24, 0x03	; 3
 956:	9f ef       	ldi	r25, 0xFF	; 255
 958:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_COMMAND, 0xF1);			//应答Setup指令
 95c:	61 ef       	ldi	r22, 0xF1	; 241
 95e:	83 e0       	ldi	r24, 0x03	; 3
 960:	9f ef       	ldi	r25, 0xFF	; 255
 962:	0e 94 84 05

⌨️ 快捷键说明

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