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

📄 externint.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 C
字号:
//====================================================================================//
// 文件名:    ExterInt.asm
// 描  述:   该文件的程序主要用于处理PDIUSBD12中断
// 日  期:   2003/04/03
//====================================================================================//
#include "D12CI.h"
#include "usbmain.h"
#include "usb11.h"
#include "isr.h"
extern CONTROL_XFER ControlData;
extern unsigned int G_UpLoad_Flag;
extern  void DownLoad(void);
void fn_usb_isr(void);
void ep0_txdone(void);
void ep0_rxdone(void);
void ep1_txdone(void);
void ep1_rxdone(void);
void main_txdone(void);
void main_rxdone(void);
void dma_eot(void);

EPPFLAGS bEPPflags;
unsigned int  i_st;
unsigned int  ep_last;
unsigned int  ReadCtrNum;
unsigned int  EpBuf[EP2_PACKET_SIZE];
unsigned int  OneRecByteNum;
unsigned int  EraseFlag_no=0;
unsigned int  m_CtrlRecFileData=0;
unsigned int  G_UpFlag=0;
unsigned int Int_Number=0;
unsigned int Int_Conuter=0;
unsigned int Int_UpLoad_Conuter=0;

//=====================================================================
// 函数:    fn_usb_isr
// 语法:    void fn_usb_isr(void)
// 描述:    PDIUSBD12中断的各个中断源的处理
// 参数:    无
// 返回:    无
//=====================================================================
void fn_usb_isr(void)
{
	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) 
		{
			dma_eot();
		}
		if(i_st & D12_INT_SUSPENDCHANGE)
		{
			bEPPflags.bits.suspend = 1;
		}
		if(i_st & D12_INT_ENDP0IN)   
		{
		 	ep0_txdone();
		}
		if(i_st & D12_INT_ENDP0OUT)    
		{
			ep0_rxdone();
		}
			
		if(i_st & D12_INT_ENDP1IN)
		{
			ep1_txdone();
		}
		if(i_st & D12_INT_ENDP1OUT)
		{
			ep1_rxdone();
		}
		if(i_st & D12_INT_ENDP2IN)
		{
			main_txdone();
		}
		
		if(i_st & D12_INT_ENDP2OUT)
		{
			main_rxdone();
		}
	}
	bEPPflags.bits.in_isr = 0;
}
//=====================================================================
// 函数:    dma_eot
// 语法:    void dma_eot(void)
// 描述:    PDIUSBD12的DMA处理
// 参数:    无
// 返回:    无
//=====================================================================
void dma_eot(void)
{
}
//=====================================================================
// 函数:    ep0_rxdone
// 语法:    void ep0_rxdone(void)
// 描述:    端点0,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void ep0_rxdone(void)
{
	unsigned int i;

	ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
	if (ep_last & D12_SETUPPACKET)
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		//判断端点是否满,如是,则取出
		ReadCtrNum=D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),(unsigned int *)(&(ControlData.DeviceRequest)));
		if(ReadCtrNum!= 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_IDLE;		/* 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;
	}

}
//=====================================================================
// 函数:    ep0_txdone
// 语法:    void ep0_txdone(void)
// 描述:    端点0,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void 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;
	}

}
//=====================================================================
// 函数:    ep1_txdone
// 语法:    void ep1_txdone(void)
// 描述:    端点1,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
}
//=====================================================================
// 函数:    ep1_rxdone
// 语法:    void ep1_rxdone(void)
// 描述:    端点1,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void ep1_rxdone(void)
{
	D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
}
//=====================================================================
// 函数:    main_txdone
// 语法:    void main_txdone(void)
// 描述:    端点2,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void main_txdone(void)
{
	D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
	if(G_UpLoad_Flag==1)
	{
		UpLoad();
		Int_UpLoad_Conuter++;
	}

}
//=====================================================================
// 函数:    main_rxdone
// 语法:    void main_rxdone(void)
// 描述:    端点2,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void main_rxdone(void)
{
	Int_Number=D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
    	bEPPflags.bits.ep2_rxdone=1;
	    if(m_CtrlRecFileData==1)
		{
			bEPPflags.bits.ep2_rxdone=0;
			Int_Conuter++;
		    DownLoad();
		}

}
	

⌨️ 快捷键说明

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