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

📄 usbisr.c

📁 开发环境ADS 通过编写一段程序使PC机与实验箱的从USB相连接。连接的时候
💻 C
字号:
/************************************************************************
 *File	: Usbisr.c															*
 *By 	: hugang, hgx2000@mail.china.com								*
 ************************************************************************/ 

#include "armusb.h"
#include "..\inc\44blib.h"
#include <string.h>
/**************************************************************************
 *Public static data
 **************************************************************************/
extern ARMUSBFLAGS bUSBFlags;
/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;
/* ISR static vars */
extern unsigned char Ep1Buf[EP1_PACKET_SIZE];
extern unsigned char Ep2Buf[EP2_PACKET_SIZE];
extern unsigned char Ep1Len, Ep2Len;

/************************************************************************************************
 *USB中断服务程序																				*
 *区分中断源,并执行相应的程序																	*
 ************************************************************************************************/
void fn_usb_isr()
{
	unsigned int i_st;
	
	bUSBFlags.bits.bIn_ISR = 1;
	i_st = UsbReadInterruptRegister();

	if(i_st != 0) {

		DEBUGF(USB_ISR_DEBUG,("isr = %x\n", i_st));
		
		if(i_st & USB_D12_INT_BUSRESET) {
			bus_reset();
			bUSBFlags.bits.bBus_Reset = 1;
		}
		else {
			if(i_st & USB_D12_INT_EOT) 				dma_eot();
			if(i_st & USB_D12_INT_SUSPENDCHANGE) 	bUSBFlags.bits.bSuspend = 1;
			if(i_st & USB_D12_INT_ENDP0IN) 			ep0_txdone();
			if(i_st & USB_D12_INT_ENDP0OUT) 		ep0_rxdone();
			if(i_st & USB_D12_INT_ENDP1IN) 			ep1_txdone();
			if(i_st & USB_D12_INT_ENDP1OUT) 		ep1_rxdone();
			if(i_st & USB_D12_INT_ENDP2IN) 			main_txdone();
			if(i_st & USB_D12_INT_ENDP2OUT) 		main_rxdone();
		}
	}
	
	bUSBFlags.bits.bIn_ISR = 0;
}

void bus_reset(void)
{
	
}

/************************************************************************************************
 *端点0接收中断处理程序																			*
 *提取setup包																					*
 *接收主机发往设备的数据																		*
 *程序首先判断是否为setup包,如果是则读取设备请求,并进一步判断设备请求的方向,					*
 *和设备请求是否带有数据,及数据的长度															*
 ************************************************************************************************/
void ep0_rxdone(void)
{
	unsigned char ep_last;
	unsigned char i;

	ep_last = UsbReadLastTransactionStatus(0); 					// 清端点0中断标志
	DEBUGF(USB_EP0_DEBUG,("LastEP0RxStatus = %x\n",ep_last));
	
	if (ep_last & USB_D12_SETUPPACKET) 
	{																// 判断是否为setup包
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		if( UsbReadEndpoint(0, (unsigned char *)(&(ControlData.DeviceRequest)),
			sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST) ) 
		{															// setup包出错,返回
			UsbSetEndpointStatus(0, 1);							
			UsbSetEndpointStatus(1, 1);
			bUSBFlags.bits.bControl_State = USB_IDLE;
			return;
		}
																
		UsbAcknowledgeEndpoint(0);								// 端点应答,释放端点
		UsbAcknowledgeEndpoint(1);
		
		ControlData.wLength = ControlData.DeviceRequest.wLength;	// 设备请求的数据长度
		ControlData.wCount = 0;
	
		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
		{															// 设备->主机
			bUSBFlags.bits.bSetup_Packet = 1;
			bUSBFlags.bits.bControl_State = USB_TRANSMIT; 			// 设置为发送状态		
		} 
		else 
		{															// 主机->设备
			if (ControlData.DeviceRequest.wLength == 0) 
			{														// 无数据的设备请求
				bUSBFlags.bits.bSetup_Packet = 1;
				bUSBFlags.bits.bControl_State = USB_IDLE; 			
			} 
			else 
			{														// 有数据的设备请求
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
				{													// 设备请求出错
					bUSBFlags.bits.bControl_State = USB_IDLE;
					UsbSetEndpointStatus(0, 1);
					UsbSetEndpointStatus(1, 1);
				} 
				else 
				{
					bUSBFlags.bits.bControl_State = USB_RECEIVE; 	// 设置为接收状态
				}
			}
		}
	}
	else if (bUSBFlags.bits.bControl_State == USB_RECEIVE) 
	{																// 处于接收状态
		i = UsbReadEndpoint(0, ControlData.dataBuffer + ControlData.wCount,EP0_PACKET_SIZE);
		ControlData.wCount += i;									// 数据计数指针增加
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
		{															// 设备请求的数据接收完毕
			bUSBFlags.bits.bSetup_Packet = 1;
			bUSBFlags.bits.bControl_State = USB_IDLE;
		}
	}
	else 
	{
		bUSBFlags.bits.bControl_State = USB_IDLE;
	}
}

