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

📄 usbd12.s

📁 1.实现单片机驱动USBD12的固件
💻 S
📖 第 1 页 / 共 5 页
字号:
	xcall _OutB
	.dbline 451
; 	Delayus(5);
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 452
; 	status=InB( );
	xcall _InB
	mov R20,R16
	.dbline 453
; 	return status;				//读取状态
	.dbline -2
L96:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r status 20 c
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Set_EPsta _Set_EPsta fV
;          stall -> R20
;           endp -> R22
	.even
_Set_EPsta::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 463
; }
; /*******************************************
; 函数名称: Set_EPsta
; 功    能: 设置端点状态
; 参    数: endp--端点索引号,取值0 ~ 5
; 	  	  stall--设置状态值
; 返回值  : 无
; /********************************************/
; void Set_EPsta(uchar endp,uchar stall)
; {
	.dbline 464
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L98
	.dbline 465
; 		UEN_GINT();
	bclr 7
L98:
	.dbline 467
	mov R18,R22
	subi R18,192    ; addi 64
	ldi R16,1
	xcall _OutB
	.dbline 468
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 469
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 471
	lds R2,_USB_FLAG+4
	tst R2
	brne L101
	.dbline 472
	bset 7
L101:
	.dbline -2
	.dbline 473
; 
; 	OutB(CMD,0x40+endp);	//发送设置端点状态命令
; 	Delayus(1);
; 	OutB(CMD,stall);			//设置端点状态
; 
; 	if(USB_FLAG.in_isr == 0)
; 		EN_GINT();
; }
L97:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r stall 20 c
	.dbsym r endp 22 c
	.dbend
	.dbfunc e Set_Sresume _Set_Sresume fV
	.even
_Set_Sresume::
	.dbline -1
	.dbline 481
