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

📄 usb_function.c

📁 TMS320VC5509设备端USB设备驱动程序源文件
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut4EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut4);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK4_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn5EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In5的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn5EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn5);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut5EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out5的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut5EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut5);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK5_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn6EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In6的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn6EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn6);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut6EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out6的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut6EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut6);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK6_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn7EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In7的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn7EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn7);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut7EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out7的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut7EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut7);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK7_READ;
	}
}

/****************************************************************/
/*	函数名:		USB_ReceivData() 								*/
/* 	功能:		接收指定块输出传输节点的数据					*/
/*  参数:														*/
/*  			EpNum----USB CSL定义的节点号					*/
/*				*DataPtr-指向接收数据缓冲区的指针				*/
/*				*ByteCnt-指向存储接收到的总字节个数的变量地址	*/
/*	返回值:		如果成功,返回USB_TURE,否则返回USB_FALSE			*/
/****************************************************************/
USB_Boolean USB_ReceivData(USB_EpNum EpNum, Uint16 *DataPtr, Uint16 *ByteCnt)
{
	Uint16 i, Offset;
	Uint16 SourAdd;
	USB_Boolean	State = USB_FALSE;
	
	switch(EpNum)
	{	
		case USB_OUT_EP1:
			*ByteCnt = USBO1CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO1XBUF_ADDR;				// 获取缓冲基地址
			USBOD1CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP2:
			*ByteCnt = USBO2CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO2XBUF_ADDR;				// 获取缓冲基地址
			USBOD2CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP3:
			*ByteCnt = USBO3CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO3XBUF_ADDR;				// 获取缓冲基地址
			USBOD3CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP4:
			*ByteCnt = USBO4CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO4XBUF_ADDR;				// 获取缓冲基地址
			USBOD4CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP5:
			*ByteCnt = USBO5CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO5XBUF_ADDR;				// 获取缓冲基地址
			USBOD5CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP6:
			*ByteCnt = USBO6CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO6XBUF_ADDR;				// 获取缓冲基地址
			USBOD6CTL_ADDR |= DMA_GO;
			break;
			
		case USB_OUT_EP7:
			*ByteCnt = USBO7CTX_ADDR&0x7F;			// 获取接收到的字节长度
			Offset = USBO7XBUF_ADDR;				// 获取缓冲基地址
			USBOD7CTL_ADDR |= DMA_GO;
			break;
			
		default:
			return State;	
	}
	
	SourAdd = USBMOD_ADDR + (Offset<<4);			// 获取缓冲地址
	
	for(i=0; i<*ByteCnt; i++)
	{
		*DataPtr++ = (*(volatile ioport Uint16*)SourAdd);
		SourAdd++;	
	}
	
	State = USB_TRUE;
	return State;		
}

/****************************************************************/
/*	函数名:		USB_SendData() 									*/
/* 	功能:		向指定块输入传输节点发送数据					*/
/*  参数:														*/
/*  			hEp------指向一个已经初始化的节点对象的句柄		*/
/*				ByteCnt--欲发送的总字节个数						*/
/*				*DataPtr-指向数据缓冲区的指针					*/
/*				Flags----USB数据传输标志的或组合				*/
/*	返回值:		如果成功,返回USB_TURE,否则返回USB_FALSE			*/	
/****************************************************************/
USB_Boolean USB_SendData(USB_EpHandle hEp, Uint16 ByteCnt, void *DataPtr, USB_IOFLAGS Flags)
{
	USB_Boolean State;
	
	/* 发送数据 */
	State = USB_postTransaction( hEp,ByteCnt,(Uint16 *)DataPtr,Flags );
	if(!State)
	return State;
			
	/* 结束数据发送状态,发出一个In型的数据包 */
	State = USB_postTransaction( &EndptObjIn0,0,NULL,USB_IOFLAG_NONE);
		
	return State;
}

