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

📄 pdiusbd12.c

📁 HID 设备测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*===============================================================================//
//== 文 件 名:PDIUSBD12.c
//== author	 :gnsusn
//== 说    明:对PDIUSBD12芯片的操作
//== 修改日志:2008.8.13 创建文件
//== 
//===============================================================================*/
#include "PDIUSBD12.h"
#include "USB.h"
#include "functions.h"

//***************************************************************************************
//=======================================================================================
#define D12_COMMAND_ADD	(*(unsigned char volatile xdata*)0x6001)
#define D12_DATA_ADD	(*(unsigned char volatile xdata*)0x6000)

extern unsigned char		usb_transmit_buf[8];	//== 用于给USB发送数据的缓冲区,在USB.c中定义
extern EPPFLAGS				bEPPflags;				//== 程序运行状态标志,在USB.c中定义
extern CONTROL_DATA_BUFF	Control_Data;			//== setup 包,在USB.c中定义

D12_INTERRUPT_REGISTER		D12_interrupt_register;	//== D12中断寄存器的标志
D12_LAST_STATUS				D12_last_status;		//== 端点的最后处理状态
 
/****************************** PDIUSBD12硬件提取层 ******************************/
//===============================================================================//
//== 函 数 名:write_D12_command
//== 功    能:向D12写入一个字节的命令
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:D12_command:向D12写入的命令
//== 返 回 值:0
//===============================================================================//
unsigned char write_D12_command(unsigned char D12_command)
{
	D12_COMMAND_ADD = D12_command;	
	return 0;
}

//===============================================================================//
//== 函 数 名:write_a_D12_data
//== 功    能:向D12写入一个字节的命令
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:D12_data:向D12写入的数据
//== 返 回 值:0
//===============================================================================//
unsigned char write_a_D12_data(unsigned char D12_data)       
{
	D12_DATA_ADD = D12_data;
	return 0;
}

//===============================================================================//
//== 函 数 名:read_a_usb_data
//== 功    能:从D12读出一个字节
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:ret:从D12读出的数据
//===============================================================================//
unsigned char read_a_D12_data(void)
{
	unsigned char ret;

	ret = D12_DATA_ADD;
	return ret;
}

/**************************** PDIUSBD12硬件提取层结束 ****************************/


/****************************** PDIUSBD12硬件命令层 ******************************/
//===============================================================================//
//== 函 数 名:set_usb_addr
//== 功    能:设置D12的地址
//== 说    明:开机后单片机设置D12的地址,并使能这个地址,这个地址默认为0
//==		 :设置地址使能写入一个字节
//==		 :D7:置1使能该功能
//==		 :D6~D0:写入的字节即为地址
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_usb_addr(unsigned char addr)
{
	#ifdef __DEBUG__
		Print_Msg("Runing set_usb_addr()!\r\n");
	#endif

	write_D12_command(Set_Address);
	write_a_D12_data(Address_Enable|addr);					//== Address_Enable:0x80 使能这个地址

	#ifdef __DEBUG__
		Print_Msg("	设置地址.....................!\r\n");
		Print_Msg("		地址为:");
		Print_Long(addr);
		Print_Msg("!\r\n");
	#endif

	return 0;
}

//===============================================================================//
//== 函 数 名:set_endpoint_enable
//== 功    能:使能端点0
//== 说    明:通过设置设置地址(设备地址)/使能命令后才可使能(端点0)普通/同步端点
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_enable(void)
{
	#ifdef __DEBUG__
		Print_Msg("Runing set_endpoint_enable()!\r\n");
	#endif
	#ifdef __DEBUG__
		Print_Msg("	使能端点0!\r\n");
	#endif

	write_D12_command(Set_Endpoint_Enable);
	write_a_D12_data(0x01);									//== 值1 表示普通/同步端点使能
	return 0;
}