; /*******************************************
; 函数名称: Set_Sresume
; 功    能: 设置发送恢复
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void Set_Sresume(void)
; {
	.dbline 482
; 	OutB(CMD,0xF6);			//设置发送恢复
	ldi R18,246
	ldi R16,1
	.dbline -2
	.dbline 483
; }
L104:
	.dbline 0 ; func end
	xjmp _OutB
	.dbend
	.dbfunc e Read_EP _Read_EP fc
;            num -> R20
;              i -> R22
;            buf -> R10,R11
;            len -> R22
;           endp -> R20
	.even
_Read_EP::
	xcall push_gset3
	mov R22,R18
	mov R20,R16
	ldd R10,y+6
	ldd R11,y+7
	.dbline -1
	.dbline 493
; /*******************************************
; 函数名称: Read_EP
; 功    能: 读取端点数据
; 参    数: endp--端点索引号,取值 0 ~ 5 
; 	  	  len--要读取的数据长度
; 		  buf--接收数据指针					   
; 返回值  : num--实际读到的字节数
; /********************************************/
; uchar Read_EP(uchar endp,uchar len,uchar * buf)
; {
	.dbline 496
; 	uchar i,num;
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L106
	.dbline 497
; 		UEN_GINT();
	bclr 7
L106:
	.dbline 499
; 
; 	OutB(CMD,endp);						//发送选择端点命令
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 500
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 501
; 	if((InB( )&FULLEMPTY)==0) 
	xcall _InB
	sbrc R16,0
	rjmp L109
	.dbline 502
; 	{		//如果缓冲区为空----------------------------------------
	.dbline 503
; 		if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L111
	.dbline 504
; 		EN_GINT();
	bset 7
L111:
	.dbline 505
; 		return 0;										//则返回读到0字节
	clr R16
	xjmp L105
L109:
	.dbline 508
; 	}
; 
; 	OutB(CMD,0xF0);						//发送读缓冲区命令
	ldi R18,240
	ldi R16,1
	xcall _OutB
	.dbline 509
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 510
; 	num=InB( );								//读取保留字节
	xcall _InB
	.dbline 511
; 	num=InB( );								//读取数据字节的数目/长度
	xcall _InB
	mov R20,R16
	.dbline 513
; 
; 	if(num>len)											//如果大于要求读的字节数目
	cp R22,R16
	brsh L114
	.dbline 514
; 	{
	.dbline 515
; 		num=len;										//则只读取要求的字节长度
	mov R20,R22
	.dbline 516
; 	}
L114:
	.dbline 517
; 	for(i=0; i<num; i++)
	clr R22
	xjmp L119
L116:
	.dbline 518
	xcall _InB
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	std z+0,R16
L117:
	.dbline 517
	inc R22
L119:
	.dbline 517
	cp R22,R20
	brlo L116
	.dbline 520
; 		*(buf+i)=InB( );					//读取要求的字节数目/长度
; 
; 	OutB(CMD,0xF2);						//清缓冲区,新的信息包才可以重新被接受
	ldi R18,242
	ldi R16,1
	xcall _OutB
	.dbline 522
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L120
	.dbline 523
; 		EN_GINT();
	bset 7
L120:
	.dbline 525
; 
; 	return num;											//返回读到的字节数
	mov R16,R20
	.dbline -2
L105:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r num 20 c
	.dbsym r i 22 c
	.dbsym r buf 10 pc
	.dbsym r len 22 c
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Write_EP _Write_EP fc
;              i -> R20
;            buf -> R22,R23
;            len -> R10
;           endp -> R20
	.even
_Write_EP::
	xcall push_gset3
	mov R10,R18
	mov R20,R16
	ldd R22,y+6
	ldd R23,y+7
	.dbline -1
	.dbline 536
; }
; /*******************************************
; 函数名称: Write_EP
; 功    能: 将数据写入端点
; 参    数: endp--端点索引号,取值 0 ~ 5 
; 	  	  len--要写入的数据长度
; 		  buf--发送数据指针					   
; 返回值  : num--实际写入的字节数
; /********************************************/
; uchar Write_EP(uchar endp,uchar len,uchar * buf)
; {
	.dbline 539
; 	uchar i;
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L124
	.dbline 540
; 		UEN_GINT();
	bclr 7
L124:
	.dbline 542
; 
; 	OutB(CMD,endp);			//发送选择端点命令
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 543
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 544
; 	i=InB( );					//可选地读取一个字节
	xcall _InB
	.dbline 546
; 
; 	OutB(CMD,0xF0);			//发送写缓冲区命令	
	ldi R18,240
	ldi R16,1
	xcall _OutB
	.dbline 547
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 548
; 	OutB(DAT,0);					//写入一个保留字节
	clr R18
	clr R16
	xcall _OutB
	.dbline 549
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 550
; 	OutB(DAT,len);				//写入即将写入的字节数目
	mov R18,R10
	clr R16
	xcall _OutB
	.dbline 551
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 553
; 
; 	for(i=0; i<len; i++)
	clr R20
	xjmp L130
L127:
	.dbline 554
	.dbline 555
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	clr R16
	xcall _OutB
	.dbline 556
L128:
	.dbline 553
	inc R20
L130:
	.dbline 553
	cp R20,R10
	brlo L127
	.dbline 557
; 	{
; 		OutB(DAT,*(buf+i));		//写入指定的字节
; 	}
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 558
; 	OutB(CMD,0xFA);			//使缓冲区有效
	ldi R18,250
	ldi R16,1
	xcall _OutB
	.dbline 560
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L131
	.dbline 561
; 		EN_GINT();
	bset 7
L131:
	.dbline 563
; 
; 	return len;								//返回写入的字节数
	mov R16,R10
	.dbline -2
L123:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r buf 22 pc
	.dbsym r len 10 c
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Ack_EP _Ack_EP fV
;           endp -> R20
	.even
_Ack_EP::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 572
	.dbline 573
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 574
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 575
	ldi R18,241
	ldi R16,1
	xcall _OutB
	.dbline 576
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 577
	tst R20
	brne L135
	.dbline 578
	.dbline 579
	ldi R18,242
	ldi R16,1
	xcall _OutB
	.dbline 580
L135:
	.dbline -2
	.dbline 581
; }
; /*******************************************
; 函数名称: Ack_EP
; 功    能: 应答Setup
; 参    数: endp--端点索引号,取值 0 ~ 5 	   
; 返回值  : 无
; /********************************************/
; void Ack_EP(uchar endp)
; {
; 	OutB(CMD,endp);			//选择端点
; 	Delayus(1);
; 	OutB(CMD,0xF1);			//应答Setup指令
; 	Delayus(1);
; 	if(endp==0)	
; 	{	
; 		OutB(CMD,0xF2);		//清空该端点缓冲区
; 	}
; }
L134:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Clear_buf _Clear_buf fV
;           endp -> R20
	.even
