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

📄 d12_user.c

📁 利用sunplus16位单片机实现USB接口的全套技术资料
💻 C
字号:
// =========================================
// 文件名称:D12_User.c
// 功能描述:PDIUSBD12应用层
// 维护记录:modified by liuxue v1.0 2007-03-15
// =========================================
#include "SPCE061A.h"
#include "D12_Driver.h"
#include "System.h"

CONTROL_TRANSFERS ControlData;
EPPFLAGS bEPPflags;

// =========================================
// 函数:void (*StandardDeviceRequest[])(void)
// 描述:标准请求处理
// 参数:无
// 返回:无
// =========================================
void (*StandardDeviceRequest[])(void) =
{
	D12_Get_Status,
	D12_Clear_Feature,
	D12_Reserved,
	D12_Set_Feature,
	D12_Reserved,
	D12_Set_Address,
	D12_Get_Descriptor,
	D12_Reserved,
	D12_Get_Configuration,
	D12_Set_Configuration,
	D12_Get_Interface,
	D12_Set_Interface,
	D12_Reserved,
	D12_Reserved,
	D12_Reserved,
	D12_Reserved
};

// =========================================
// 函数:void D12_Control_Handler(void)
// 描述:控制传输
// 参数:无
// 返回:无
// =========================================
void D12_Control_Handler(void)
{
	unsigned int type, req;
	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
	if(type == USB_STANDARD_REQUEST)
	{
		(*StandardDeviceRequest[req])();
	}
	else
		D12_Stall_Ep0();
}

// =========================================
// 函数:void D12_Disconnect_USB(void)
// 描述:USB软连接断开
// 参数:无
// 返回:无
// =========================================
void D12_Disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
}

// =========================================
// 函数:void D12_Connect_USB(void)
// 描述:USB软连接
// 参数:无
// 返回:无
// =========================================
void D12_Connect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_4M);
}

// =========================================
// 函数:void D12_Reconnect_USB(void)
// 描述:USB重连接
// 参数:无
// 返回:无
// =========================================
void D12_Reconnect_USB(void)
{
	int i, j;
	D12_Disconnect_USB();
	for(i=0; i<=500; i++)
	{
		for(j=0; j<1000; j++)
			*P_Watchdog_Clear = 0x01;
	};
	D12_Connect_USB();
}

// =========================================
// 函数:void D12_USB_Isr(void)
// 描述:USB重连接
// 参数:无
// 返回:无
// =========================================
void D12_USB_Isr(void)
{
	unsigned int i_st;

	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();
	if(i_st != 0)
	{
		if(i_st & D12_INT_BUSRESET)
		{
			bEPPflags.bits.bus_reset = 1;
		}
		if(i_st & D12_INT_EOT)
		{
			D12_DMA_Eot();
		}
		if(i_st & D12_INT_SUSPENDCHANGE)
		{
			bEPPflags.bits.suspend = 1;
		}
		if(i_st & D12_INT_ENDP0IN)
		{
			D12_Ep0_TxDone();
		}
		if(i_st & D12_INT_ENDP0OUT)
		{
			D12_Ep0_RxDone();
		}
		if(i_st & D12_INT_ENDP1IN)
		{
			D12_Ep1_TxDone();
		}
		if(i_st & D12_INT_ENDP1OUT)
		{
			D12_Ep1_RxDone();
		}
		if(i_st & D12_INT_ENDP2IN)
		{
			D12_Main_TxDone();
		}
		if(i_st & D12_INT_ENDP2OUT)
		{
			D12_Main_RxDone();
		}
	}
	bEPPflags.bits.in_isr = 0;
}

// =========================================
// 函数:void D12_DMA_Eot(void)
// 描述:PDIUSBD12的DMA处理
// 参数:无
// 返回:无
// =========================================
void D12_DMA_Eot(void)
{
}

// =========================================
// 函数:void D12_Ep0_RxDone(void)
// 描述:端点0,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep0_RxDone(void)
{
	unsigned int i;
	unsigned int I_uiBuffer_Data_Length = 0;
	unsigned int ep_last;
	
	ep_last = D12_ReadLastTransactionStatus(0); 	// Clear interrupt flag

	if(ep_last & D12_SETUPPACKET)
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		//判断端点是否满,如是,则取出
		I_uiBuffer_Data_Length = D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned int *)(&(ControlData.DeviceRequest)));
		if(I_uiBuffer_Data_Length != sizeof(DEVICE_REQUEST))
		{
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEPPflags.bits.control_state = USB_IDLE;
			return;
		}
		// Acknowledge setup here to unlock in/out endp
		// 向控制输出端点发送应答建立命令以重新使能下一个建立阶段
		D12_AcknowledgeEndpoint(0);
		D12_AcknowledgeEndpoint(1);
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
		if(ControlData.DeviceRequest.bmRequestType & (unsigned int)USB_ENDPOINT_DIRECTION_MASK)
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
		}
		else
		{
			if(ControlData.DeviceRequest.wLength == 0)
			{
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
			}
			else
			{
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
				{
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0, 1);
					D12_SetEndpointStatus(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 =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
			ControlData.dataBuffer + ControlData.wCount);

		ControlData.wCount += i;
		if(i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}

	else
	{
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

// =========================================
// 函数:void D12_Ep0_TxDone(void)
// 描述:端点0,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep0_TxDone(void)
{
	unsigned long int i = ControlData.wLength - ControlData.wCount;
	D12_ReadLastTransactionStatus(1);
	if(bEPPflags.bits.control_state != USB_TRANSMIT)
		return;
	if(i >= EP0_PACKET_SIZE)
	{
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if(i != 0)
	{
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;
	}
	else if(i == 0)
	{
		D12_WriteEndpoint(1, 0, 0);		// Send zero packet at the end
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

// =========================================
// 函数:void D12_Ep1_TxDone(void)
// 描述:端点1,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep1_TxDone(void)
{
	bEPPflags.bits.Ep1_SendDataFlag = 1;
	D12_ReadLastTransactionStatus(3); 	// Clear interrupt flag
}

// =========================================
// 函数:void D12_Ep1_RxDone(void)
// 描述:端点1,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep1_RxDone(void)
{
	bEPPflags.bits.Ep1_ReceiveDataFlag = 1;
}

// =========================================
// 函数:void D12_Main_TxDone(void)
// 描述:端点2,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Main_TxDone(void)
{
	bEPPflags.bits.Ep2_SendDataFlag = 1;
	D12_ReadLastTransactionStatus(5);		// Clear D12 interrupt flag
	
	if(G_UpLoad_Flag == 1)
	{
		UpLoad();
	}
}

// =========================================
// 函数:void D12_Main_RxDone(void)
// 描述:端点2,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Main_RxDone(void)
{
	bEPPflags.bits.Ep2_ReceiveDataFlag = 1;
	if(G_UpLoad_Flag == 2)
	{
		DownLoad();
	}
}

⌨️ 快捷键说明

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