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

📄 usbd12.lst

📁 AVR16单片机USB通信程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0567) 功    能: 应答Setup
(0568) 参    数: endp--端点索引号,取值 0 ~ 5 	   
(0569) 返回值  : 无
(0570) /********************************************/
(0571) void Ack_EP(uchar endp)
(0572) {
(0573) 	OutB(CMD,endp);			//选择端点
    0348 2F24      MOV	R18,R20
    0349 E001      LDI	R16,1
    034A DE56      RCALL	_OutB
(0574) 	Delayus(1);
    034B E001      LDI	R16,1
    034C E010      LDI	R17,0
    034D DD42      RCALL	_Delayus
(0575) 	OutB(CMD,0xF1);			//应答Setup指令
    034E EF21      LDI	R18,0xF1
    034F E001      LDI	R16,1
    0350 DE50      RCALL	_OutB
(0576) 	Delayus(1);
    0351 E001      LDI	R16,1
    0352 E010      LDI	R17,0
    0353 DD3C      RCALL	_Delayus
(0577) 	if(endp==0)	
    0354 2344      TST	R20
    0355 F419      BNE	0x0359
(0578) 	{	
(0579) 		OutB(CMD,0xF2);		//清空该端点缓冲区
    0356 EF22      LDI	R18,0xF2
    0357 E001      LDI	R16,1
    0358 DE48      RCALL	_OutB
(0580) 	}
(0581) }
    0359 940E0744  CALL	pop_gset1
    035B 9508      RET
_Clear_buf:
  endp                 --> R20
    035C 940E0741  CALL	push_gset1
    035E 2F40      MOV	R20,R16
(0582) /*******************************************
(0583) 函数名称: Clear_buf
(0584) 功    能: 清指定端点的缓冲区(包括双缓冲区)
(0585) 参    数: endp--端点索引号,取值 0 ~ 5 	   
(0586) 返回值  : 无
(0587) /********************************************/
(0588) void Clear_buf(uchar endp)
(0589) {	
(0590)    	OutB(CMD,endp);			//选择端点
    035F 2F24      MOV	R18,R20
    0360 E001      LDI	R16,1
    0361 DE3F      RCALL	_OutB
(0591) 	Delayus(1);
    0362 E001      LDI	R16,1
    0363 E010      LDI	R17,0
    0364 DD2B      RCALL	_Delayus
(0592) 	OutB(CMD,0xF2);			//清空第1个缓冲区	
    0365 EF22      LDI	R18,0xF2
    0366 E001      LDI	R16,1
    0367 DE39      RCALL	_OutB
(0593) 	
(0594) 	if (endp>=4)
    0368 3044      CPI	R20,4
    0369 F048      BCS	0x0373
(0595) 	{
(0596)    		OutB(CMD,endp);		//选择端点
    036A 2F24      MOV	R18,R20
    036B E001      LDI	R16,1
    036C DE34      RCALL	_OutB
(0597) 		Delayus(1);
    036D E001      LDI	R16,1
    036E E010      LDI	R17,0
    036F DD20      RCALL	_Delayus
(0598) 		OutB(CMD,0xF2);		//清空第2个缓冲区	
    0370 EF22      LDI	R18,0xF2
    0371 E001      LDI	R16,1
    0372 DE2E      RCALL	_OutB
(0599) 	}
(0600) }
    0373 940E0744  CALL	pop_gset1
    0375 9508      RET
(0601) /*******************************************
(0602) 函数名称: Stall_ep0
(0603) 功    能: 使控制端点处于停止状态
(0604) 参    数: 无   
(0605) 返回值  : 无
(0606) /********************************************/
(0607) void Stall_ep0(void)
(0608) {
(0609) 	Set_EPsta(0,1);
_Stall_ep0:
    0376 E021      LDI	R18,1
    0377 2700      CLR	R16
    0378 DF31      RCALL	_Set_EPsta
(0610) 	Set_EPsta(1,1);
    0379 E021      LDI	R18,1
    037A E001      LDI	R16,1
(0611) }
    037B CF2E      RJMP	_Set_EPsta
_S_trans:
  len                  --> R20
  buf                  --> R22
    037C 940E0758  CALL	push_gset2
    037E 2F42      MOV	R20,R18
    037F 01B8      MOVW	R22,R16
    0380 9722      SBIW	R28,2