//===============================================================================//
//== 函 数 名:set_endpoint_disable
//== 功    能:禁止端点0
//== 说    明:通过设置设置地址(设备地址)/使能命令后才可使能(端点0)普通/同步端点
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_disable(void)
{
	#ifdef __DEBUG__
		Print_Msg("Runing set_endpoint_disable()!\r\n");
	#endif
	#ifdef __DEBUG__
		Print_Msg("	禁止端点0!\r\n");
	#endif
	write_D12_command(Set_Endpoint_Enable);
	write_a_D12_data(0x00);									//== 值1 表示普通/同步端点使能
	return 0;
}
//===============================================================================//
//== 函 数 名:read_interrupt_register
//== 功    能:从D12读出中断状态寄存器
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char read_interrupt_register(void)
{
	#ifdef __DEBUG__
		Print_Msg("Runing read_interrupt_register()!\r\n");
	#endif

	write_D12_command(Read_Interrupt_Register);
	D12_interrupt_register.Register[0] = read_a_D12_data();
	D12_interrupt_register.Register[1] = read_a_D12_data();

	#ifdef __DEBUG__
		Print_Msg("	中断寄存器数据是:");
		Print_Hex(D12_interrupt_register.Register, 2);
		Print_Msg("\r\n");
	#endif
	return 0;
}

//===============================================================================//
//== 函 数 名:select_endpoint
//== 功    能:选择端点
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:bit0--1表示缓冲区满,0表示缓冲区空
//             bit1--1表示端点处于停止状态,0表示运行
//===============================================================================//
unsigned char select_endpoint(unsigned char endp)
{
	unsigned char ret;
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing select_endpoint()!\r\n");
	#endif

	write_D12_command(Select_EndPoint+endp);
	ret = read_a_D12_data();

	#ifdef __DEBUG__
		Print_Msg("	选择了端点:");
		Print_Long(endp);
		Print_Msg("	端点状态:");
		Print_Hex(&ret, 1);
		Print_Msg("!\r\n");
	#endif

	return ret;
}

//===============================================================================//
//== 函 数 名:read_last_status
//== 功    能:读取端点最后处理状态,命令为0x40+endp
//== 说    明:该命令同时复位中断寄存器中的相应位,并将状态清零,表示已读取。
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:端点最后处理状态寄存器
//===============================================================================//
unsigned char read_last_status(unsigned char endp)
{
	unsigned char ret;
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing read_last_status()!\r\n");
	#endif

	write_D12_command(Read_Last_Status+endp);
	ret = read_a_D12_data();

	#ifdef __DEBUG__
		Print_Msg("	读取端点 ");
		Print_Long(endp);
		Print_Msg(" 最后处理状态状态,");
		Print_Msg("	端点状态是:");
		Print_Hex(&ret, 1);
		Print_Msg("!\r\n");
	#endif

	return ret;
}

//===============================================================================//
//== 函 数 名:set_endpoint_status
//== 功    能:设置端点状态,停止或运行端点,命令为0x40+endp
//== 说    明:端点状态 1:停止 0:运行
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//			   status:端点状态
//					   bit1-bit7为保留位 
//					   bit0 = 1--表示端点处于停止状态
//== 返 回 值:0
//===============================================================================//
unsigned char set_endpoint_status(unsigned char endp,unsigned char status)  
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing set_endpoint_status()!\r\n");
	#endif

	write_D12_command(0x40+endp);
	write_a_D12_data(status);
	return 0;
}

//===============================================================================//
//== 函 数 名:read_endpoint_status
//== 功    能:读端点状态,命令为0x80+endp
//== 说    明:主要作用是判断端点缓冲区是否满
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号(0-5)
//== 返 回 值:当前端点状态信息
//===============================================================================//
unsigned char read_endpoint_status(unsigned char endp)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing read_endpoint_status()!\r\n");
	#endif

	write_D12_command(0x80+endp);
	return read_a_D12_data();
}

//===============================================================================//
//== 函 数 名:clear_buffer
//== 功    能:清缓冲区,命令为0xf2
//== 说    明:清的是选择的端点的缓冲区,在读取缓冲数据后调用
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char clear_buffer(void)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing clear_buffer()!\r\n");
	#endif

	write_D12_command(Clear_Buffer);
	return 0;
}

//===============================================================================//
//== 函 数 名:validate_buffer
//== 功    能:缓冲区数据有效
//== 说    明:选择的端点的缓冲区有效,在写缓冲后调用
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char validate_buffer(void)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing validate_buffer()!\r\n");
	#endif

	write_D12_command(Validate_Buffer);
	return 0;
}


//===============================================================================//
//== 函 数 名:ack_setup
//== 功    能:应答建立包
//== 说    明:处理完 setup 包后调用
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点索引号

⌨️ 快捷键说明

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