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

📄 pdiusbd12.c

📁 HID 设备测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		Print_Msg("!\r\n");

		ack_setup(0);												//== 对控制端点0 进行建立包应答
		ack_setup(1);												//== 对控制端点1 进行建立包应答

		Control_Data.wLength = Control_Data.DeviceRequest.wLength;	//== 取出要传输数据的总字节数
		Control_Data.wCount = 0;									//== 传输字节计数器清零

		if (Control_Data.DeviceRequest.bmRequestType&0x80)			//== 如果控制传输是控制读取(设备到主机)
		{
			bEPPflags.bits.setup_packet_in = 1;						//== 通知处理Setup 包,get command
			bEPPflags.bits.control_state = USB_IDLE;
		}
		else														//== 控制输出(主机到设备),不过要向主机返回一个长度为0的数据包
		{
			if (Control_Data.DeviceRequest.wLength == 0)			//== set command 返回信息的字节长度是0
			{
				bEPPflags.bits.setup_packet_out = 1;
				bEPPflags.bits.control_state = USB_IDLE;
			}
			else
			{
				if (Control_Data.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)	//== 主机发给设备的令牌包的数据
				{																//-- 长度不能大于8个字节
					bEPPflags.bits.control_state = USB_IDLE;
					set_endpoint_status(0,1);									//== 运行控制端点0
					set_endpoint_status(1,1);									//== 运行控制端点1
				}
				else
				{
					bEPPflags.bits.control_state = USB_RECEIVE; 				//== set command with OUT token
				}
			}																	//== set command with data
		}																		//== else set command
	}																			//== if setup packet
	else
	{
		if (bEPPflags.bits.control_state == USB_RECEIVE)
		{
			i = read_endpoint_buff(0, EP0_PACKET_SIZE, Control_Data.dataBuffer + Control_Data.wCount);
			Control_Data.wCount += i;
			if ((i != EP0_PACKET_SIZE) || (Control_Data.wCount >= Control_Data.wLength))
			{
				bEPPflags.bits.setup_packet_out = 1;
				bEPPflags.bits.control_state = USB_IDLE;
			}
		}
		else
		{
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	select_endpoint(0);		//== 这是必须的
	clear_buffer();

	return 0;
}

//===============================================================================//
//== 函 数 名:endp0_in
//== 功    能:终端点0输入处理
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp0_in(void)
{
	short i;

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing endp0_in()!\r\n");
	#endif
	bEPPflags.bits.usb_endp0_in = 1;
	i = Control_Data.wLength - Control_Data.wCount;
	D12_last_status.Register = read_last_status(1);		//== Clear interrupt flag
	if (bEPPflags.bits.control_state != USB_TRANSMIT)
		return 1;

	if (i >= EP0_PACKET_SIZE)							//== 一次没传完
	{
		write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);

		if (bEPPflags.bits.first_get_descriptor)
		{
			bEPPflags.bits.control_state = USB_IDLE;	//== 第一次传控制端点最大缓冲区的字节数就可以(在这里是16)
			bEPPflags.bits.first_get_descriptor = 0;
		}
		else
		{
			bEPPflags.bits.control_state = USB_TRANSMIT;
		}
		Control_Data.wCount += EP0_PACKET_SIZE;
	}
	else
	{	
		if (i != 0)
		{
			write_endpoint_buff(1, i, Control_Data.pData + Control_Data.wCount);
			Control_Data.wCount += i;
			bEPPflags.bits.control_state = USB_IDLE;	//== 发送完后
		}
		else
		{	
			if (i == 0)
			{
				write_endpoint_buff(1, 0, 0);			//== Send zero packet at the end ???
				bEPPflags.bits.control_state = USB_IDLE;
			}
		}
	}
	return 0;	
}

//===============================================================================//
//== 函 数 名:endp1_out
//== 功    能:端点1输出
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp1_out(void)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing endp1_out()!\r\n");
	#endif
	D12_last_status.Register = read_last_status(2);		//== Clear interrupt flag
	Print_Msg("端点1输出................................\r\n");
	return 0;
}

