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

📄 d12int.c

📁 USB通信测试软件 -- 与S3C44B0的下位机通信的软件. XP驱动------------ PDIUSBD12的PC机驱动程序.USB_Test---------S3C44B0X板的USB固件程
💻 C
字号:
/*
;*************************************************************************************************************
;*									  	 江西师范大学物理通讯电子学院
;*
;*                                     	      创  新  中  心
;*
;*--------------------------------------------- 文件信息 -----------------------------------------------------                                      
;* 文件名称 : D12Int.c
;* 文件功能 : PDIUSBD12的中断服务函数实现.
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 --------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006-11-14
;* 版本声明 : V1.0.0
;*-------------------------------------------- 历史版本信息 --------------------------------------------------
;* 文件作者 : 
;* 创建日期 : 
;* 版本声明 : 
;*-----------------------------------------------------------------------------------------------------------
;*************************************************************************************************************                         
;*/
#ifndef _D12Int_c_
#define _D12Int_c_

#include "..\INC\D12Config.h"
#include "..\INC\USBecd.h"
#include "..\INC\Descriptor.h"
#include "..\INC\D12Int.h"
#include "..\..\Uart_driver\inc\Uart_driver.h"

INT8U * usb_send_ptr;						//USB 发送的数据的指针
INT16U usb_send_remain;						//USB还没有发送的数据个数
INT8U  usbSendDescNoEnd;					//USB 发送描述符没有结束1:表示没有,0:结束
INT8U  Ep2OutBuf[EP2_PACKET_SIZE];			//USB端口2的接收与发送的数据缓冲区		
INT8U usb_RxTx_size;						//USB端口2的接收与发送的数据长度
INT8U boolEp2Tx=0;							//USB端口2的发送开关量.
/*
*************************************************************************************************************
*                 PDIUSBD12 中断服务函数 
*************************************************************************************************************
*/
INT8U (*StandardDeviceRequest[])(USB_DEVICE_REQUEST *sDeviceRequest) = {
	USB_Get_Status,
	USB_Clear_Feature,
	USB_Reserved,
	USB_Set_Feature,
	USB_Reserved,
	USB_Set_Address,
	USB_Get_Descriptor,
	USB_Reserved,
	USB_Get_Configuration,
	USB_Set_Configuration,
	USB_Get_Interface,
	USB_Set_Interface,
	USB_Reserved,
	USB_Reserved,
	USB_Reserved,
	USB_Reserved
};
 
void INT_FLAG D12_Exception(void)
{
	INT16U i_st;
	#if USB_INT
		USB_CLR_INTD12();		//清除中断标志
	#endif	
	i_st=D12_ReadInterruptRegister();		//读取PDIUSBD12中断寄存器的值
	if(i_st!=0)
	{	
		#if	USB_DEBUG
			printf("\nUSB Interrupt %d   ",i_st);
		#endif
		if(i_st & USB_INT_CONTROL_OUT)	    //控制端点输出
		{
			#if USB_DEBUG
				printf("D12_Ep0_RxIntProc()");
			#endif
			D12_Ep0_RxIntProc();
		}
		if(i_st & USB_INT_CONTROL_IN)		//控制端点输入
		{
			#if USB_DEBUG
				printf("D12_Ep1_TxIntProc()");
			#endif
			D12_Ep1_TxIntProc();
		}
		if(i_st & USB_INT_ENDPOINT1_OUT)	//端点1输出
		{
			#if USB_DEBUG
				printf("D12_Ep2_RxIntProc()");
			#endif
			D12_Ep2_RxIntProc();
		}
		if(i_st & USB_INT_ENDPOINT1_IN)	    //端点1输入
		{
			#if USB_DEBUG
				printf("D12_Ep3_TxIntProc()");
			#endif
			D12_Ep3_TxIntProc();
		}
		if(i_st & USB_INT_ENDPOINT2_OUT)	//端点2输出
		{
			#if USB_DEBUG
				printf("D12_Ep4_RxIntProc()");
			#endif
			D12_Ep4_RxIntProc();
		}
		if(i_st & USB_INT_ENDPOINT2_IN)	    //端点2输入
		{
			#if USB_DEBUG
				printf("D12_Ep5_TxIntProc()");
			#endif
			D12_Ep5_TxIntProc();
		}
		if(i_st & USB_INT_BUS_RESET)	    //总线复位处理
		{
			#if USB_DEBUG
				printf("D12_BusRstIntProc()");
			#endif
			D12_BusRstIntProc();
		}
		if(i_st & USB_INT_SUSPEND_CHANGE)	//挂起改变
		{
			#if USB_DEBUG
				printf("D12_SuspChgIntProc()");
			#endif
		D12_SuspChgIntProc();
		}
		if(i_st & USB_INT_EOT)				//DMA EOT
		{
			#if USB_DEBUG
				printf("D12_DMAEotIntProc()");
			#endif
			D12_DMAEotIntProc();
		}		
	}	
}

