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

📄 usbci.c

📁 周立功 214x pack 配套光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
	USB_SendCmd(tmp | USBCMD_SEL_ENDP, 0);

	return USB_GetData(tmp | USBDAT_SEL_ENDP);
}


/***************************************************************************************************************
** 函数名称 : USB_SelectClrIntEndpoint()				Name	 : USB_SelectClrIntEndpoint()
** 功能描述 : 选择端点,并获取端点信息和清除对应端点的	Function : select the endpoint, and get the endpoint information 
			  中断												   and clear the interrupt of the correspond endpoint
** 输	 入 : INT8U endp: 物理端点号					Input	 : INT8U endp: the physical endpoint number
** 输	 出 : 对应端点的信息							Output	 : the endpoint information
****************************************************************************************************************/
INT8U USB_SelectClrIntEndpoint(INT8U endp)
{
	INT8U i;
	INT32U tmp = (INT32U)((endp + 0x40) << 16);

	USB_SendCmd(tmp | USBCMD_SEL_CLRINT_ENDP, 0);
	i = USB_GetData(tmp | USBDAT_SEL_CLRINT_ENDP);
	
	USBEpIntClr = (0x01 << endp);
	
	return i;
}

/***************************************************************************************************************
** 函数名称 : USB_SetEndpointStatus()					Name	 : USB_SetEndpointStatus()
** 功能描述 : 设置端点状态							 	Function : set endpoint status 
** 输	 入 : INT8U endp    : 物理端点号				Input	 : INT8U endp    : the physical endpoint number
			  INT8U bStalled: 1 - stall 端点		               INT8U bStalled: 1 - stall endpoint
					          0	- unstall 端点					   				   0 - unstall endpoint
** 输	 出 : 无										Output	 : NULL
****************************************************************************************************************/
void USB_SetEndpointStatus(INT8U endp, INT8U bStalled)
{
	INT32U tmp1 = (INT32U)((endp + 0x40) << 16);
	INT32U tmp2 = (INT32U)(bStalled << 16); 

	USB_SendCmd(tmp1 | USBCMD_SET_ENDP_STATUS, tmp2 | USBDAT_SET_ENDP_STATUS);
}


/***************************************************************************************************************
** 函数名称 : USB_ClearBuffer()							Name	 : USB_ClearBuffer()
** 功能描述 : 清除OUT端点缓冲区						 	Function : clear the OUT endpoint buffer
** 输	 入 : 无										Input	 : NULL
** 输	 出 : 一个字节									Output	 : read a byte
****************************************************************************************************************/
INT8U USB_ClearBuffer(void)
{
	/* no data phase */
	USB_SendCmd(USBCMD_CLEAR_BUFFER, 0);				/* 该命令没有数据阶段 */				
	
	return USB_GetData(USBDAT_CLEAR_BUFFER);
}


/***************************************************************************************************************
** 函数名称 : USB_ValidBuffer()							Name	 : USB_ClearBuffer()
** 功能描述 : 使能 IN 端点缓冲区						Function : validate the IN endpoint buffer
** 输	 入 : 无										Input	 : NULL
** 输	 出 : 无										Output	 : NULL
****************************************************************************************************************/
void USB_ValidBuffer(void)
{
	USB_SendCmd(USBCMD_VALID_BUFFER, 0);
}


		/***********************************************************
			
			端点数据传输	 Endpoint Data Transfer
		
		***********************************************************/