(0612) /*******************************************
(0613) 函数名称: S_trans
(0614) 功    能: 通过端点索引 1 发送数据(DATA 类型)
(0615) 参    数: buf--发送数据指针
(0616) 		  len--发送数据长度   
(0617) 返回值  : 无
(0618) /********************************************/
(0619) void S_trans(uchar * buf, uchar len)
(0620) {
(0621) 	if(len<=EP0_PACKET_SIZE) 
    0381 E180      LDI	R24,0x10
    0382 1784      CP	R24,R20
    0383 F028      BCS	0x0389
(0622) 	{			//长度小于EP0最大信息包大小才允许发送
(0623) 		Write_EP(1,len,buf);
    0384 8368      STD	R22,0+Y
    0385 8379      STD	R23,1+Y
    0386 2F24      MOV	R18,R20
    0387 E001      LDI	R16,1
    0388 DF7D      RCALL	_Write_EP
(0624) 	}
(0625) }
    0389 9622      ADIW	R28,2
    038A 940E0760  CALL	pop_gset2
    038C 9508      RET
_Code_trans:
  len                  --> R22
  pRomData             --> R20
    038D 940E0758  CALL	push_gset2
    038F 01B9      MOVW	R22,R18
    0390 01A8      MOVW	R20,R16
    0391 9722      SBIW	R28,2
(0626) /*******************************************
(0627) 函数名称: Code_trans
(0628) 功    能: 通过端点索引 1 发送数据(CODE类型)
(0629) 参    数: buf--发送数据指针
(0630) 		  len--发送数据长度   
(0631) 返回值  : 无
(0632) /********************************************/
(0633) void Code_trans(uchar *pRomData, uint len)
(0634) {
(0635) 	ControlData.wCount = 0;								//传输字节数计数器清0
    0392 2422      CLR	R2
    0393 2433      CLR	R3
    0394 92300125  STS	R3,0x125
    0396 92200124  STS	R2,0x124
(0636) 	if(ControlData.wLength > len)
    0398 90200122  LDS	R2,0x122
    039A 90300123  LDS	R3,0x123
    039C 1562      CP	R22,R2
    039D 0573      CPC	R23,R3
    039E F420      BCC	0x03A3
(0637) 		ControlData.wLength = len;						//传输数据总字节数不得超过len
    039F 93700123  STS	R23,0x123
    03A1 93600122  STS	R22,0x122
(0638) 
(0639) 	ControlData.pData = pRomData;						//传输数据指针指向pRomData
    03A3 93500127  STS	R21,0x127
    03A5 93400126  STS	R20,0x126
(0640) 	if( ControlData.wLength >= EP0_PACKET_SIZE) 
    03A7 91800122  LDS	R24,0x122
    03A9 91900123  LDS	R25,0x123
    03AB 3180      CPI	R24,0x10
    03AC E0E0      LDI	R30,0
    03AD 079E      CPC	R25,R30
    03AE F0A8      BCS	0x03C4
(0641) 	{		//传输数据总字节数大于端点0最大信息包大小
(0642) 		Write_EP(1, EP0_PACKET_SIZE, ControlData.pData);	//发送端点0最大信息包大小个字节
    03AF 011A      MOVW	R2,R20
    03B0 8228      STD	R2,0+Y
    03B1 8239      STD	R3,1+Y
    03B2 E120      LDI	R18,0x10
    03B3 E001      LDI	R16,1
    03B4 DF51      RCALL	_Write_EP
(0643) 		ControlData.wCount += EP0_PACKET_SIZE;						//统计已发送字节数
    03B5 91800124  LDS	R24,0x124
    03B7 91900125  LDS	R25,0x125
    03B9 9640      ADIW	R24,0x10
    03BA 93900125  STS	R25,0x125
    03BC 93800124  STS	R24,0x124
(0644) 
(0645) 		UEN_GINT();
    03BE 94F8      BCLR	7
(0646) 		USB_FLAG.control_state = USB_TRANSMIT;				//标志数据发送状态			
    03BF E081      LDI	R24,1
    03C0 93800065  STS	R24,0x65
(0647) 		EN_GINT();
    03C2 9478      BSET	7
(0648) 	}
    03C3 C019      RJMP	0x03DD
(0649) 	else 
(0650) 	{
(0651) 		Write_EP(1, ControlData.wLength, pRomData);		//写入传输数据总字节数
    03C4 8348      STD	R20,0+Y
    03C5 8359      STD	R21,1+Y
    03C6 91200122  LDS	R18,0x122
    03C8 E001      LDI	R16,1
    03C9 DF3C      RCALL	_Write_EP
(0652) 		ControlData.wCount += ControlData.wLength;					//统计已发送字节数
    03CA 90200122  LDS	R2,0x122
    03CC 90300123  LDS	R3,0x123
    03CE 90400124  LDS	R4,0x124
    03D0 90500125  LDS	R5,0x125
    03D2 0C42      ADD	R4,R2
    03D3 1C53      ADC	R5,R3
    03D4 92500125  STS	R5,0x125
    03D6 92400124  STS	R4,0x124
(0653) 		UEN_GINT();
    03D8 94F8      BCLR	7
(0654) 		USB_FLAG.control_state = USB_IDLE;					//标志空闲状态
    03D9 2422      CLR	R2
    03DA 92200065  STS	R2,0x65
(0655) 		EN_GINT();
    03DC 9478      BSET	7
(0656) 	}
(0657) }
    03DD 9622      ADIW	R28,2
    03DE 940E0760  CALL	pop_gset2
    03E0 9508      RET