/*
*************************************************************************************************************
- 函数名称 : Usb_Send_Desc(void)
- 函数说明 : 用来发送描述符数据函数.
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Usb_Send_Desc(void)
{
	#if USB_DEBUG
	INT8U i;
	#endif
	
	usbSendDescNoEnd= (usb_send_remain>=EP0_PACKET_SIZE); //判断是否下次还要发送数据	
	D12_WriteEndpoint(USB_ENDPOINT_CONTROL_IN,
	(usb_send_remain>EP0_PACKET_SIZE)?EP0_PACKET_SIZE:usb_send_remain,usb_send_ptr);

	//调试时使用
	//-------------------------------------------------------------------------------------------
	#if USB_DEBUG
	printf("\n@");		//输出发送到主机的描述符数据
	for(i=0; i<((usb_send_remain>EP0_PACKET_SIZE) ? EP0_PACKET_SIZE: usb_send_remain); i++)
		printf("%x,", *(INT8U*)(usb_send_ptr+i));	
	#endif	
	//-------------------------------------------------------------------------------------------
	
	usb_send_remain -= EP0_PACKET_SIZE;	
	usb_send_ptr+= EP0_PACKET_SIZE;
	
}	
/*
*************************************************************************************************************
- 函数名称 : D12_Ep0_RxIntProc(void)
- 函数说明 : PDIUSBD12 控制端点接收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep0_RxIntProc(void)
{
	USB_DEVICE_REQUEST sDeviceRequest;			    //外部设备请求包
	INT8U  setupPkt[sizeof(USB_DEVICE_DESCRIPTOR)];	//SETUP包接收缓冲区
	INT8U ep_last;	

	#if USB_DEBUG		//在调试的情况下
		INT8U i;
	#endif

	usbSendDescNoEnd = 0;		//结束
	
	 //清除中断标志,且读出最后处理状态寄存器  
	ep_last=D12_ReadLastTransactionStatus(USB_ENDPOINT_CONTROL_OUT); 
	if(ep_last & USB_XACTION_STATUS_SETUP_PACKET)						//是设备信息包
		if(D12_ReadEndpoint(USB_ENDPOINT_CONTROL_OUT, sizeof(USB_DEVICE_REQUEST), setupPkt)
			==sizeof(USB_DEVICE_REQUEST))
		{
			D12_AcknowledgeEndpoint(USB_ENDPOINT_CONTROL_OUT);			//对控制端点0进行建立包应答
			D12_AcknowledgeEndpoint(USB_ENDPOINT_CONTROL_IN);			//对控制端点1进行建立包应答

			//调试时使用
			//-------------------------------------------------------------------------------
			#if USB_DEBUG
				printf("\n*");
				for(i=0; i<8; i++)					//输出SetuP 包的数据
					printf("%x,", setupPkt[i]);
				printf("*");
			#endif
			//-------------------------------------------------------------------------------
			
			/****************************以下语句是在小端方式下完成*********************************/
			//建立设备请求包sDeviceRequest
			sDeviceRequest.bmRequestType=setupPkt[0];
			sDeviceRequest.bRequest=setupPkt[1];
			sDeviceRequest.wValue=setupPkt[3]*256+setupPkt[2];
			sDeviceRequest.wIndex=setupPkt[5]*256+setupPkt[4];
			sDeviceRequest.wLength=setupPkt[7]*256+setupPkt[6];
			/***************************************************************************************/
			
			StandardDeviceRequest[sDeviceRequest.bRequest & 0xf](&sDeviceRequest);
				return;
		}	
	D12_SetEndpointStatus(USB_ENDPOINT_CONTROL_OUT, USB_SET_ENDPOINT_STALL);
	D12_SetEndpointStatus(USB_ENDPOINT_CONTROL_IN, USB_SET_ENDPOINT_STALL);		
}

