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

📄 usbd12.lst

📁 1.实现单片机驱动USBD12的固件
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0398) }
(0399) /*******************************************
(0400) 函数名称: Sel_EP
(0401) 功    能: 端点选择,将内部指针初始化到选择的缓冲区起始位置
(0402) 参    数: endp--端点索引号,取值0 ~ 5
(0403) 返回值  : byte--一个字节的返回数据
(0404) /********************************************/
(0405) uchar Sel_EP(uchar endp)
(0406) {
(0407) 	uchar byte;
(0408) 	if(USB_FLAG.in_isr == 0)
    026E 90200064  LDS	R2,0x64
    0270 2022      TST	R2
    0271 F409      BNE	0x0273
(0409) 		UEN_GINT();
    0272 94F8      BCLR	7
(0410) 
(0411) 	OutB(CMD,endp);	//端点选择
    0273 2F24      MOV	R18,R20
    0274 E001      LDI	R16,1
    0275 DF2B      RCALL	_OutB
(0412) 	Delayus(1);
    0276 E001      LDI	R16,1
    0277 E010      LDI	R17,0
    0278 DE17      RCALL	_Delayus
(0413) 	byte=InB( );			//读出一个字节
    0279 DF4B      RCALL	_InB
    027A 2F40      MOV	R20,R16
(0414) 
(0415) 	if(USB_FLAG.in_isr == 0)
    027B 90200064  LDS	R2,0x64
    027D 2022      TST	R2
    027E F409      BNE	0x0280
(0416) 		EN_GINT();
    027F 9478      BSET	7
(0417) 
(0418) 	return byte;
    0280 2F04      MOV	R16,R20
    0281 940E0744  CALL	pop_gset1
    0283 9508      RET
_Read_EPsta:
  status               --> R20
  endp                 --> R20
    0284 940E0741  CALL	push_gset1
    0286 2F40      MOV	R20,R16
(0419) }
(0420) /*******************************************
(0421) 函数名称: Sel_EP
(0422) 功    能: 读取端点状态
(0423) 参    数: endp--端点索引号,取值0 ~ 5
(0424) 返回值  : status--端点状态
(0425) /********************************************/
(0426) uchar Read_EPsta(uchar endp)//-----------------
(0427) {
(0428) 	uchar status;
(0429) 
(0430) 	if(USB_FLAG.in_isr == 0)
    0287 90200064  LDS	R2,0x64
    0289 2022      TST	R2
    028A F409      BNE	0x028C
(0431) 		UEN_GINT();
    028B 94F8      BCLR	7
(0432) 
(0433) 	OutB(CMD,0x80+endp);	//读取端点状态命令
    028C 2F24      MOV	R18,R20
    028D 5820      SUBI	R18,0x80
    028E E001      LDI	R16,1
    028F DF11      RCALL	_OutB
(0434) 	status=InB( );					//读取端点状态
    0290 DF34      RCALL	_InB
    0291 2F40      MOV	R20,R16
(0435) 
(0436) 	if(USB_FLAG.in_isr == 0)
    0292 90200064  LDS	R2,0x64
    0294 2022      TST	R2
    0295 F409      BNE	0x0297
(0437) 		EN_GINT();
    0296 9478      BSET	7
(0438) 
(0439) 	return status;
    0297 2F04      MOV	R16,R20
    0298 940E0744  CALL	pop_gset1
    029A 9508      RET
_Read_LttransSta:
  status               --> R20
  endp                 --> R20
    029B 940E0741  CALL	push_gset1
    029D 2F40      MOV	R20,R16
(0440) }
(0441) /*******************************************
(0442) 函数名称: Read_LttransSta
(0443) 功    能: 读取最后处理状态寄存器
(0444) 参    数: endp--端点索引号,取值0 ~ 5
(0445) 返回值  : status--端点最后处理的状态
(0446) /********************************************/
(0447) uchar Read_LttransSta(uchar endp)
(0448) {
(0449)  	uchar status;
(0450) 	OutB(CMD,0x40+endp);	//输出读取最后处理状态寄存器命令
    029E 2F24      MOV	R18,R20
    029F 5C20      SUBI	R18,0xC0
    02A0 E001      LDI	R16,1
    02A1 DEFF      RCALL	_OutB
(0451) 	Delayus(5);
    02A2 E005      LDI	R16,5
    02A3 E010      LDI	R17,0
    02A4 DDEB      RCALL	_Delayus
(0452) 	status=InB( );
    02A5 DF1F      RCALL	_InB
    02A6 2F40      MOV	R20,R16
(0453) 	return status;				//读取状态
    02A7 940E0744  CALL	pop_gset1
    02A9 9508      RET
_Set_EPsta:
  stall                --> R20
  endp                 --> R22
    02AA 940E0758  CALL	push_gset2
    02AC 2F42      MOV	R20,R18
    02AD 2F60      MOV	R22,R16
(0454) }
(0455) /*******************************************
(0456) 函数名称: Set_EPsta
(0457) 功    能: 设置端点状态
(0458) 参    数: endp--端点索引号,取值0 ~ 5
(0459) 	  	  stall--设置状态值
(0460) 返回值  : 无
(0461) /********************************************/
(0462) void Set_EPsta(uchar endp,uchar stall)
(0463) {
(0464) 	if(USB_FLAG.in_isr == 0)
    02AE 90200064  LDS	R2,0x64
    02B0 2022      TST	R2
    02B1 F409      BNE	0x02B3
(0465) 		UEN_GINT();
    02B2 94F8      BCLR	7
(0466) 
(0467) 	OutB(CMD,0x40+endp);	//发送设置端点状态命令
    02B3 2F26      MOV	R18,R22
    02B4 5C20      SUBI	R18,0xC0
    02B5 E001      LDI	R16,1
    02B6 DEEA      RCALL	_OutB
(0468) 	Delayus(1);
    02B7 E001      LDI	R16,1
    02B8 E010      LDI	R17,0
    02B9 DDD6      RCALL	_Delayus
(0469) 	OutB(CMD,stall);			//设置端点状态
    02BA 2F24      MOV	R18,R20
    02BB E001      LDI	R16,1
    02BC DEE4      RCALL	_OutB
(0470) 
(0471) 	if(USB_FLAG.in_isr == 0)
    02BD 90200064  LDS	R2,0x64
    02BF 2022      TST	R2
    02C0 F409      BNE	0x02C2
(0472) 		EN_GINT();
    02C1 9478      BSET	7
(0473) }
    02C2 940E0760  CALL	pop_gset2
    02C4 9508      RET