_USB_INT1:
  b                    --> Y+1
  a                    --> Y+1
  int_sta              --> R20
    03E1 940E0713  CALL	push_lset
    03E3 940E0741  CALL	push_gset1
(0658) /*******************************************
(0659) 函数名称: USB_INT1
(0660) 功    能: D12中断服务函数
(0661) 参    数: 无   
(0662) 返回值  : 无
(0663) /********************************************/
(0664) void USB_INT1(void)
(0665) {
(0666)     uint int_sta;	
(0667)  	uchar a,b;
(0668) 	UEN_GINT();					        //进入D12中断服务程序时关中断
    03E5 94F8      BCLR	7
(0669) 
(0670) 	USB_FLAG.in_isr = 1;//-----------------------------
    03E6 E081      LDI	R24,1
    03E7 93800064  STS	R24,0x64
(0671) 	int_sta=Read_IntR();				//读取PDIUSBD12中断寄存器值
    03E9 DE69      RCALL	_Read_IntR
    03EA 01A8      MOVW	R20,R16
(0672) 	//a=int_sta;
(0673) 	//b=int_sta>>8;
(0674) 	//Uart_sendB(a);
(0675) 	//Uart_sendB(b);	
(0676) 	if(int_sta!=0) 
    03EB 3000      CPI	R16,0
    03EC 0701      CPC	R16,R17
    03ED F0B9      BEQ	0x0405
(0677) 	{
(0678) 		if(int_sta&INT_BUSRESET)
    03EE FF46      SBRS	R20,6
    03EF C003      RJMP	0x03F3
(0679) 			USB_FLAG.bus_reset=1;			//USB总线复位标志	
    03F0 E081      LDI	R24,1
    03F1 93800060  STS	R24,0x60
(0680) 		if(int_sta&INT_ENDP0IN)
    03F3 FF41      SBRS	R20,1
    03F4 C001      RJMP	0x03F6
(0681) 			Ep0_txdone();							//控制端点发送数据处理
    03F5 D0B4      RCALL	_Ep0_txdone
(0682) 		if(int_sta&INT_ENDP0OUT)
    03F6 FF40      SBRS	R20,0
    03F7 C001      RJMP	0x03F9
(0683) 			Ep0_rxdone();							//控制端点接收数据处理
    03F8 D015      RCALL	_Ep0_rxdone
(0684) 		if(int_sta&INT_ENDP1IN)
    03F9 FF43      SBRS	R20,3
    03FA C001      RJMP	0x03FC
(0685) 			Ep1_txdone();							//端点 1发送数据处理
    03FB D113      RCALL	_Ep1_txdone
(0686) 		if(int_sta&INT_ENDP1OUT)
    03FC FF42      SBRS	R20,2
    03FD C001      RJMP	0x03FF
(0687) 			Ep1_rxdone();							//端点 1接收数据处理
    03FE D112      RCALL	_Ep1_rxdone
(0688) 		if(int_sta&INT_ENDP2IN)
    03FF FF45      SBRS	R20,5
    0400 C001      RJMP	0x0402
(0689) 			Ep2_txdone();							//端点 2发送数据处理
    0401 D125      RCALL	_Ep2_txdone
(0690) 		if(int_sta&INT_ENDP2OUT)
    0402 FF44      SBRS	R20,4
    0403 C001      RJMP	0x0405
(0691) 			Ep2_rxdone();							//端点 2接收数据处理
    0404 D124      RCALL	_Ep2_rxdone
(0692) 	}
(0693)    	USB_FLAG.in_isr = 0;
    0405 2422      CLR	R2
    0406 92200064  STS	R2,0x64
(0694) 	
(0695)    	EN_GINT();							//退出D12中断服务程序时开中断
    0408 9478      BSET	7
(0696) }
    0409 940E0744  CALL	pop_gset1
    040B 940E072A  CALL	pop_lset
    040D 9518      RETI