/*
*************************************************************************************************************
- 函数名称 : D12_Ep1_TxIntProc(void)
- 函数说明 : PDIUSBD12 控制端点发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep1_TxIntProc(void)
{
	INT8U ep_last;
	
	//读取最后处理状态寄存器
	ep_last=D12_ReadLastTransactionStatus(USB_ENDPOINT_CONTROL_IN);     //清除中断标志位
	if(usbSendDescNoEnd)		//若没有结束则在发
		Usb_Send_Desc();
		
}

extern void ShowLed(INT8U );
/*
*************************************************************************************************************
- 函数名称 : D12_Ep2_RxIntProc(void)
- 函数说明 : PDIUSBD12 端点1接 收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep2_RxIntProc(void)
{
    INT8U size;
	INT8U Ep2OutBuf[EP2_PACKET_SIZE];

	//读取最后处理状态寄存器
	D12_ReadLastTransactionStatus(USB_ENDPOINT_COMMAND_OUT);
	size = D12_ReadEndpoint(USB_ENDPOINT_COMMAND_OUT, EP1_PACKET_SIZE, Ep2OutBuf);
	if((size==6) && (*(int *)Ep2OutBuf==0x12345678))
	{
		#if USB_DEBUG				//调试时输出
			printf("接收到数据 %x,%x",Ep2OutBuf[4],Ep2OutBuf[5]);
		#endif
		
		ShowLed((Ep2OutBuf[4])>>1);
		
	}
	//D12_SetEndpointStatus(USB_ENDPOINT_COMMAND_OUT, USB_SET_ENDPOINT_STALL);
}

/*
*************************************************************************************************************
- 函数名称 : D12_Ep3_TxIntProc(void)
- 函数说明 : PDIUSBD12 端点1发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep3_TxIntProc(void)
{
    D12_ReadLastTransactionStatus(USB_ENDPOINT_ACK_IN);     //清除中断标志位
	D12_SetEndpointStatus(USB_ENDPOINT_ACK_IN , USB_SET_ENDPOINT_STALL);
}

/*
*************************************************************************************************************
- 函数名称 : D12_Ep4_RxIntProc(void)
- 函数说明 : PDIUSBD12主输出端点接收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep4_RxIntProc(void)
{		
	INT8U i;
	
	//读取最后处理状态寄存器
	D12_ReadLastTransactionStatus(USB_ENDPOINT_BULK_OUT);
	usb_RxTx_size=D12_ReadEndpoint(USB_ENDPOINT_BULK_OUT, EP2_PACKET_SIZE,Ep2OutBuf);
	/*#if USB_DEBUG
		printf("接收到数据为:");
		for(i=0;i<size;i++)
			printf("%02x ",Ep2OutBuf[i]);
		printf(" %x",(*(int *)Ep2OutBuf));
	#endif	
	if((size==6) && (*(int *)Ep2OutBuf==0x78563412))
	{		
		ShowLed((Ep2OutBuf[4])>>1);
	}*/
	printf("\n接收到数据为:\n");
	for(i=0;i<usb_RxTx_size;i++)
		printf("%c",(INT8)Ep2OutBuf[i]);
}

/*
*************************************************************************************************************
- 函数名称 : D12_Ep5_TxIntProc(void)
- 函数说明 : PDIUSBD12 主输入端点发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep5_TxIntProc(void)
{
	INT8U i;
    D12_ReadLastTransactionStatus(USB_ENDPOINT_BULK_IN);
    if(!boolEp2Tx)	//还没有发送数据.0:没有发送数据,0xff表示:发送数据后的自己产生的中断非外部读数据中断    
   	{
   		printf("\n发送数据到主机的数据为:\n");
		for(i=0;i<usb_RxTx_size;i++)
			printf("%c",(INT8)Ep2OutBuf[i]);	
		D12_WriteEndpoint(USB_ENDPOINT_BULK_IN,usb_RxTx_size, Ep2OutBuf);
	}
	boolEp2Tx=~boolEp2Tx;
}

/*
*************************************************************************************************************
- 函数名称 : D12_BusRstProc()
- 函数说明 : PDIUSBD12 总线复位中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/

void D12_BusRstIntProc(void)
{
}

/*
*************************************************************************************************************
- 函数名称 : D12_SuspChgProc(void)
- 函数说明 : PDIUSBD12 挂起改变中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_SuspChgIntProc(void)
{
}

/*
*************************************************************************************************************
- 函数名称 : D12_DMAEotIntProc(void)
- 函数说明 : PDIUSBD12  DMA 操作完成中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_DMAEotIntProc(void)
{
}
      
#endif 

⌨️ 快捷键说明

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