www.pudn.com > usbcode.rar > D12ISR.c


/*++ 
 
Module Name: 
 
         D12ISR.c 
 
Abstract: 
 
         Header file related to D12 module 
 
Environment: 
 
        ICCAVR 6.29 
 
Revision History: 
 
        04/23/2004      chenchi   created 
 
--*/ 
/******************************************************************/ 
#include "io8515v.h" 
#include "d12.h" 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.29 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:中断服务处理 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:D12_COMMAND,D12_DATA 
**调用的函数说明: 
  Setup_control():枚举控制函数 
  USB_submit():控制端点提交函数 
  Bulk_Out_Pack(j):处理PC发送的批量传输包 
  Bulk_In_Packet():回应批量传输包 
  void bus_reset(void):总线重置 
  void dma_eot(void):Dma 操作结束 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void D12_ISR(void) 
{ 
	unsigned char i,j; 
	D12_COMMAND = 0xf4;// 读中断寄存器 
	cwait1; 
	i=D12_DATA;//读取数据赋值给局部变量i 
	csram; 
	if(i & 0x01)//处理控制输出端点 
	{ 
		D12_COMMAND = 0x40;//读最后状态 
		cwait1; 
		i= D12_DATA;//从端点缓冲区读取数据 
		csram; 
		if (i & 0x20) //收到SETUP包 
		{ 
			Setup_control();//枚举控制函数 
		} 
	}else if(i & 0x02)//处理控制输入端点 
	{ 
		D12_COMMAND = 0x41;//读最后状态 
		cwait1; 
		i = D12_DATA;//从端点缓冲区读取数据 
		csram; 
		USB_submit();//控制端点提交函数 
	}else if(i & 0x04)//处理端点1输出 
	{ 
		 
	}else if(i & 0x08)//处理端点1输入 
	{ 
 
	}else if(i & 0x10)//处理批量输出端点 
	{ 
		D12_COMMAND = 0x44;//读最后状态 
		cwait; 
		i = D12_DATA; 
		csram; 
		D12_COMMAND = 0x04;//选择端点(指针指向0位置) 
		cwait; 
		D12_COMMAND = 0xf0;//读缓冲区 
		/**************************** 
		  缓冲区数据结构: 
		  字节1:保留,可为任意值 
		  字节2:数据字节的数目/长度 
		  字节3:数据字节1 
		  字节4:数据字节2 
		*****************************/ 
		cwait1; 
		j=D12_DATA;//字节1 
		cwait1; 
		j=D12_DATA;//字节2 
		csram; 
		Bulk_Out_Packet(j);//处理PC发送的批量传输包 
	} 
	else if(i & 0x20)//处理批量输入端点 
	{ 
		D12_COMMAND = 0x45;//读 in 最后状态 
		cwait1; 
		i = D12_DATA; 
		cwait1; 
		csram; 
		Bulk_In_Packet();//回应批量传输包 
	}else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起 
	{ 
	 
	}else if(i & 0x40)//D12_INT_BUSRESET总线复位 
	{ 
		bus_reset();//总线重置 
	}else 
	{ 
		i=D12_DATA; //D12_INT_EOT DMA操作已结束 
		if(i & 0x01) 
		{ 
			dma_eot();//Dma 操作结束 
		} 
	} 
} 
 
void bus_reset(void)//总线重置函数 
{ 
} 
 
void dma_eot(void)//Dma 操作结束函数 
{ 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.29 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:控制端点传输提交 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量:传输结构体 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void USB_submit(void) 
{ 
	unsigned char i,j,k; 
	/*********说明****************** 
	  D12芯片数据手册上说明控制端点 
	  缓冲区大小为16BYTES,使用时试用 
	  64BYTES可以完成传输,这里故用64 
	  来处理 
	*******************************/ 
	if(64 > XmtBuff.wrLength) 
	{ 
		j = XmtBuff.wrLength; 
	}else 
	{ 
		j = 64; 
	} 
	D12_COMMAND = 0x01;//选择端点(指针指向0位置) 
	cwait; 
	D12_COMMAND = 0xf0;//写缓冲区 
	cwait; 
	/**************************** 
	  缓冲区数据结构: 
	  字节1:保留,可为任意值 
	  字节2:数据字节的数目/长度 
	  字节3:数据字节1 
	  字节4:数据字节2 
	*****************************/ 
	D12_DATA = 0x00;//写字节1 
	cwait; 
	D12_DATA = j;//写字节2 
	csram; 
	for(i=0;i XmtBuff.wrLength) 
	{ 
		j = XmtBuff.wrLength; 
	}else 
	{ 
		j = 64; 
	} 
	D12_COMMAND = 0x05;// 选择端点(指针指向0位置) 
	cwait; 
	D12_COMMAND = 0xf0;// 写缓冲区 
	cwait; 
	/**************************** 
	  缓冲区数据结构: 
	  字节1:保留,可为任意值 
	  字节2:数据字节的数目/长度 
	  字节3:数据字节1 
	  字节4:数据字节2 
	*****************************/ 
	D12_DATA = 0x00;//写字节1 
	cwait; 
	D12_DATA = j;//写字节2 
	csram; 
	/***************************** 
	  判断输出 
	  XmtBuff.p_p = 0:输出一般数据 
	  XmtBuff.p_p = 1:输出CONST数据 
	******************************/ 
	if(XmtBuff.p_p) 
	{ 
		for(i=0;i