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

📄 pdiusbd12.c

📁 HID 设备测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//== 返 回 值:0
//===============================================================================//
unsigned char ack_setup(unsigned char endp)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing ack_setup()!\r\n");
	#endif

	select_endpoint(endp);
	write_D12_command(Ack_Setup);
	return 0;
}

//===============================================================================//
//== 函 数 名:error
//== 功    能:出错处理
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:number:错误号
//== 返 回 值:0
//===============================================================================//
unsigned char error(unsigned char number)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing error()!\r\n");
	#endif

 	number = 0;
	return 0;
}

//===============================================================================//
//== 函 数 名:read_endpoint_buff
//== 功   能 :读端点缓冲区(读取逻辑端点0和1),读出的数据为
//== 说   明 :字节1: 保留可为任意值
//==		 :字节2: 数据字节的数目/长度
//==		 :字节3: 数据字节1
//==		 :字节4: 数据字节2
//== 时   间 :2008.8.13 创建函数
//== 入口参数:endp:端点号 len:要读出的长度 buff:存储的缓冲区
//== 返 回 值:ret:实际读取的字节数
//===============================================================================//
unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff)
{
	unsigned char i, ret;

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing read_endpoint_buff()!\r\n");
	#endif

	//== 进行端点操作前要选择端点
	if ((select_endpoint(endp)&0x01) == 0x00)//== 端点缓冲区为空时返回,端点必须在运行状态时才可引发中断
	{									//== 所以这里只是判断缓冲区是否满,并没有要判断端点是否运行
		error(0);
		return 0;
	}

	write_D12_command(Read_Buffer);		//== 读缓冲区命令,读nB
	read_a_D12_data();					//== 读出的第一个字节,保留,可为任意值
	ret = read_a_D12_data();			//== 读出的第二个字节是数据字节的数目/长度

	if (ret > len)						//== 数据字节长度最大130B
	{
 		ret = len;
	}

	for (i=0; i<ret; i++)
 	{
		*(buff+i) = D12_DATA_ADD;
	}
	clear_buffer();
	return ret;
}

//===============================================================================//
//== 函 数 名:read_main_endpoint_buff
//== 功   能 :读端点4缓冲区(主输出端点),读出的数据为
//== 说   明 :字节1: 保留可为任意值
//==		 :字节2: 数据字节的数目/长度
//==		 :字节3: 数据字节1
//==		 :字节4: 数据字节2
//==		 :主端点4和5都是双缓冲区,每个端点都有2个64字节的缓冲区
//== 时   间 :2008.8.13 创建函数
//== 入口参数:buff:存储的缓冲区
//== 返 回 值:ret:实际读取的字节数
//===============================================================================//
unsigned char read_main_endpoint_buff(unsigned char* buff)
{
	unsigned char i, ret;
	unsigned char bDbuBuf = 1;			//== 记录有几个缓冲区满
	unsigned char j = 0;

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing read_main_endpoint_buff()!\r\n");
	#endif
 
	if ((read_endpoint_status(0x84)&0x60) == 0x60)//== 两个缓冲区都满都满,要读取128个字节
	{
//		error(0);
		bDbuBuf = 2;
	}

	for (; bDbuBuf>0; bDbuBuf--)
	{	//== 进行端点操作前要选择端点
		if ((select_endpoint(0x04))&0x01 == 0x00)	//== 端点缓冲区为空时退出
		{
			break;
		}

		write_D12_command(Read_Buffer);		//== 读缓冲区命令,读nB
		read_a_D12_data();					//== 读出的第一个字节,保留,可为任意值
		ret = read_a_D12_data();			//== 读出的第二个字节是数据字节的数目/长度

		for (i=0; i<ret; i++)				//== 数据字节长度最大130B
		{
			*(buff+i+j) = D12_DATA_ADD;
		}

		j += ret;
		clear_buffer();
	}
	ret = j;

	return ret;
}

//===============================================================================//
//== 函 数 名:write_endpoint_buff
//== 功    能:写端点缓冲区
//== 说    明:最多一次能写入130个字节
//== 时    间:2008.8.13 创建函数
//== 入口参数:endp:端点号 len:要写入的长度 buff:存储的缓冲区
//== 返 回 值:len:实际写入的字节数
//===============================================================================//
unsigned char write_endpoint_buff(unsigned char endp, unsigned char len, unsigned char* buff)
{
	unsigned char i;

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing write_endpoint_buff()!\r\n");
	#endif

	read_last_status(endp);
	select_endpoint(endp);

	write_D12_command(Write_Buffer);
	write_a_D12_data(0);				//== 写入的第一个字节保留,总为0
	write_a_D12_data(len);

	for (i=0; i<len; i++)
	{
		D12_DATA_ADD = *(buff+i);
	}
	
	validate_buffer();

	Print_Msg("************** ");
	Print_Hex(buff, len);
	Print_Msg("**************!\r\n");
	
	return len;
}