(0474) /*******************************************
(0475) 函数名称: Set_Sresume
(0476) 功    能: 设置发送恢复
(0477) 参    数: 无
(0478) 返回值  : 无
(0479) /********************************************/
(0480) void Set_Sresume(void)
(0481) {
(0482) 	OutB(CMD,0xF6);			//设置发送恢复
_Set_Sresume:
    02C5 EF26      LDI	R18,0xF6
    02C6 E001      LDI	R16,1
(0483) }
    02C7 CED9      RJMP	_OutB
_Read_EP:
  num                  --> R20
  i                    --> R22
  buf                  --> R10
  len                  --> R22
  endp                 --> R20
    02C8 940E075C  CALL	push_gset3
    02CA 2F62      MOV	R22,R18
    02CB 2F40      MOV	R20,R16
    02CC 80AE      LDD	R10,6+Y
    02CD 80BF      LDD	R11,7+Y
(0484) /*******************************************
(0485) 函数名称: Read_EP
(0486) 功    能: 读取端点数据
(0487) 参    数: endp--端点索引号,取值 0 ~ 5 
(0488) 	  	  len--要读取的数据长度
(0489) 		  buf--接收数据指针					   
(0490) 返回值  : num--实际读到的字节数
(0491) /********************************************/
(0492) uchar Read_EP(uchar endp,uchar len,uchar * buf)
(0493) {
(0494) 	uchar i,num;
(0495) 
(0496) 	if(USB_FLAG.in_isr == 0)
    02CE 90200064  LDS	R2,0x64
    02D0 2022      TST	R2
    02D1 F409      BNE	0x02D3
(0497) 		UEN_GINT();
    02D2 94F8      BCLR	7
(0498) 
(0499) 	OutB(CMD,endp);						//发送选择端点命令
    02D3 2F24      MOV	R18,R20
    02D4 E001      LDI	R16,1
    02D5 DECB      RCALL	_OutB
(0500) 	Delayus(1);
    02D6 E001      LDI	R16,1
    02D7 E010      LDI	R17,0
    02D8 DDB7      RCALL	_Delayus
(0501) 	if((InB( )&FULLEMPTY)==0) 
    02D9 DEEB      RCALL	_InB
    02DA FD00      SBRC	R16,0
    02DB C007      RJMP	0x02E3
(0502) 	{		//如果缓冲区为空----------------------------------------
(0503) 		if(USB_FLAG.in_isr == 0)
    02DC 90200064  LDS	R2,0x64
    02DE 2022      TST	R2
    02DF F409      BNE	0x02E1
(0504) 		EN_GINT();
    02E0 9478      BSET	7
(0505) 		return 0;										//则返回读到0字节
    02E1 2700      CLR	R16
    02E2 C020      RJMP	0x0303
(0506) 	}
(0507) 
(0508) 	OutB(CMD,0xF0);						//发送读缓冲区命令
    02E3 EF20      LDI	R18,0xF0
    02E4 E001      LDI	R16,1
    02E5 DEBB      RCALL	_OutB
(0509) 	Delayus(1);
    02E6 E001      LDI	R16,1
    02E7 E010      LDI	R17,0
    02E8 DDA7      RCALL	_Delayus
(0510) 	num=InB( );								//读取保留字节
    02E9 DEDB      RCALL	_InB
(0511) 	num=InB( );								//读取数据字节的数目/长度
    02EA DEDA      RCALL	_InB
    02EB 2F40      MOV	R20,R16
(0512) 
(0513) 	if(num>len)											//如果大于要求读的字节数目
    02EC 1760      CP	R22,R16
    02ED F408      BCC	0x02EF
(0514) 	{
(0515) 		num=len;										//则只读取要求的字节长度
    02EE 2F46      MOV	R20,R22
(0516) 	}
(0517) 	for(i=0; i<num; i++)
    02EF 2766      CLR	R22
    02F0 C007      RJMP	0x02F8
(0518) 		*(buf+i)=InB( );					//读取要求的字节数目/长度
    02F1 DED3      RCALL	_InB
    02F2 2FE6      MOV	R30,R22
    02F3 27FF      CLR	R31
    02F4 0DEA      ADD	R30,R10
    02F5 1DFB      ADC	R31,R11
    02F6 8300      STD	R16,0+Z
    02F7 9563      INC	R22
    02F8 1764      CP	R22,R20
    02F9 F3B8      BCS	0x02F1
(0519) 
(0520) 	OutB(CMD,0xF2);						//清缓冲区,新的信息包才可以重新被接受
    02FA EF22      LDI	R18,0xF2
    02FB E001      LDI	R16,1
    02FC DEA4      RCALL	_OutB
(0521) 
(0522) 	if(USB_FLAG.in_isr == 0)
    02FD 90200064  LDS	R2,0x64
    02FF 2022      TST	R2
    0300 F409      BNE	0x0302
(0523) 		EN_GINT();
    0301 9478      BSET	7
(0524) 
(0525) 	return num;											//返回读到的字节数
    0302 2F04      MOV	R16,R20
    0303 940E0763  CALL	pop_gset3
    0305 9508      RET
_Write_EP:
  i                    --> R20
  buf                  --> R22
  len                  --> R10
  endp                 --> R20
    0306 940E075C  CALL	push_gset3
    0308 2EA2      MOV	R10,R18
    0309 2F40      MOV	R20,R16
    030A 816E      LDD	R22,6+Y
    030B 817F      LDD	R23,7+Y
(0526) }
(0527) /*******************************************
(0528) 函数名称: Write_EP
(0529) 功    能: 将数据写入端点
(0530) 参    数: endp--端点索引号,取值 0 ~ 5 
(0531) 	  	  len--要写入的数据长度
(0532) 		  buf--发送数据指针					   
(0533) 返回值  : num--实际写入的字节数
(0534) /********************************************/
(0535) uchar Write_EP(uchar endp,uchar len,uchar * buf)
(0536) {
(0537) 	uchar i;
(0538) 
(0539) 	if(USB_FLAG.in_isr == 0)
    030C 90200064  LDS	R2,0x64
    030E 2022      TST	R2
    030F F409      BNE	0x0311
(0540) 		UEN_GINT();
    0310 94F8      BCLR	7
(0541) 
(0542) 	OutB(CMD,endp);			//发送选择端点命令
    0311 2F24      MOV	R18,R20
    0312 E001      LDI	R16,1
    0313 DE8D      RCALL	_OutB
(0543) 	Delayus(1);
    0314 E001      LDI	R16,1
    0315 E010      LDI	R17,0
    0316 DD79      RCALL	_Delayus
(0544) 	i=InB( );					//可选地读取一个字节
    0317 DEAD      RCALL	_InB
(0545) 
(0546) 	OutB(CMD,0xF0);			//发送写缓冲区命令	
    0318 EF20      LDI	R18,0xF0
    0319 E001      LDI	R16,1
    031A DE86      RCALL	_OutB
(0547) 	Delayus(1);
    031B E001      LDI	R16,1
    031C E010      LDI	R17,0
    031D DD72      RCALL	_Delayus
(0548) 	OutB(DAT,0);					//写入一个保留字节
    031E 2722      CLR	R18
    031F 2700      CLR	R16
    0320 DE80      RCALL	_OutB
(0549) 	Delayus(1);
    0321 E001      LDI	R16,1
    0322 E010      LDI	R17,0
    0323 DD6C      RCALL	_Delayus
(0550) 	OutB(DAT,len);				//写入即将写入的字节数目
    0324 2D2A      MOV	R18,R10
    0325 2700      CLR	R16
    0326 DE7A      RCALL	_OutB
(0551) 	Delayus(1);
    0327 E001      LDI	R16,1
    0328 E010      LDI	R17,0
    0329 DD66      RCALL	_Delayus
(0552) 
(0553) 	for(i=0; i<len; i++)
    032A 2744      CLR	R20
    032B C008      RJMP	0x0334
(0554) 	{
(0555) 		OutB(DAT,*(buf+i));		//写入指定的字节
    032C 2FE4      MOV	R30,R20
    032D 27FF      CLR	R31
    032E 0FE6      ADD	R30,R22
    032F 1FF7      ADC	R31,R23
    0330 8120      LDD	R18,0+Z
    0331 2700      CLR	R16
    0332 DE6E      RCALL	_OutB
    0333 9543      INC	R20
    0334 154A      CP	R20,R10
    0335 F3B0      BCS	0x032C
(0556) 	}
(0557) 	Delayus(1);
    0336 E001      LDI	R16,1
    0337 E010      LDI	R17,0
    0338 DD57      RCALL	_Delayus
(0558) 	OutB(CMD,0xFA);			//使缓冲区有效
    0339 EF2A      LDI	R18,0xFA
    033A E001      LDI	R16,1
    033B DE65      RCALL	_OutB
(0559) 
(0560) 	if(USB_FLAG.in_isr == 0)
    033C 90200064  LDS	R2,0x64
    033E 2022      TST	R2
    033F F409      BNE	0x0341
(0561) 		EN_GINT();
    0340 9478      BSET	7
(0562) 
(0563) 	return len;								//返回写入的字节数
    0341 2D0A      MOV	R16,R10
    0342 940E0763  CALL	pop_gset3
    0344 9508      RET
_Ack_EP:
  endp                 --> R20
    0345 940E0741  CALL	push_gset1
    0347 2F40      MOV	R20,R16
(0564) }
(0565) /*******************************************
(0566) 函数名称: Ack_EP

⌨️ 快捷键说明

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