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

📄 usb.lss

📁 菲利普的pdiusb d12芯片和avr mega8的usb通讯试验代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 616:	24 c0       	rjmp	.+72     	; 0x660 <ep0_txdone+0xbc>
	}
	else if( i != 0) {									//发送所有未发送的字节
 618:	20 97       	sbiw	r28, 0x00	; 0
 61a:	d1 f0       	breq	.+52     	; 0x650 <ep0_txdone+0xac>
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 61c:	80 91 6e 01 	lds	r24, 0x016E
 620:	90 91 6f 01 	lds	r25, 0x016F
 624:	20 91 6c 01 	lds	r18, 0x016C
 628:	30 91 6d 01 	lds	r19, 0x016D
 62c:	82 0f       	add	r24, r18
 62e:	93 1f       	adc	r25, r19
 630:	ac 01       	movw	r20, r24
 632:	6c 2f       	mov	r22, r28
 634:	81 e0       	ldi	r24, 0x01	; 1
 636:	0e 94 68 04 	call	0x8d0 <D12_WriteEndpoint>
		ControlData.wCount += i;
 63a:	80 91 6c 01 	lds	r24, 0x016C
 63e:	90 91 6d 01 	lds	r25, 0x016D
 642:	8c 0f       	add	r24, r28
 644:	9d 1f       	adc	r25, r29
 646:	90 93 6d 01 	sts	0x016D, r25
 64a:	80 93 6c 01 	sts	0x016C, r24
 64e:	05 c0       	rjmp	.+10     	; 0x65a <ep0_txdone+0xb6>
		bEPPflags.bits.control_state = USB_IDLE;		//置状态为等待状态
	}
	else if (i == 0){
		D12_WriteEndpoint(1, 0, 0); 					//发送完毕,发0个字节
 650:	ae 01       	movw	r20, r28
 652:	60 e0       	ldi	r22, 0x00	; 0
 654:	81 e0       	ldi	r24, 0x01	; 1
 656:	0e 94 68 04 	call	0x8d0 <D12_WriteEndpoint>
		bEPPflags.bits.control_state = USB_IDLE;
 65a:	80 91 60 01 	lds	r24, 0x0160
 65e:	8f 73       	andi	r24, 0x3F	; 63
 660:	80 93 60 01 	sts	0x0160, r24
 664:	df 91       	pop	r29
 666:	cf 91       	pop	r28
 668:	08 95       	ret

0000066a <D12_ReadChipID>:
** 输   入: 无
** 输   出: 芯片的ID号
************************************************************/
INT16U D12_ReadChipID(void)
{
 66a:	cf 93       	push	r28
 66c:	df 93       	push	r29
	INT16U i,j;

	if(bEPPflags.bits.in_isr == 0)
 66e:	80 91 60 01 	lds	r24, 0x0160
 672:	85 fd       	sbrc	r24, 5
 674:	01 c0       	rjmp	.+2      	; 0x678 <D12_ReadChipID+0xe>
		DISABLE();
 676:	f8 94       	cli

	outportb(D12_COMMAND, 0xFD);		//发送读PDIUSBD12芯片ID号命令	
 678:	6d ef       	ldi	r22, 0xFD	; 253
 67a:	83 e0       	ldi	r24, 0x03	; 3
 67c:	9f ef       	ldi	r25, 0xFF	; 255
 67e:	0e 94 84 05 	call	0xb08 <outportb>
	i=inportb(D12_DATA);				//读取ID号低字节
 682:	82 e0       	ldi	r24, 0x02	; 2
 684:	9f ef       	ldi	r25, 0xFF	; 255
 686:	0e 94 9e 05 	call	0xb3c <inportb>
 68a:	c8 2f       	mov	r28, r24
 68c:	dd 27       	eor	r29, r29
	j=inportb(D12_DATA);				//读取ID号高位字节
 68e:	82 e0       	ldi	r24, 0x02	; 2
 690:	9f ef       	ldi	r25, 0xFF	; 255
 692:	0e 94 9e 05 	call	0xb3c <inportb>
 696:	99 27       	eor	r25, r25

	i += (j<<8);						//组成16位的PDIUSBD12芯片ID号
 698:	98 2f       	mov	r25, r24
 69a:	88 27       	eor	r24, r24
 69c:	c8 0f       	add	r28, r24
 69e:	d9 1f       	adc	r29, r25

    
	if(bEPPflags.bits.in_isr == 0)
 6a0:	80 91 60 01 	lds	r24, 0x0160
 6a4:	85 fd       	sbrc	r24, 5
 6a6:	01 c0       	rjmp	.+2      	; 0x6aa <D12_ReadChipID+0x40>
		ENABLE();
 6a8:	78 94       	sei

	return i;
}
 6aa:	ce 01       	movw	r24, r28
 6ac:	df 91       	pop	r29
 6ae:	cf 91       	pop	r28
 6b0:	08 95       	ret

000006b2 <D12_SetAddressEnable>:

/************************************************************
** 函数名称: D12_SetAddressEnable()
** 功能描述: 设置地址/使能
** 输   入: INT8U bAddress:  地址
	     	 INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 使能
** 输   出: 无
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
 6b2:	1f 93       	push	r17
 6b4:	cf 93       	push	r28
 6b6:	c8 2f       	mov	r28, r24
 6b8:	16 2f       	mov	r17, r22
	if(bEPPflags.bits.in_isr == 0)
 6ba:	80 91 60 01 	lds	r24, 0x0160
 6be:	85 fd       	sbrc	r24, 5
 6c0:	01 c0       	rjmp	.+2      	; 0x6c4 <D12_SetAddressEnable+0x12>
		DISABLE();
 6c2:	f8 94       	cli

	outportb(D12_COMMAND, 0xD0);	//输出设置地址/使能指令
 6c4:	60 ed       	ldi	r22, 0xD0	; 208
 6c6:	83 e0       	ldi	r24, 0x03	; 3
 6c8:	9f ef       	ldi	r25, 0xFF	; 255
 6ca:	0e 94 84 05 	call	0xb08 <outportb>
	if(bEnable)
 6ce:	11 11       	cpse	r17, r1
		bAddress |= 0x80;			//bit7置1,使能
 6d0:	c0 68       	ori	r28, 0x80	; 128
	outportb(D12_DATA, bAddress);	//输出设置值
 6d2:	6c 2f       	mov	r22, r28
 6d4:	82 e0       	ldi	r24, 0x02	; 2
 6d6:	9f ef       	ldi	r25, 0xFF	; 255
 6d8:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 6dc:	80 91 60 01 	lds	r24, 0x0160
 6e0:	85 fd       	sbrc	r24, 5
 6e2:	01 c0       	rjmp	.+2      	; 0x6e6 <D12_SetAddressEnable+0x34>
		ENABLE();
 6e4:	78 94       	sei
 6e6:	cf 91       	pop	r28
 6e8:	1f 91       	pop	r17
 6ea:	08 95       	ret

000006ec <D12_SetEndpointEnable>:
}


/************************************************************
** 函数名称: D12_SetEndpointEnable()
** 功能描述: 设置端点使能
** 输   入: INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 允许
** 输   出: 无
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
 6ec:	cf 93       	push	r28
 6ee:	c8 2f       	mov	r28, r24
	if(bEPPflags.bits.in_isr == 0)
 6f0:	80 91 60 01 	lds	r24, 0x0160
 6f4:	85 fd       	sbrc	r24, 5
 6f6:	01 c0       	rjmp	.+2      	; 0x6fa <D12_SetEndpointEnable+0xe>
		DISABLE();
 6f8:	f8 94       	cli

	outportb(D12_COMMAND, 0xD8);	//输出设置端点使能指令
 6fa:	68 ed       	ldi	r22, 0xD8	; 216
 6fc:	83 e0       	ldi	r24, 0x03	; 3
 6fe:	9f ef       	ldi	r25, 0xFF	; 255
 700:	0e 94 84 05 	call	0xb08 <outportb>
	if(bEnable)
 704:	cc 23       	and	r28, r28
 706:	11 f0       	breq	.+4      	; 0x70c <D12_SetEndpointEnable+0x20>
		outportb(D12_DATA, 1);		//设置端点允许
 708:	61 e0       	ldi	r22, 0x01	; 1
 70a:	01 c0       	rjmp	.+2      	; 0x70e <D12_SetEndpointEnable+0x22>
	else
		outportb(D12_DATA, 0);		//设置端点禁止
 70c:	6c 2f       	mov	r22, r28
 70e:	82 e0       	ldi	r24, 0x02	; 2
 710:	9f ef       	ldi	r25, 0xFF	; 255
 712:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 716:	80 91 60 01 	lds	r24, 0x0160
 71a:	85 fd       	sbrc	r24, 5
 71c:	01 c0       	rjmp	.+2      	; 0x720 <D12_SetEndpointEnable+0x34>
		ENABLE();
 71e:	78 94       	sei
 720:	cf 91       	pop	r28
 722:	08 95       	ret

00000724 <D12_SetMode>:
}

/************************************************************
** 函数名称: void D12_SetMode()
** 功能描述: 模式设置
** 输   入: INT8U bConfig:  配置字节信息
	     	 INT8U bClkDiv:  分频系数
** 输   出: 无
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
 724:	1f 93       	push	r17
 726:	cf 93       	push	r28
 728:	c8 2f       	mov	r28, r24
 72a:	16 2f       	mov	r17, r22
	if(bEPPflags.bits.in_isr == 0)
 72c:	80 91 60 01 	lds	r24, 0x0160
 730:	85 fd       	sbrc	r24, 5
 732:	01 c0       	rjmp	.+2      	; 0x736 <D12_SetMode+0x12>
		DISABLE();
 734:	f8 94       	cli

	outportb(D12_COMMAND, 0xF3);		//输出设置模式指令
 736:	63 ef       	ldi	r22, 0xF3	; 243
 738:	83 e0       	ldi	r24, 0x03	; 3
 73a:	9f ef       	ldi	r25, 0xFF	; 255
 73c:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, bConfig);		//输出配置字节信息
 740:	6c 2f       	mov	r22, r28
 742:	82 e0       	ldi	r24, 0x02	; 2
 744:	9f ef       	ldi	r25, 0xFF	; 255
 746:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, bClkDiv);		//输出时钟分频因数字节
 74a:	61 2f       	mov	r22, r17
 74c:	82 e0       	ldi	r24, 0x02	; 2
 74e:	9f ef       	ldi	r25, 0xFF	; 255
 750:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 754:	80 91 60 01 	lds	r24, 0x0160
 758:	85 fd       	sbrc	r24, 5
 75a:	01 c0       	rjmp	.+2      	; 0x75e <D12_SetMode+0x3a>
		ENABLE();	
 75c:	78 94       	sei
 75e:	cf 91       	pop	r28
 760:	1f 91       	pop	r17
 762:	08 95       	ret

00000764 <D12_SetDMA>:
}

/************************************************************
** 函数名称: void D12_SetDMA()
** 功能描述: 设置DMA工作方式设置
** 输   入: INT8U bMode: 	设置值
** 输   出: 无
************************************************************/
void D12_SetDMA(INT8U bMode)
{
 764:	cf 93       	push	r28
 766:	c8 2f       	mov	r28, r24
	if(bEPPflags.bits.in_isr == 0)
 768:	80 91 60 01 	lds	r24, 0x0160
 76c:	85 fd       	sbrc	r24, 5
 76e:	01 c0       	rjmp	.+2      	; 0x772 <D12_SetDMA+0xe>
		DISABLE();
 770:	f8 94       	cli

	outportb(D12_COMMAND, 0xFB);	//设置DMA工作方命令
 772:	6b ef       	ldi	r22, 0xFB	; 251
 774:	83 e0       	ldi	r24, 0x03	; 3
 776:	9f ef       	ldi	r25, 0xFF	; 255
 778:	0e 94 84 05 	call	0xb08 <outportb>
	outportb(D12_DATA, bMode);		//输出设置值
 77c:	6c 2f       	mov	r22, r28
 77e:	82 e0       	ldi	r24, 0x02	; 2
 780:	9f ef       	ldi	r25, 0xFF	; 255
 782:	0e 94 84 05 	call	0xb08 <outportb>

	if(bEPPflags.bits.in_isr == 0)
 786:	80 91 60 01 	lds	r24, 0x0160
 78a:	85 fd       	sbrc	r24, 5
 78c:	01 c0       	rjmp	.+2      	; 0x790 <D12_SetDMA+0x2c>
		ENABLE();			
 78e:	78 94       	sei
 790:	cf 91       	pop	r28
 792:	08 95       	ret

00000794 <D12_ReadInterruptRegister>:
}

/************************************************************
** 函数名称: D12_ReadInterruptRegister()
** 功能描述: 读取中断寄存器值
** 输   入: 无
** 输   出: 中断寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
 794:	1f 93       	push	r17
	INT8U b1;
	INT16U j;

	outportb(D12_COMMAND, 0xF4);	//读取中断寄存器命令
 796:	64 ef       	ldi	r22, 0xF4	; 244
 798:	83 e0       	ldi	r24, 0x03	; 3
 79a:	9f ef       	ldi	r25, 0xFF	; 255
 79c:	0e 94 84 05 	call	0xb08 <outportb>
	b1 = inportb(D12_DATA);			//读取低8位字节
 7a0:	82 e0       	ldi	r24, 0x02	; 2
 7a2:	9f ef       	ldi	r25, 0xFF	; 255
 7a4:	0e 94 9e 05 	call	0xb3c <inportb>
 7a8:	18 2f       	mov	r17, r24
	j = inportb(D12_DATA);			//读取高8位字节
 7aa:	82 e0       	ldi	r24, 0x02	; 2
 7ac:	9f ef       	ldi	r25, 0xFF	; 255
 7ae:	0e 94 9e 05 	call	0xb3c <inportb>
 7b2:	99 27       	eor	r25, r25

	j <<= 8;
 7b4:	98 2f       	mov	r25, r24
 7b6:	88 27       	eor	r24, r24
	j += b1;						//组合为16位

	return j;
}
 7b8:	81 0f       	add	r24, r17
 7ba:	91 1d       	adc	r25, r1
 7bc:	1f 91       	pop	r17
 7be:	08 95       	ret

000007c0 <D12_SelectEndpoint>:

/************************************************************
** 函数名称: D12_SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 读出的字节
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
 7c0:	68 2f       	mov	r22, r24
	INT8U c;

	if(bEPPflags.bits.in_isr == 0)
 7c2:	80 91 60 01 	lds	r24, 0x0160
 7c6:	85 fd       	sbrc	r24, 5
 7c8:	01 c0       	rjmp	.+2      	; 0x7cc <D12_SelectEndpoint+0xc>
		DISABLE();
 7ca:	f8 94       	cli

	outportb(D12_COMMAND, bEndp);	//端点选择
 7cc:	83 e0       	ldi	r24, 0x03	; 3
 7ce:	9f ef       	ldi	r25, 0xFF	; 255
 7d0:	0e 94 84 05 	call	0xb08 <outportb>
	c = inportb(D12_DATA);			//读出一个字节
 7d4:	82 e0       	ldi	r24, 0x02	; 2
 7d6:	9f ef       	ldi	r25, 0xFF	; 255
 7d8:	0e 94 9e 05 	call	0xb3c <inportb>
 7dc:	98 2f       	mov	r25, r24

	if(bEPPflags.bits.in_isr == 0)
 7de:	80 91 60 01 	lds	r24, 0x0160
 7e2:	85 fd       	sbrc	r24, 5
 7e4:	01 c0       	rjmp	.+2      	; 0x7e8 <D12_SelectEndpoint+0x28>
		ENABLE();
 7e6:	78 94       	sei

⌨️ 快捷键说明

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