_Clear_buf::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 589
	.dbline 590
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 591
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 592
	ldi R18,242
	ldi R16,1
	xcall _OutB
	.dbline 594
	cpi R20,4
	brlo L138
	.dbline 595
	.dbline 596
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 597
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 598
	ldi R18,242
	ldi R16,1
	xcall _OutB
	.dbline 599
L138:
	.dbline -2
	.dbline 600
; /*******************************************
; 函数名称: Clear_buf
; 功    能: 清指定端点的缓冲区(包括双缓冲区)
; 参    数: endp--端点索引号,取值 0 ~ 5 	   
; 返回值  : 无
; /********************************************/
; void Clear_buf(uchar endp)
; {	
;    	OutB(CMD,endp);			//选择端点
; 	Delayus(1);
; 	OutB(CMD,0xF2);			//清空第1个缓冲区	
; 	
; 	if (endp>=4)
; 	{
;    		OutB(CMD,endp);		//选择端点
; 		Delayus(1);
; 		OutB(CMD,0xF2);		//清空第2个缓冲区	
; 	}
; }
L137:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Stall_ep0 _Stall_ep0 fV
	.even
_Stall_ep0::
	.dbline -1
	.dbline 608
; /*******************************************
; 函数名称: Stall_ep0
; 功    能: 使控制端点处于停止状态
; 参    数: 无   
; 返回值  : 无
; /********************************************/
; void Stall_ep0(void)
; {
	.dbline 609
; 	Set_EPsta(0,1);
	ldi R18,1
	clr R16
	xcall _Set_EPsta
	.dbline 610
; 	Set_EPsta(1,1);
	ldi R18,1
	ldi R16,1
	.dbline -2
	.dbline 611
; }
L140:
	.dbline 0 ; func end
	xjmp _Set_EPsta
	.dbend
	.dbfunc e S_trans _S_trans fV
;            len -> R20
;            buf -> R22,R23
	.even
_S_trans::
	xcall push_gset2
	mov R20,R18
	movw R22,R16
	sbiw R28,2
	.dbline -1
	.dbline 620
	.dbline 621
	ldi R24,16
	cp R24,R20
	brlo L142
	.dbline 622
	.dbline 623
	std y+0,R22
	std y+1,R23
	mov R18,R20
	ldi R16,1
	xcall _Write_EP
	.dbline 624
L142:
	.dbline -2
	.dbline 625
; /*******************************************
; 函数名称: S_trans
; 功    能: 通过端点索引 1 发送数据(DATA 类型)
; 参    数: buf--发送数据指针
; 		  len--发送数据长度   
; 返回值  : 无
; /********************************************/
; void S_trans(uchar * buf, uchar len)
; {
; 	if(len<=EP0_PACKET_SIZE) 
; 	{			//长度小于EP0最大信息包大小才允许发送
; 		Write_EP(1,len,buf);
; 	}
; }
L141:
	adiw R28,2
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r len 20 c
	.dbsym r buf 22 pc
	.dbend
	.dbfunc e Code_trans _Code_trans fV
;            len -> R22,R23
;       pRomData -> R20,R21
	.even
_Code_trans::
	xcall push_gset2
	movw R22,R18
	movw R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 634
; /*******************************************
; 函数名称: Code_trans
; 功    能: 通过端点索引 1 发送数据(CODE类型)
; 参    数: buf--发送数据指针
; 		  len--发送数据长度   
; 返回值  : 无
; /********************************************/
; void Code_trans(uchar *pRomData, uint len)
; {
	.dbline 635
; 	ControlData.wCount = 0;								//传输字节数计数器清0
	clr R2
	clr R3
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 636
; 	if(ControlData.wLength > len)
	lds R2,_ControlData+8
	lds R3,_ControlData+8+1
	cp R22,R2
	cpc R23,R3

⌨️ 快捷键说明

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