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

📄 usb_isr.c

📁 学习资料S12源程序UF32 USB MCU方测试程序 CW环境
💻 C
字号:
#include "usb_isr.h"
//-------------------------------------------------------------------------*
//函数:USB_StatusChgISR--挂起,复位中断函数                                 *
//功能:清除相应的标志位                                                    *
//-------------------------------------------------------------------------*
#pragma CODE_SEG	DEFAULT
#pragma TRAP_PROC
void USB_StatusChgISR(void)  
{
	// 检测是否是挂起(Suspend)状态改变
	if(mCheckBit(USSC, UMSR1)) 
	{
		UMSR1 = (1 << USSC);
	} 
	else 
	{
	// 检测是否是复位(Suspend)状态改变
		if(mCheckBit(URSC, UMSR1)) 
		{
	// 判断总线是否检测到复位状态
			if(mCheckBit(URD, UMSR1)) 			
			{
				
				#ifdef DEBUG
				  SCISendString("reset ISR\r\n");
				#endif
	// 察看设备是作为全速还是是高速设备运行
				while (mCheckBit(URD, UMSR1));    
				if (mCheckBit(FULLSPD, UMSR1))
				{
					gUSBFullSpeed = 1;
	        
	       #ifdef DEBUG	
					  SCISendString("Full Speed\r\n");
				 #endif
				}
				else
				{
					gUSBFullSpeed = 0;
					#ifdef DEBUG
					  SCISendString("High Speed\r\n");				
					#endif 
				}
	// 重新初始化
				USB_ModuleInit();					
				USB_InitBulkOnlyTransport();		
			}
	// 清复位状态
			UMSR1 = (1 << URSC); 
		}
	}
}

//-------------------------------------------------------------------------*
//函数:USB_StartFrameISR                                                   *
//功能:USB起始帧中断处理                                                   *
//-------------------------------------------------------------------------*

#pragma CODE_SEG	DEFAULT
#pragma TRAP_PROC
/*USB起始帧中断处理*/
void USB_StartFrameISR(void) 
{
	if(mCheckBit(SOF, UMSR1))				//SOF已被检测 
	{
	#ifdef DEBUG
		SCISendString("SOF detect ISR\r\n");
	#endif	
		UMSR1 = (1<<SOF);		
		mSetBit(USSCIE, UIMR);				// 事务被确认, 使能USSC中断
		mClearBit(SOFIE, UIMR);				// 关SOF中断
	
	}
}
//USB的Setup中断处理程序
#pragma CODE_SEG	DEFAULT
#pragma TRAP_PROC
void USB_SetupISR(void) 
{
    
  
  #ifdef DEBUG  
    SCISendString("SETUP Paket ISR\r\t");
  #endif
	if(mCheckBit(SETOVR, UMSR1))		// 判断SETUP命令是否运行超时
	{					
		UMSR1 = (1<<SETOVR);				  // 清除该位
		USB_DecodeSETUP(&USTB);			  // 调用解析SETUP包子程序
	}
	else
	{
		if(mCheckBit(SETUP, UMSR1))		// 判断SETUP命令是否被检测到
		{				
			UMSR1 = (1<<SETUP);
			USB_DecodeSETUP(&USTB);			// 调用解析SETUP包子程序
		}
	}
}