//===============================================================================//
//== 函 数 名:disconnect_usb
//== 功    能:断开USB连接
//== 说    明:断开后要有一100ms的延时
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char disconnect_usb(void)
{
	unsigned int i;

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing disconnect_usb()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("	断开USB连接........................\r\n");
	#endif

	write_D12_command(0xf3);
	write_a_D12_data(0x0e);
	write_a_D12_data(0x47);						
	for (i=0; i<50000; i++);	//== 延时100ms
	return 0;
}

//===============================================================================//
//== 函 数 名:connect_usb
//== 功    能:连接USB
//== 说    明:连接USB后并设置D12的输出时钟频率
//--0xF3  设置模式 写入两个字节
//--1、配置字节  D7,D6(00):端点配置 模式0:非同步模式  模式1:同步输出模式
//---------------                    模式2:同步输入模式 同步输入/输出模式
//---------------D5(0):	保留位
//---------------D4(0):	softConnect 1:VBUS可用 上行数据上拉电阻被连接
//---------------D3(1): 中断模式  1:表示报告所有的错误和”NKing”并产生一个中
//---------------                 0:表示只有"OK"被报告
//---------------D2(1):时钟运行,1:表示在挂起状态下仍然有时钟和PLL,0表示无
//---------------D1(1): 无LAZYCLOCK 1:表示CLKOUT不会切换到LazyClock
//---------------                    0:表示CLKOUT在Suspend变高之后切换到LazyClock
//---------------D0(0):  保留位
//--2、时钟分频系数字节
//---------------D7(0): SOF-ONLY中断模式
//---------------1:表示仅当桢时钟的起始(SOF)时刻引起中断的产生,而不管引脚中断模式的设定
//---------------D6(0):SET_TO_ONE模式
//---------------D5,D4(00):    保留位
//---------------D3,2,1,0(1011):N表示分频系数输出频率为48MHz/(N+1)
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char connect_usb(void)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing connect_usb()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("	连接USB...............\r\n");
	#endif

	write_D12_command(0xf3);			//== 初始化USBD12
	write_a_D12_data(0x1e);				//== 连接USB
	write_a_D12_data(0x47);				//== 设置频率
	return 0;
}

//===============================================================================//
//== 函 数 名:init_usb
//== 功    能:初始化D12
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char init_usb(void)               
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing init_usb()!\r\n");
	#endif

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("	set+enable D12 address!\r\n");
	#endif

	set_usb_addr(0);
	set_endpoint_enable();
	return 0;
}

//===============================================================================//
//== 函 数 名:D12_ReadChipID
//== 功    能:读取D12版本号
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char D12_ReadChipID(void)
{
	unsigned char Chip_ID[2];
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("D12_ReadChipID()!\r\n");
	#endif
	write_D12_command(Read_ChipID);
	Chip_ID[0] = read_a_D12_data();
	Chip_ID[1] = read_a_D12_data();
	Print_Msg("	Chip_ID:");
	Print_Hex(Chip_ID, 2);
	Print_Msg("!\r\n");
	return 0;
}
//===============================================================================//
//== 函 数 名:endp0_out
//== 功    能:终端点0输出中断处理
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp0_out(void)
{
	unsigned char i;
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing endp0_out()!\r\n");
	#endif

	D12_last_status.Register = read_last_status(0);	//== 读取端点0的最后状态寄存器并清中断标志

	if (D12_last_status.Status.setup_packet)		//== 如果收到建立(setup)包
	{
		Control_Data.wLength = 0;					//== 传输字节总数清零
		Control_Data.wCount = 0;					//== 传输字节计数器清零
		if (read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest))) != sizeof(REQUESTCMD))
		{											//== 如果从端点0读取8个字节失败
			set_endpoint_status(0,0);				//== 停止控制端点0
			set_endpoint_status(1,0);				//== 停止控制端点1
			bEPPflags.bits.control_state = USB_IDLE;
			return 1;
		}

		Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
		Print_Msg("!\r\n");

		Control_Data.DeviceRequest.wValue = SWAP16(Control_Data.DeviceRequest.wValue);
		Control_Data.DeviceRequest.wIndex = SWAP16(Control_Data.DeviceRequest.wIndex);
		Control_Data.DeviceRequest.wLength = SWAP16(Control_Data.DeviceRequest.wLength);

		Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);

⌨️ 快捷键说明

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