/************************************************************************************************
 *端点0发送中断处理程序																			*
 *将设备请求所需数据发给主机																	*
 ************************************************************************************************/
void ep0_txdone(void)
{
	unsigned char ep_last;
	short i = ControlData.wLength - ControlData.wCount;				// 计算剩下的数据的长度

	ep_last = UsbReadLastTransactionStatus(1); 							// 清端点0中断标志
	DEBUGF(USB_EP0_DEBUG,("LastEP0TxStatus = %x\n",ep_last));
	
	if (bUSBFlags.bits.bControl_State != USB_TRANSMIT) return;		// 非发送状态,返回
	
	if( i >= EP0_PACKET_SIZE) 
	{																// 剩下数据大于16B,先发送前16B				
		UsbWriteEndpoint(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
		ControlData.wCount += EP0_PACKET_SIZE;
		bUSBFlags.bits.bControl_State = USB_TRANSMIT;
	}
	else if( i != 0) 
	{																// 发送剩下的数据
		UsbWriteEndpoint(1, ControlData.pData + ControlData.wCount, i);
		ControlData.wCount += i;
		bUSBFlags.bits.bControl_State = USB_IDLE;
	}
	else if (i == 0){
		UsbWriteEndpoint(1, 0, 0); 							// 发送零数据包
		bUSBFlags.bits.bControl_State = USB_IDLE;					// 发送结束
	}
}


void dma_eot(void)
{
	if(bUSBFlags.bits.bDMA_State == DMA_PENDING)
		bUSBFlags.bits.bSetup_DMA = 1;
	else
		bUSBFlags.bits.bDMA_State = DMA_IDLE;
}

/************************************************************************************************
 *端点1接收中断处理程序																			*
 *																								*
 ************************************************************************************************/
void ep1_rxdone(void)
{
	unsigned char ep_last;
	static unsigned char i;
	DEBUGF(USB_EP1_DEBUG, ("\nep1_rxdone %d\n",i));
	i++;

	ep_last = UsbReadLastTransactionStatus(2); 						// 清端点1中断标志
	DEBUGF(USB_EP1_DEBUG,("LastEP1RxStation = %x\n",ep_last));

	if (ep_last & USB_D12_SUCCESS) 
	{
		memset(Ep1Buf, 0, sizeof(Ep1Buf));	
		Ep1Len = UsbReadEndpoint(2, Ep1Buf, sizeof(Ep1Buf));		// 读取数据
	}
	
	bUSBFlags.bits.bEP1_RxDone = 1;									// 标志接收到数据
}

/************************************************************************************************
 *端点1发送中断处理程序																			*
 *																								*
 ************************************************************************************************/
void ep1_txdone(void)
{
	unsigned char ep_last;

	DEBUGF(USB_EP1_DEBUG, ("\nep1_txdone\n"));

	ep_last = UsbReadLastTransactionStatus(3); 								// 请端点1中断标志
	DEBUGF(USB_EP1_DEBUG,("LastEP1TxStation = %x\n",ep_last));
}

/************************************************************************************************
 *主端点(端点2)接收中断处理程序																	*
 *																								*
 ************************************************************************************************/
void main_rxdone(void)
{
	static unsigned char i;
	unsigned char ep_last;
	
	DEBUGF(USB_EP2_DEBUG, ("\nep2_rxdone %d\n",i));
	i++;

	ep_last = UsbReadLastTransactionStatus(4); /* Clear interrupt flag */
	DEBUGF(USB_EP2_DEBUG,("LastEP2RxStation = %x\n",ep_last));

	if (ep_last & USB_D12_SUCCESS) 
	{
		memset(Ep2Buf, 0, sizeof(Ep2Buf));
		Ep2Len = UsbReadEndpoint(4, Ep2Buf, sizeof(Ep2Buf));		// 读取数据
	}

	bUSBFlags.bits.bEP2_RxDone = 1;					// 标志接收到数据
}

/************************************************************************************************
 *主端点(端点2)发送中断处理程序																	*
 *																								*
 ************************************************************************************************/
void main_txdone(void)
{
	unsigned char ep_last;
	
	DEBUGF(USB_EP2_DEBUG, ("\nep2_txdone\n"));
	
	ep_last = UsbReadLastTransactionStatus(5); /* Clear interrupt flag */
	DEBUGF(USB_EP2_DEBUG,("LastEP2TxStation = %x\n",ep_last));

}

⌨️ 快捷键说明

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