/***************************************************************************************************************
** 函数名称 : USB_ReadEndpoint() 						Name	 : USB_ReadEndpoint()
** 功能描述 : 读物理端点							    Function : Read data from USB endpoint
** 入口参数 : INT8U endp: 物理端点号   					Input	 : INT8U endp:  the physical endpoint number
		   	  INT8U len : 要读的字节长度						   INT8U len :  the length that will be read
		      INT8U *buf: 接收缓冲区							   INT8U *buf:  receiving buffer 
** 输	 出 : 实际读到的字节数							Output	 : the actual length that be read 
****************************************************************************************************************/
INT8U USB_ReadEndpoint(INT8U endp, INT8U len, INT8U *buf)
{
	INT32U tmp;
	INT32U i,j;
	INT32U reclen;

	/* select logical endpoint and enable read operate */
	USBCtrl = (INT32U)((endp >> 1) << 2) | 0x01;		 /* 选择逻辑端点并使能读操作 */
 
 	/* wait for the data ready */
	if((endp % 2 == 0))
	 	while((USBRxPLen & 0x00000C00) ==0);	   		 /* 等待数据就绪 */
	
	/* get the receive length */
	reclen = USBRxPLen & 0x1FF;							 /* 获取收到的数据的字节长度 */	  			
	if (reclen > len)
		reclen = len; 
	
	/* read data from ep ram */ 		 				 /* 从 EP RAM 中读取数据 */
	for (i = 0; i < (reclen / 4); i++)					
	{	
		tmp = USBRxData;		
		*buf++ = (INT8U)tmp; 
		*buf++ = (INT8U)(tmp >> 8);
		*buf++ = (INT8U)(tmp >> 16);
		*buf++ = (INT8U)(tmp >> 24);
	}	
		
	j = reclen % 4;
	if (j != 0)
	{ 
		tmp = USBRxData;	

		for(i = 0; i < j; i++)
		   *buf++ = (INT8U)(tmp >> (i << 3));
	}
	
	/* clear the RxENDPKT bit in USBDevIntClr register */
	USBDevIntClr = RxENDPKT; 						 	 /* 清除 RxENDPKT 位 */  
	 
	/* clear the OUT buffer */
	USB_SelectEndpoint(endp);						  	  
	USB_ClearBuffer();									 /* 清除OUT缓冲区 */ 
	
	return reclen;										 /* 返回实际收到的字节数 */
}


/***************************************************************************************************************
** 函数名称 : USB_ReadEndpoint() 						Name	 : USB_WriteEndpoint()
** 功能描述 : 向物理端点写入数据					    Function : Write data to USB endpoint
** 入口参数 : INT8U endp: 物理端点号   					Input	 : INT8U endp:  the physical endpoint number
		   	  INT8U len : 要写的字节长度						   INT8U len :  the length that will be written
		      INT8U *buf: 发送缓冲区							   INT8U *buf:  sending buffer
** 输	 出 : 实际写入的字节数							Output	 : the actual length that have being written
****************************************************************************************************************/
INT8U USB_WriteEndpoint(INT8U endp, INT8U len, INT8U *buf)
{
	INT32U tmp;
	INT32U i,j;

	/* select logical endpoint and enable writing operation */
	tmp = ((endp >> 1) << 2) | 0x02;					  /* 选择逻辑端点并使能写操作 */
	USBCtrl = (INT32U)tmp;
	
	/* write the length that will be written into endpoint */
	USBTxPLen = (INT32U)len;							  /* 写入要发送的数据的字节长度 */
	
	/* write Data into Transmit Data Register */		  /* 写入要发送的数据到发送数据寄存器 */
	j = len >> 2;
	for(i = 1; i <= j; i++)
	{
		tmp =  (INT32U)*buf++;
		tmp += (INT32U)(*buf++ << 8);
		tmp += (INT32U)(*buf++ << 16);
		tmp += (INT32U)(*buf++ << 24);
		USBTxData = tmp;
		
		while((USBTxPLen & 0x3FF) != len - (i << 2)); 
	}
	
	j = len % 4;
	if (j != 0)
	{
		tmp = 0;	
		for(i = 0; i < j; i++)
		{
		   tmp |= ((INT32U)*buf) << (i << 3);
		   buf++;
 		}
		USBTxData = tmp;
		
		while((USBTxPLen & 0x3FF) != 0);					/* 等待 USBTxPLen 为 0 */
		
	}
	
	if (len != 0)
	{
		while((USBDevIntSt & TxENDPKT) ==0);				/* 等待写入完成 */
		USBDevIntClr = TxENDPKT;
	}
		
	/* Validate buffer */
	USB_SelectEndpoint(endp);								/* 使能发送缓冲区 */
	USB_ValidBuffer();		
	
	return len;												/* 返回实际写入长度 */
}


/************************************************************
** Name	   : disconnect_USB 
** Function: disconnect USB bus
************************************************************/
void disconnect_USB(void)
{
	USB_SetDevStatus(0x00);
}

/************************************************************
** Name	   : connect_USB
** Function: connect USB bus
************************************************************/
void connect_USB(void)
{
	USB_SetDevStatus(0x01);
}

/************************************************************
** Name	   : reconnect_USB
** Function: reconnect USB bus
************************************************************/
void reconnect_USB(void)
{
	INT32U clk_cnt;

	disconnect_USB();							    /* disconnect USB bus */
    for (clk_cnt = 0;clk_cnt<= 0x1FFFF;clk_cnt++);  /* delay */
    
    connect_USB();								    /* connect USB bus */
}

/*******************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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