//-------------------------------------------------------------------------*
//函数:USB_SetConfigISR                                                    *
//功能:USB SET_CONFIGURATION中断处理                                       *
//-------------------------------------------------------------------------*
#pragma CODE_SEG	DEFAULT
#pragma TRAP_PROC
void USB_SetConfigISR(void) 
{

	if(mCheckBit(SETECR, UCCSR))		// 判断是否是设置端点配置请求
	{	
		#ifdef DEBUG
		  SCISendString("Set Config ISR\r\n");
		#endif
		if (mCheckBit(CFGVALID, UCCSR)) {	
		                              // 判断是否配置有效
			mSetBit(DONEECRU, UCCSR);		// 设置端点配置更新
			return;
		};

		if (mCheckBit(INTFVALID, UCCSR)) {	
		                              // 判断是否接口有效
			mSetBit(DONEECRU, UCCSR);		// 设置接口更新
			return;
		}

	} 
}
//-------------------------------------------------------------------------*
//函数:USB_EP0INISR                                                        *
//功能:端点0 IN中断                                                        *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_EP0INISR(void) 
{
	UINT8 size = UEPCSR0 & 0x007f;
	// 判断是否是端点0的IN包检测
	if(mCheckBit(TFRC, UEPCSR0))
	{
		
		#ifdef DEBUG
  		SCISendString("POINT1 IN ISR Begin\r\n");
  		SCISendString("POINT1 In size:");
  		SCISendOneByte(size + 48);
  		SCISendString("\r\n");
  		SCISendString("Data is:");
  		SCISendNByte((UINT8 *)&UEPLB0 ,size);		
  		SCISendString("\r\n");
  		SCISendString("POINT1 IN ISR End\r\n");
		#endif
		UEPCSR0 = 0x3000;					// 清除DVALID位, 清除TFRC位
	} 
	PORTA |= (1<<1);      
}

//-------------------------------------------------------------------------*
//函数:USB_EP0OUTISR                                                       *
//功能:端点0 OUT中断                                                       *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_EP0OUTISR(void) 
{
	UINT8 size = UEPCSR1 & 0x007f;
	// 判断是否是端点0的OUT包检测
	if(mCheckBit(TFRC, UEPCSR1))
	{
		#ifdef DEBUG
  		SCISendString("POINT1 OUT ISR Begin\r\n");
  		SCISendString("POINT1 OUT size:");
  		SCISendOneByte(size + 48);
  		SCISendString("");
  		SCISendString("Data is:");
  		SCISendNByte((UINT8 *)&UEPLB1 ,size);
  		SCISendString("\r\n");
  		SCISendString("POINT1 OUT ISR End\r\n");
		#endif
		UEPCSR1 = 0x3000;					// 清除DVALID位, 清除TFRC位
	}
	PORTA |= (1<<0);
}
/*端点2中断处理函数*/
#pragma TRAP_PROC
void USB_PhyEP2ISR(void) 
{
	UINT8 size = UEPCSR2 & 0x007f;
	// 判断是否是端点2包检测
	if(mCheckBit(TFRC, UEPCSR2))
	{

		#ifdef DEBUG
		  SCISendString("POINT2 IN ISR begin\r\n");
		  SCISendString("POINT2 IN ISR end\r\n");
		#endif
		UEPCSR2 = 0x3000;
	} 
}
/*
void ProcessData(UINT8 *buf, UINT8 size)
{
	
	PCOMMAND pcmd = (PCOMMAND)buf;
	//如是新的命令请求,则拷贝到缓冲区
	if(	pcmd->type == CMD_LIGHT || pcmd->type == CMD_MESSAGE ||
		pcmd->type == CMD_GET_LIGHT_STAT)
	{
		USB_Move2LocalBuffer(buf, (UINT8*)&g_cmd, size);
		g_bDo = TRUE;
		SCISendString("Option 1\r\n");
	}
	SCISendOneByte(g_bDo);
	SCISendString("ProcessData end\r\n");
}
*/
//-------------------------------------------------------------------------*
//函数:USB_PhyEP3ISR                                                       *
//功能:端点3中断处理程序                                                   *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_PhyEP3ISR(void) 
{
	
	UINT8  size = UEPCSR3 & 0x007f;
	//判断是否是端点3包检测
	if(mCheckBit(TFRC, UEPCSR3))
	{

    #ifdef DEBUG
  		SCISendString("POINT3 OUT ISR begin\r\n");
  		SCISendNByte((UINT8*)USB_SetBufferPtr(PHY3),size);
  		SCISendString("\r\n");
  		//ProcessData((UINT8 *)&UEPLB1, size);	
  		SCISendString("POINT3 OUT ISR End\r\n");
  	#endif
		UEPCSR3 = 0x3000;	   
	} 
}