//===============================================================================//
//== 函 数 名:endp1_in
//== 功    能:端点1输入
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp1_in(void)
{
	unsigned char code buff[8] = {1,8,3,4,5,6,7,8,};
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing endp1_in()!\r\n");
	#endif

	D12_last_status.Register = read_last_status(3);		//== Clear interrupt flag

	Print_Msg("端点1输入................................\r\n");

		write_endpoint_buff(3, 8, buff);
	return 0;
}

//===============================================================================//
//== 函 数 名:endp2_out
//== 功    能:端点2输出
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp2_out(void)
{
	unsigned char i, j;
	unsigned char buffer[10];

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Runing endp2_out()!\r\n");
	#endif
	D12_last_status.Register = read_last_status(4);		//== Clear interrupt flag

	bEPPflags.bits.usb_endp2_out = 1;
	j = read_main_endpoint_buff(buffer);

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("端点2输出................................\r\n");
		Print_Msg("	端点2的数据是:");
		Print_Msg("!\r\n");

		for (i=0; i<j; i+=8)
		{
			Print_Hex(buffer, 8);
			Print_Msg(" ");
			if ((i%16)==0) Print_Msg("!\r\n"); 
		}

		Print_Msg("!\r\n");
	#endif

	return 0;
}

//===============================================================================//
//== 函 数 名:endp2_in
//== 功    能:主端点输入处理
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char endp2_in(void)                                      
{
//	unsigned char i;
	unsigned char code buff[64] = {1,21,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
								   22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
								   41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
								   60,61,62,63,64};

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

	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("端点2输入................................\r\n");
	#endif
	bEPPflags.bits.usb_endp2_in = 1;

	D12_last_status.Register = read_last_status(5);		//== Clear interrupt flag

//	for (i=0; i<8; i++)
//		usb_transmit_buf[i] = i;

//	usb_transmit_buf[0] = 0x01;
//	usb_transmit_buf[1] = 0x08;
//	write_endpoint_buff(5, 8, usb_transmit_buf);
	write_endpoint_buff(5, 64, buff);
	return 0;
}

//===============================================================================//
//== 函 数 名:D12_isr
//== 功    能:D12 中断处理
//== 说    明:
//== 时    间:2008.8.20 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char D12_isr(void)
{
	Print_Msg("\r\n");
	bEPPflags.bits.int_isr = 1;
	read_interrupt_register();

	if (D12_interrupt_register.int_Register != 0) 
	{
		if (D12_interrupt_register.Interrupt.bus_reset)				//== usb 总线复位
		{
			usb_bus_reset();
		}
		else
		{
			if (D12_interrupt_register.Interrupt.DMA_EOT)			//== dma 传输
			{
				//dma_eot();
			}
			if (D12_interrupt_register.Interrupt.suspend_change)	//== 总线挂起
			{
				usb_bus_suspend();
			}
			if (D12_interrupt_register.Interrupt.control_in_port)	//== 控制端点0输入
			{
				endp0_in();
			}
			if (D12_interrupt_register.Interrupt.control_out_port)	//== 控制端点0输出
			{
				endp0_out();
			}
			if (D12_interrupt_register.Interrupt.port_in_1)			//== 端点1输入
			{
				endp1_in();
			}
			if (D12_interrupt_register.Interrupt.port_out_1)		//== 端点1输出
			{
				endp1_out();
			}
			if (D12_interrupt_register.Interrupt.main_in_port)		//== 端点2输入
			{
				endp2_in();
			}
			if (D12_interrupt_register.Interrupt.main_out_port)		//== 端点2输出
			{
				endp2_out();
			}
		}
	}
	bEPPflags.bits.int_isr = 0;
	return 0;
}

//===============================================================================//
//== 函 数 名:usb_init
//== 功    能:D12 初始化
//== 说    明:
//== 时    间:2008.8.13 创建函数
//== 入口参数:无
//== 返 回 值:0
//===============================================================================//
unsigned char usb_init(void)
{
	#ifdef __DEBUG__ 	//== 打印调试信息
		Print_Msg("Init D12!\r\n");
	#endif
	disconnect_usb();	//== 断开USB连接
	init_usb();			//== 初始化USB芯片
	D12_ReadChipID();
	connect_usb();		//== 连接USB
	return 0;
}

⌨️ 快捷键说明

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