_Ep0_rxdone:
  i                    --> R20
  ep_last              --> R20
    040E 940E0741  CALL	push_gset1
    0410 9722      SBIW	R28,2
(0697) /*******************************************
(0698) 函数名称: Ep0_rxdone
(0699) 功    能: 通过端点索引 0 接收数据
(0700) 参    数: 无   
(0701) 返回值  : 无
(0702) /********************************************/
(0703) void Ep0_rxdone(void)
(0704) {
(0705) 	uchar ep_last,i;
(0706) 	ep_last=Read_LttransSta(0);			 //清除中断寄存器状态,取得最后处理状态
    0411 2700      CLR	R16
    0412 DE88      RCALL	_Read_LttransSta
    0413 2F40      MOV	R20,R16
(0707) 	if (ep_last&SETUPPACKET) 
    0414 FF05      SBRS	R16,5
    0415 C05F      RJMP	0x0475
(0708) 	{					 //如果收到了建立包(Setup包)
(0709) 		ControlData.wLength=0;				 		 //传输字节总数清0
    0416 2422      CLR	R2
    0417 2433      CLR	R3
    0418 92300123  STS	R3,0x123
    041A 92200122  STS	R2,0x122
(0710) 		ControlData.wCount=0;					 		 //传输字节计数器清0
    041C 92300125  STS	R3,0x125
    041E 92200124  STS	R2,0x124
(0711) 		if(Read_EP(0,sizeof(ControlData.DeviceRequest),(uchar * )(&(ControlData.DeviceRequest)))!= sizeof(DEVICE_REQUEST))//从端点0读8个字节失败 
    0420 E18A      LDI	R24,0x1A
    0421 E091      LDI	R25,1
    0422 8388      STD	R24,0+Y
    0423 8399      STD	R25,1+Y
    0424 E028      LDI	R18,0x8
    0425 2700      CLR	R16
    0426 DEA1      RCALL	_Read_EP
    0427 3008      CPI	R16,0x8
    0428 F051      BEQ	0x0433
(0712) 		{												 		 
(0713) 			Set_EPsta(0,1);				 //停止控制端点0
    0429 E021      LDI	R18,1
    042A 2700      CLR	R16
    042B DE7E      RCALL	_Set_EPsta
(0714) 			Set_EPsta(1,1);			 	 //停止控制端点1
    042C E021      LDI	R18,1
    042D E001      LDI	R16,1
    042E DE7B      RCALL	_Set_EPsta
(0715) 			USB_FLAG.control_state = USB_IDLE;	 //设置为等待状态
    042F 2422      CLR	R2
    0430 92200065  STS	R2,0x65
(0716) 			return;
    0432 C073      RJMP	0x04A6
(0717) 		}		
(0718) 		/********  接收建立包成功 **********///-------------------------
(0719) 		Ack_EP(0);						 //对控制端点0进行建立包应答
    0433 2700      CLR	R16
    0434 DF10      RCALL	_Ack_EP
(0720) 		Ack_EP(1);						 //对控制端点1进行建立包应答
    0435 E001      LDI	R16,1
    0436 DF0E      RCALL	_Ack_EP
(0721) 		ControlData.wLength=ControlData.DeviceRequest.wLength; 	 //取出要传输数据的总字节数
    0437 90200120  LDS	R2,0x120
    0439 90300121  LDS	R3,0x121
    043B 92300123  STS	R3,0x123
    043D 92200122  STS	R2,0x122
(0722) 		ControlData.wCount = 0;//------------------------------
    043F 2422      CLR	R2
    0440 2433      CLR	R3
    0441 92300125  STS	R3,0x125
    0443 92200124  STS	R2,0x124
(0723) 		
(0724) 		if(ControlData.DeviceRequest.bmRequestType&(uchar)USB_ENDPOINT_DIRECTION_MASK)
    0445 9020011A  LDS	R2,_ControlData
    0447 FE27      SBRS	R2,7
    0448 C006      RJMP	0x044F
(0725) 		{
(0726)  														//如果控制传输是控制读取
(0727) 			 USB_FLAG.setup_packet=1;			//通知control_handler()处理Setup包
  

⌨️ 快捷键说明

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