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

📄 ep_pair.c

📁 《单片机通信技术与工程实践》一书的源码
💻 C
字号:
#pragma NOIV					// Do not generate interrupt vectors
//-----------------------------------------------------------------------------
//	File:		periph.c
//	Contents:	Hooks required to implement USB peripheral function.
//
//	Copyright (c) 1997 AnchorChips, Inc. All rights reserved
//-----------------------------------------------------------------------------
#include "ezusb.h"
#include "ezregs.h"

extern BOOL	GotSUD;			// 收到装载数据的标志
extern BOOL Sleep;

void TD_Poll(void);

BYTE	Configuration;		// 当前配置
BYTE	AlternateSetting;	// 替换配置

//-----------------------------------------------------------------------------
// Task Dispatcher hooks
//	The following hooks are called by the task dispatcher.
//-----------------------------------------------------------------------------

void TD_Init(void) 				// 开始时调用
{
	// 使能端点2输入和端点2输出
	IN07VAL = bmEP2;			
	OUT07VAL = bmEP2;

	// 使能端点2的输入缓存和输出缓存
	USBPAIR = 0x09;

	// 使端点2输出接收数据
	EPIO[OUT2BUF_ID].bytes = 0;

	// 设置断点以便在TD_Poll()函数中触发
	BPADDR = (WORD)TD_Poll;
	USBBAV |= bmBPEN;				// 使能断点
	USBBAV &= ~bmBPPULSE;
}

void TD_Poll(void) 				// 当设备闲置时重复调用
{
	BYTE	count, i;

	if(	!(EPIO[OUT2BUF_ID].cntrl & bmEPBUSY) )		// 判断OUT2BUF缓存是否有效
		if( !(EPIO[IN2BUF_ID].cntrl & bmEPBUSY) )	// IN2BUF缓存是否有效
		{
			count = EPIO[OUT2BUF_ID].bytes;		// 将OUT2BUF中的数据回送至IN2BUF
			for(i=0;i<count;++i)
				IN2BUF[i] = OUT2BUF[i];
			EPIO[OUT2BUF_ID].bytes = 0;
			EPIO[IN2BUF_ID].bytes = count;
		}
}

BOOL TD_Suspend(void) 			// 设备进入挂起状态前调用该函数
{
	// 在进入挂起状态之前屏蔽断点
	USBBAV |= bmBREAK;		// 清除断点
	return(TRUE);
}

BOOL TD_Resume(void) 			// 设备重启后调用
{
	return(TRUE);
}

//-----------------------------------------------------------------------------
// Device Request hooks
//	The following hooks are called by the end point 0 device request parser.
//-----------------------------------------------------------------------------

BOOL DR_GetDescriptor(void)		//当一个获取设备描述命令有效时调用该函数
{
	return(TRUE);
}

BOOL DR_SetConfiguration(void)	// 当一个设置配置命令有效时调用该函数
{
	Configuration = SETUPDAT[2];	// 设置配置信息
	return(TRUE);				// 由用户代码处理
}

BOOL DR_GetConfiguration(void)	// 当一个获取配置命令有效时调用该函数
{
	IN0BUF[0] = Configuration;		// 获取配置信息
	EZUSB_SET_EP_BYTES(IN0BUF_ID,1);
	return(TRUE);				// 由用户代码处理
}

BOOL DR_SetInterface(void) 		// 当一个设置接口命令有效时调用该函数
{
	AlternateSetting = SETUPDAT[2];
	return(TRUE);				// 由用户代码处理
}

BOOL DR_GetInterface(void) 		// 当一个获取接口命令有效时调用该函数
{
	IN0BUF[0] = AlternateSetting;
	EZUSB_SET_EP_BYTES(IN0BUF_ID,1);
	return(TRUE);				// 由用户代码处理
}

BOOL DR_GetStatus(void)			// 当一个获取状态命令有效时调用该函数
{
	return(TRUE);
}

BOOL DR_ClearFeature(void)		// 清除设备请求特征
{
	return(TRUE);
}

BOOL DR_SetFeature(void)		// 设置设备请求特征
{
	return(TRUE);
}

BOOL DR_VendorCmnd(void)		// 获取厂商信息
{
	return(TRUE);
}

//-----------------------------------------------------------------------------
// USB Interrupt Handlers
//	The following functions are called by the USB interrupt jump table.
//-----------------------------------------------------------------------------

// Setup Data Available Interrupt Handler
void ISR_Sudav(void) interrupt 0
{
	GotSUD = TRUE;				// 设置标志位
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUDAV;			// 清除SUDAV中断请求
}

// Setup Token Interrupt Handler
void ISR_Sutok(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUTOK;			// 清除SUTOK中断请求
}

void ISR_Sof(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSOF;				// 清除SOF中断请求
}

void ISR_Ures(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmURES;			// 清除URES中断请求
}

void ISR_IBN(void) interrupt 0
{
   // ISR for the IN Bulk NAK (IBN) interrupt.
}

void ISR_Susp(void) interrupt 0
{
	Sleep = TRUE;
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUSP;
}

void ISR_Ep0in(void) interrupt 0
{
}

void ISR_Ep0out(void) interrupt 0
{
}

void ISR_Ep1in(void) interrupt 0
{
}

void ISR_Ep1out(void) interrupt 0
{
}

void ISR_Ep2in(void) interrupt 0
{
}

void ISR_Ep2out(void) interrupt 0
{
}

void ISR_Ep3in(void) interrupt 0
{
}

void ISR_Ep3out(void) interrupt 0
{
}

void ISR_Ep4in(void) interrupt 0
{
}

void ISR_Ep4out(void) interrupt 0
{
}

void ISR_Ep5in(void) interrupt 0
{
}

void ISR_Ep5out(void) interrupt 0
{
}

void ISR_Ep6in(void) interrupt 0
{
}

void ISR_Ep6out(void) interrupt 0
{
}

void ISR_Ep7in(void) interrupt 0
{
}

void ISR_Ep7out(void) interrupt 0
{
}

⌨️ 快捷键说明

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