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

📄 usbdevci.c

📁 《USB开发指南——基于LPC2400》配套例程
💻 C
📖 第 1 页 / 共 2 页
字号:
	__usbDevSendCmd(ulTmp | USBCMD_SEL_CLRINT_ENDP, 0);
	i = __usbDevGetData(ulTmp | USBDAT_SEL_CLRINT_ENDP);
	
	USBEpIntClr = (unsigned long)(0x01 << ucEpIndex);
	
	return i;
}

/*********************************************************************************************************
** Function name:       __usbDevSetEndpointStatus
** Descriptions:        设置端点状态
** input parameters:    ucEpIndex		物理端点号
**						ucStalled	端点停止位									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSetEndpointStatus (INT8U ucEpIndex, INT8U ucStalled)
{
	INT32U ulTmp1 = (INT32U)((ucEpIndex + 0x40) << 16);
	INT32U ulTmp2 = (INT32U)(ucStalled << 16); 

	__usbDevSendCmd(ulTmp1 | USBCMD_SET_ENDP_STATUS, ulTmp2 | USBDAT_SET_ENDP_STATUS);
}

/*********************************************************************************************************
** Function name:       __usbDevClearBuffer
** Descriptions:        清除OUT端点缓冲区
** input parameters:    无									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
INT8U __usbDevClearBuffer (void)
{
	__usbDevSendCmd(USBCMD_CLEAR_BUFFER, 0);							/*  该命令没有数据阶段 			*/				
	
	return __usbDevGetData(USBDAT_CLEAR_BUFFER);
}

/*********************************************************************************************************
** Function name:       __usbDevValidBuffer
** Descriptions:        使能 IN 端点缓冲区
** input parameters:    无									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevValidBuffer (void)
{
	__usbDevSendCmd(USBCMD_VALID_BUFFER, 0);
}

/*********************************************************************************************************
** Function name:       __usbDevSoftDisconnect
** Descriptions:        断开与USB总线的连接
** input parameters:    无									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSoftDisconnect (void)
{
	__usbDevSetDevStatus(0x00);
}

/*********************************************************************************************************
** Function name:       __usbDevSoftConnect
** Descriptions:        连接到USB总线
** input parameters:    无									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSoftConnect (void)
{
	__usbDevSetDevStatus(0x01);
}

/*********************************************************************************************************
** Function name:       __usbDevSoftReconnect
** Descriptions:        重新连接USB总线
** input parameters:    无									
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSoftReconnect (void)
{
	INT32U clk_cnt;

	__usbDevSoftDisconnect();							    			/*  断开与USB总线的连接 		*/
    	
    for (clk_cnt = 0;clk_cnt<= 0x1FFFF;clk_cnt++);  					/*  延时 						*/
    
    __usbDevSoftConnect();								    			/*  连接到USB总线				*/
}

/*********************************************************************************************************
  端点数据传输
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:       usbDevReadEndpoint
** Descriptions:        通过指定物理端点读取数据
** input parameters:    ucEpIndex		物理端点号
**						pucRcvBuf		接收缓冲区指针 									
**						ucReadLen		要读的字节长度
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
INT8U usbDevReadEndpoint (INT8U ucEpIndex,  
                          INT8U *pucRcvBuf,
                          INT8U ucReadLen)
{
	INT32U ulTmp    = 0;
	INT32U i        = 0;
	INT32U j        = 0;
	INT32U ulRcvLen = 0;												/*  FIFO中已收到的字节数		*/

	USBCtrl = (INT32U)((ucEpIndex >> 1) << 2 | 0x01);		 			/*  选择逻辑端点并使能读操作 	*/

	if((ucEpIndex % 2 == 0)) {
	 	while((USBRxPLen & 0x00000C00) ==0);	   			 			/*  等待数据就绪 			 	*/
	}
	
	ulRcvLen =(INT32U)(USBRxPLen & 0x3FF);							 	/*  获取收到的数据的字节长度 	*/	  			
	
	if (ulRcvLen > ucReadLen) {
		ulRcvLen = ucReadLen; 
	}
							 		 				 					/*  从 EP RAM 中读取数据 	 	*/
	for (i = 0; i < (ulRcvLen / 4); i++) {					
		
		ulTmp =(INT32U)USBRxData;		
		*pucRcvBuf++ = (INT8U)ulTmp; 
		*pucRcvBuf++ = (INT8U)(ulTmp >> 8);
		*pucRcvBuf++ = (INT8U)(ulTmp >> 16);
		*pucRcvBuf++ = (INT8U)(ulTmp >> 24);
	}	
		
	j = ulRcvLen % 4;
	if (j != 0) {
	 
		ulTmp = (INT32U)USBRxData;	

		for(i = 0; i < j; i++) {
		   *pucRcvBuf++ = (INT8U)(ulTmp >> (i << 3));
		}
	}
	
	
	USBDevIntClr = RxENDPKT; 						 	 				/*  清除 RxENDPKT 位 			*/  
	
	__usbDevSelectEndpoint(ucEpIndex);						  	  
	__usbDevClearBuffer();									 			/*  清除OUT缓冲区 				*/ 
	
	USBCtrl = 0;	
	return ((INT8U)ulRcvLen);										 	/*  返回实际收到的字节数 		*/
}

/*********************************************************************************************************
** Function name:       usbDevWriteEndpoint
** Descriptions:        向指定物理端点写入数据
** input parameters:    ucEpIndex		物理端点号	
**						pucWriteBuf		发送缓冲区
**						ucWriteLen		要写的字节长度
** output parameters:	无
** Returned value:      实际写入的字节数
*********************************************************************************************************/
INT8U usbDevWriteEndpoint (INT8U ucEpIndex, 
                           INT8U *pucWriteBuf,
                           INT8U ucWriteLen)
{
	INT32U ulTmp = 0;
	INT32U i     = 0;
	INT32U j     = 0;

	ulTmp = ((ucEpIndex >> 1) << 2) | 0x02;					  			/*  选择逻辑端点并使能写操作 	*/
	USBCtrl = (INT32U)ulTmp;
	
	
	USBTxPLen = (INT32U)ucWriteLen;							  			/*  写入要发送的数据的字节长度  */
	
	j = ucWriteLen >> 2;
	for(i = 1; i <= j; i++) {
	
		ulTmp =  (INT32U)*pucWriteBuf++;
		ulTmp += (INT32U)(*pucWriteBuf++ << 8);
		ulTmp += (INT32U)(*pucWriteBuf++ << 16);
		ulTmp += (INT32U)(*pucWriteBuf++ << 24);
		USBTxData = ulTmp;
		
		while((USBTxPLen & 0x3FF) != (INT8U)(ucWriteLen - (i << 2))); 
	}
	
	j = ucWriteLen % 4;
	if (j != 0) {
	
		ulTmp = 0;	
		for(i = 0; i < j; i++) {
		
		   ulTmp |= ((INT32U)*pucWriteBuf) << (i << 3);
		   pucWriteBuf++;
 		}
 		
		USBTxData = ulTmp;
		
		while((USBTxPLen & 0x3FF) != 0);								/*  等待 USBTxPLen 为 0 		*/
	}
	
	if (ucWriteLen != 0) {
	
		while((USBDevIntSt & TxENDPKT) ==0);							/*  等待写入完成 				*/
		USBDevIntClr = TxENDPKT;
	}
		
	__usbDevSelectEndpoint(ucEpIndex);									/*  使能发送缓冲区 				*/
	__usbDevValidBuffer();		
	
	USBCtrl = 0;	
	return ucWriteLen;													/*  返回实际写入长度 			*/
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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