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

📄 main.c

📁 Altera公司的NIOS2SOPC平台上的USB使用试验程序。 Quartus2软件版本5.0 NIOS2IDE软件版本5.0 硬件平台根据软件需求在Quartus2软件中构建。
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2006-02-28
** Last Version:		1.0
** Descriptions:		The main() function  of D12 bulk transfer example
**
**------------------------------------------------------------------------------------------------------
** Created by:			Zhaoyong
** Created date:		2006-02-28
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Zhoushuwu 
** Modified date:       2006.5.18 
** Version:
** Descriptions:
**
********************************************************************************************************/
/******=================  modified by Zhou Shuwu ==================================***********/
//#include "config.h"
//#include "target.h"
#include "system.h"
#include "alt_types.h"
/******=================  modified by Zhou Shuwu ==================================***********/
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"

#define CMD_RECEIVE		0x01			/* 接收命令 */
#define CMD_TRANSMIT	0x02			/* 发送命令 */
#define CMD_STOP		0x03			/* 停止命令 */
/******=================  modified by Zhou Shuwu ==================================***********/
//#define	BEEPCON         0x00000080		/* P0.7引脚控制B1,低电平蜂鸣 */

/******=================  modified by Zhou Shuwu ==================================***********/
INT8U  RecBuf[1024];					/* 缓冲区 */	

INT8U  volatile EP2_tx=0;				/* 端点2发送中断标志 */
INT8U TxEnable=1;						/* 发送使能 */
INT8U ack=0;							/* 应答 */
INT8U command=0;						/* 命令字 */
INT8U num_Of_64len=0;                   /* 长度为64字节的包数 */
INT8U num_of_less64len=0;				/* 长度小于64字节的包长度 */
INT16U offset=0;						/* 偏移量 */  

extern INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf);	
void CmdServe(void);
void RxServe(void);
void TxServe(void);


/****************************************************************************
** 函数名称: void Init_Interrupt(void)
** 功能描述: 初始化MCU相关中断
*****************************************************************************/
void Init_Interrupt(void)
{
/******=================  modified by Zhou Shuwu ==================================***********/
   /*
   EXTMODE = 0x00;						// 设置EINT3中断为电平触发模式
   EXTPOLAR  = 0x00;
   */
   /* 打开EINT0中断(使用向量IRQ) */
   /*
   VICIntSelect = 0x00000000;			// 设置所有中断分配为IRQ中断  
   VICVectCntl0 = (0x20|0x11);		    // ENT3通道分配到IRQ slot0
   VICVectAddr0 = (INT32U)Usb_Exception;// 设置EINT3向量地址
   CLR_INTD12();						// 清除EINT3中断标志   
   VICIntEnable = 1 << 17;				// 使能EINT3中断
   */
   UsbIntEnable();
   UsbIRQInit();//注册中断服务程序 
   
/******=================  modified by Zhou Shuwu ==================================***********/
}


/****************************************************************************
** 函数名称: main()
** 功能描述: 主函数
*****************************************************************************/
int main(void)
{	
	/* user initial codes */
	
  
	TxEnable = 1;
    
 	/* user codes end */
	
	
	
	if (Init_D12() !=0)								/* 初始化D12 */
 		return -1;									/* 如果初始化不成功,返回 */
 		
 	Init_Interrupt();								/* 初始化D12以后,才能使能相关中断 */	
	
			
	while(1)
	{
		usbserve();									/* 处理USB事件 */		
						 								
		if (bEPPflags.bits.ep1_rxdone == 1)			/* 端点一接收到命令处理*/
		{
			
			DISABLE();
			CmdServe();			
			bEPPflags.bits.ep1_rxdone = 0;			/* 清空端点2收到数据标志 */			
			ENABLE();
		}			 

		if (bEPPflags.bits.ep2_rxdone == 1)					
		{	
			
			DISABLE();								/* 从端点2收到数据 */
			RxServe();								/* 数据处理 */			
			bEPPflags.bits.ep2_rxdone = 0;			/* 清空端点2收到数据标志 */						
			ENABLE();
		}

		if ((EP2_tx == 1)&&TxEnable)					
		{	
			
			DISABLE();								/* 从端点2发送数据 */			
			EP2_tx = 0;								/* 清端点2发送数据标志 */		
			TxServe();								/* 数据处理 */										
			ENABLE();
		}
	}
	 return 0;

}
/****************************************************************************
** 函数名称: void CmdServe(void)
** 功能描述: 执行上位机命令
*****************************************************************************/
void CmdServe(void)
{
	INT16U len;
		
 	command = GenEpBuf[0];											 // 命令字
	 
	if(command == CMD_STOP)
	{
		offset  = 0;
		num_Of_64len = 0;
		num_of_less64len = 0;  		
		return;
	}
	else 
	{
		offset = (INT16U)(GenEpBuf[1] << 8) + GenEpBuf[2];			// 接收/发送 缓冲区地址		 		
		len =(INT16U)(GenEpBuf[3] << 8) + GenEpBuf[4];
		num_Of_64len = len / EP2_RX_FIFO_SIZE;				   		// 计算64字节整数包数目	
		num_of_less64len = len % EP2_RX_FIFO_SIZE; 					// 计算剩余字节数  						
																    
		if ((command == CMD_TRANSMIT)&&TxEnable)					// 填充FIFO 
			TxServe();
	} 		
	
}
/****************************************************************************
** 函数名称: void TxServe(void)
** 功能描述: 发送数据到PC机
*****************************************************************************/
void TxServe(void)
{	
	if(command == CMD_TRANSMIT)	
	{
		if(num_Of_64len!=0)												 // 发送64字节的整数包
		{
			D12_WriteEndpoint(5,EP2_TX_FIFO_SIZE,RecBuf + offset);		 // 写发送缓冲区			
			offset += EP2_TX_FIFO_SIZE;	
			num_Of_64len --;
		}		
				  
		else if(num_of_less64len!=0)
		{			
			D12_WriteEndpoint(5,num_of_less64len,RecBuf + offset);				
			num_of_less64len = 0;
		}	
	}	
}
/****************************************************************************
** 函数名称: void RxServe(void)
** 功能描述: 指示接收状态,发送应答字。
*****************************************************************************/
void RxServe(void)
{	
	if(command == CMD_RECEIVE)
	{		  					
			
		if ((num_Of_64len==0)&&(num_of_less64len==0))
		{
			ack = 0x01;			
			D12_WriteEndpoint(3,1,&ack);								// 应答PC机:我已收到你发来的数据!				
			offset = 0;			
		} 
	}	  
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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