/****************************************************************/
/*	函数名:		USB_EnableDInt() 								*/
/* 	功能:		使能块输出节点(OUT1-OUT7)中断					*/
/*  参数:														*/
/*  			hEp[]---指向一个NULL终止的已经初始化的节点对象	*/
/*						句柄数组								*/
/****************************************************************/
void USB_EnableDInt(USB_EpHandle hEp[])
{
	Uint16 i, EpIndex;
	
	for(i=0; hEp[i]!=NULL; i++)
	{
		EpIndex = (Uint16)hEp[i]->EpNum;
		
		if((EpIndex<=0x07)&&(EpIndex>=0x01))
		{
			switch(EpIndex)
			{	
				case USB_OUT_EP1:
					USBOD1CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP2:
					USBOD2CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP3:
					USBOD3CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP4:
					USBOD4CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP5:
					USBOD5CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP6:
					USBOD6CTL_ADDR |= DMA_GO;
					break;
			
				case USB_OUT_EP7:
					USBOD7CTL_ADDR |= DMA_GO;
					break;
			
				default:
					break;
			}
		}
	}
}

/****************************************************************/
/*	函数名:		USB_InitConfig() 								*/
/* 	功能:		对5509片上的USB进行初始化配置					*/
/*  参数:														*/
/*  			hEp[]---指向一个NULL终止的已经初始化的节点对象	*/
/*						句柄数组								*/
/* 				EpIn0EventMark----输入控制节点中断事件的或组合	*/
/* 				EpOut0EventMark---输出控制节点中断事件的或组合	*/
/****************************************************************/
void USB_InitConfig(USB_EpHandle hEp[], Uint16 EpIn0EventMark, Uint16 EpOut0EventMark)
{
	 /* Set IVPH/IVPD to start of interrupt vector table */
	 IRQ_setVecs((Uint32)(&VECSTART));
	 
	 /* 初始化API */
	 USB_setAPIVectorAddress();    
	 
	 /* 设置USB的时钟,运行在48MHz */
     USB_initPLL(12,48,0);
		
	 /* 进行USB的节点初始化 */
     USB_EndpointInit(EpIn0EventMark,EpOut0EventMark);
     
     /* 进行USB的初始化 */
     while(!(USB_init(USB0,hEp,0) == USB_TRUE)){};				  			
     
     /* 设置寄存器ST1的INTM位,使能所有的中断 */
	 IRQ_globalEnable(); 
	 
	 /* 使能USB中断 */   
     IRQ_enable(IRQ_EVT_USB);
     
     /* 使能USB单元 */
     USB_connectDev(USB0);
}

/****************************************************************/
/*	函数名:		USB_DefaultDeal() 								*/
/* 	功能:		5509片上的USB进入死循环后,不断地检测状态信息,	*/
/*				如果满足相应的系统默认状态设置,就执行相应的动作	*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void USB_DefaultDeal(void)
{
	Uint16 i, j, Temp;
	
  	if(usbflag == USB_BULK1_WRITE)	// 块写操作
    {
     	/* 写endpoint1in*/
     	usbflag =0;
     	j=1;
   
     	for(i=0; i<100;)
     	{
     		Temp = i&0x00FF;
     		i++;
     		usbbuffer[j] = (Temp<<8) + i;
     		i++;
     		j++;
     	}
     		
     	/* 发送数据 */
		USB_SendData(&EndptObjIn1,48,&usbbuffer,USB_IOFLAG_SWAP);
    }
     	
	if(usbflag == USB_BULK2_WRITE)
    {
    	/* 写endpoint2in */
    	usbflag =0;
     	   	
		for(i=0; i<usbreceilen/2+1; i++)
    	{
     		Temp = usbbuffer[2*i];
     		usbbuffer[i+1] = usbbuffer[2*i+1]*0x100+Temp;	
    	}
	
    	/* 发送数据 */
 		USB_SendData(&EndptObjIn2,usbreceilen,&usbbuffer,USB_IOFLAG_NONE);
   	}
     	
	if(usbflag == USB_BULK2_READ)	// 块读操作
    {
     	usbflag = 0;
     		
     	/* 接收PC机传来的数据 */
    	USB_ReceivData(USB_OUT_EP2,usbbuffer,&usbreceilen);
    }
     	
    /*		
    // 接收PC机下传的数据时,也可以在系统死循环里采用查询方法
    // 但必须注意应该先使能所对应输出节点的中断
    if(USBOEPIF_ADDR == 0x0004)
    {
     	USBOEPIF_ADDR = 0x0004;	
     		
     	// 接收数据

⌨️ 快捷键说明

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