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

📄 main.c

📁 USB程序源代码,包括PC端和单片机端.USB控制芯片为PIDUSBD12.
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
** 文   件   名: main.c
** 最后修改日期: 2004年11月15日
** 描        述: 用户应用程序
** 版	     本: V5.0
**********************************************************************************************************/

#include <reg52.h>
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#include "string.h"


/***********************************************************
			主函数			Main Function
************************************************************/

#define CMD_RECEIVE		0x01			/* 接收命令 */
#define CMD_TRANSMIT	0x02			/* 发送命令 */
#define CMD_STOP		0x03			/* 停止命令 */
#define BUFFER_IN_XDATA					/* 定义数据缓冲区在外部ram */

#ifdef  BUFFER_IN_XDATA
INT8U xdata RecBuf[1024];				/* 缓冲区 */	
#endif

#ifdef  BUFFER_IN_IDATA 
INT8U idata RecBuf[128];				/* 缓冲区 */
#endif	

INT8U idata EP2_tx;						/* 端点2发送中断标志 */
INT8U idata Rcv128Bytes;				/* 端点收到128字节标志位 */
INT8U idata TxEnable;					/* 发送使能 */
INT8U ack;								/* 应答 */
INT8U command,i,k;
INT8U num_Of_64len;                     /* 长度为64字节的包数 */
INT8U num_of_less64len;					/* 长度小于64字节的包长度 */
INT16 offset;							/* 偏移量 */  

extern INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf);	
void CmdServe(void);
void RxServe(void);
void TxServe(void);
sfr  AUXR = 0x8E;			 			/* 只用于TKS668 仿真器 */
sbit led0 = P1^2;
sbit led1 = P1^3;

/****************************************************************************
** 函数名称: void Init_Interrupt(void)
** 功能描述: 初始化MCU相关中断
*****************************************************************************/
void Init_Interrupt(void)
{
	EX0 = 1;							/* 开外部中断0 */
	PX0 = 0;							/* 设置外部中断0中断优先级 */
	EA = 1;								/* 开80C51总中断 */

	AUXR = 0;							/* 使能668芯片内部xdata */
}

/****************************************************************************
** 函数名称: main()
** 功能描述: 主函数
*****************************************************************************/
main()
{	
	if (Init_D12()!=0)								/* 初始化D12 */
 		return;										/* 如果初始化不成功,返回 */

	Init_Interrupt();								/* 初始化D12以后,才能使能相关中断 */

	/* user code */
	TxEnable = 1; 	
		
	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();
		}

		/* Add your code here */


	}

}
/****************************************************************************
** 函数名称: 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字节的整数包
		{
			DISABLE();
			D12_WriteEndpoint(5,EP2_TX_FIFO_SIZE,RecBuf + offset);		 // 写发送缓冲区
			ENABLE();
			offset += EP2_TX_FIFO_SIZE;	
			num_Of_64len --;
		}		
				  
		else if(num_of_less64len!=0)
		{
			DISABLE();
			D12_WriteEndpoint(5,num_of_less64len,RecBuf + offset);	
			ENABLE();
			num_of_less64len = 0;
		}	
	}
}
/****************************************************************************
** 函数名称: void RxServe(void)
** 功能描述: 指示接收状态,发送应答字。
*****************************************************************************/
void RxServe(void)
{	
	if(command == CMD_RECEIVE)
	{		  					
		if (Rcv128Bytes == 1)			  						 		// 如果双缓冲区中收到数据
		    led0 = 0;			  
		else															// 只有一个缓冲区中收到数据
			led1 ^=	1;
	
		if ((num_Of_64len==0)&&(num_of_less64len==0))
		{
			ack = 0x01;
			DISABLE();
			D12_WriteEndpoint(3,1,&ack);								// 应答PC机:我已收到你发来的数据!		
			ENABLE();
			offset = 0;
			led0 = 1;
			led1 = 1;
		} 
	}	  
}

																							

⌨️ 快捷键说明

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