//-------------------------------------------------------------------------*
//函数:Excute_Action--挂起,复位中断函数                                    *
//功能:端点4 in中断                                                        *
//-------------------------------------------------------------------------*
//#define QC1DR_H	*(volatile UINT8*)(0x0200+0x02)
static void Excute_Action()
{
	UINT16 *pbuf;
	UINT16 i ;
	SCISendString("Excute_Action begin\r\n");
/*if(g_cmd.type == CMD_LIGHT)
	{
		SCISendOneByte(g_cmd.pbuf[0]);
		Light(g_cmd.pbuf[0]);
		SCISendString("light\r\n");	
	}
	if( (g_cmd.type == CMD_GET_LIGHT_STAT) || (g_cmd.type == CMD_MESSAGE))
	{
		USB_Move2QUE3(g_cmd.pbuf, g_cmd.size);
		pbuf = (UINT16 *)g_cmd.pbuf;
		
		USBMS_SetPhyEP5Int(g_cmd.size);
		i = (QC3EP - QC3BP);
		SCISendNByte((UINT8 *)&i, 2);	   
		SCISendString("\r\nMessage or Get lighet state\r\n");
	} */
	USB_Move2QUE3(gdata, gsize);
	USBMS_SetPhyEP5Int(gsize);
	SCISendString("Excute_Action End\r\n");
			
}
//-------------------------------------------------------------------------*
//函数:USB_PhyEP4ISR                                                       *
//功能:端点4 out中断                                                       *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_PhyEP4ISR(void) 
{
	
	UINT16  size = UEPCSR4A & 0x07FF;
	UINT16  i = 0;                            
	UINT16 *pbuf = (UINT16 *)&gdata;
	gsize = size;
	/*判断是不是收到了数据*/
	//if(UEPCSR4A & UEPCSR4A_TFRC4A_MASK)
	if(mCheckBit(TFRC, UEPCSR4A))
	{
		
	  #ifdef DEBUG
		  SCISendString("POINT4 OUT ISR begin\r\n");
		#endif
		/*如果短数据,复位标志,短数据说明是最后一个包*/		
		//if(UEPCSR4B & UEPCSR4B_SPKT_MASK)
		if(mCheckBit(SPKT,UEPCSR4B))
		{
			//UEPCSR4B |= UEPCSR4B_SPKT_MASK;	
		  mSetBit(SPKT,UEPCSR4B);
		}
		//读取缓冲区的数据
		//测试通道1是否为空
		while(!(QC1SR & QC1SR_Q1ESF_MASK) )
		{
			//pbuf[i] = QC1DR;						
			pbuf[i] = QC1DR;
			i += 1;					
		}
		#ifdef DEBUG  
		  SCISendString("\r\n");		
		  //SCISendNByte((UINT8*)&g_cmd, size);
		#endif
		Excute_Action();
		UEPCSR4A = 0x3800;
		UEPCSR4B = 0x0000;
		#ifdef DEBUG
		  SCISendString("POINT4 OUT ISR End\r\n");
		#endif
	}
}

//-------------------------------------------------------------------------*
//函数:USB_PhyEP5ISR                                                       *
//功能:端点5 In中断                                                        *
//-------------------------------------------------------------------------*                                                                        
#pragma TRAP_PROC
void USB_PhyEP5ISR(void) 
{
	UINT16  size = UEPCSR5A & 0x07FF;
	SCISendString("POINT5 In ISR begin\r\n");
	//if(UEPCSR5A & UEPCSR5A_TFRC5A_MASK)
	//如果transfer结束
	if(mCheckBit(TFRC, UEPCSR5A))
	{
	//如果不是规定的格式数据,则不发送
	//规定下次发送,如果不是设备有数据把标志位置位,那么不会发送
	//UEPCSR5A	= 0x7800;
		do 
			UEPCSR5A |= (1<<SNAK)+(1<<TFRC)+(1<<USBTCIE);	// Enable NAK, clear TFRC
		while (!( mCheckBit(SNAK,UEPCSR5A) && mCheckBit(USBTCIE,UEPCSR5A)) );
	}
	SCISendString("POINT5 Out ISR begin\r\n");
} 

⌨️ 快捷键说明

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