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

📄 externint.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
字号:
//====================================================================================//
// 文件名:    ExterInt.asm
// 描  述:   该文件的程序主要用于处理PDIUSBD12中断
// 日  期:   2003/04/03
//====================================================================================//
#include "..\\d12\\D12CI.h"
#include "chap9.h"
#include "..\\spce061\\061reg.h"
#include "..\\usb\\TPBulk.h"
#include "..\\Uart\\Uart.h"
extern unsigned int  *BOTXfer_pData;		//global variable 
extern unsigned int  BOTXfer_wResidue;

extern unsigned long int  LBA_Write;
extern unsigned long int g_RWaddress;   //global read/write address
extern unsigned int *g_pRWaddr;		//global Read/Write Addr Point
extern unsigned int g_RWBuf[512];
// New Add Global Value
extern unsigned long int  Start_LBA;
extern unsigned long int  End_LBA;
extern unsigned long int  Current_LBA;
extern unsigned int 	  SectorCount;

extern BIT_STATUS bFlags;
extern unsigned int  BOTFSMstate;

extern CONTROL_TRANSFERS ControlData;
extern void F_Ep0_RxDone_Detail(void);
extern void F_Ep0_TxDone_Detail(void);
extern EPPFLAGS bEPPflags;

void F_USB_Isr(void);
void F_Ep0_TxDone(void);
void F_Ep0_RxDone(void);
void F_Ep1_TxDone(void);
void F_Ep1_RxDone(void);
void F_Main_TxDone(void);
void F_Main_RxDone(void);
void F_DMA_Eot(void);
unsigned int  i_st;
unsigned int ep_last;
//=====================================================================
// 函数:    F_USB_Isr
// 语法:    void F_USB_Isr(void)
// 描述:    PDIUSBD12中断的各个中断源的处理
// 参数:    无
// 返回:    无
//=====================================================================

void F_USB_Isr(void)
{
do{
	bEPPflags.bits.in_isr = 1;
	i_st = F_D12_ReadInterruptRegister();
	if(i_st != 0)
	{
		if(i_st & D12_INT_BUSRESET)      
		{
			bEPPflags.bits.bus_reset = 1;
		}
		if(i_st & D12_INT_EOT) 
		{
			F_DMA_Eot();
		}
		if(i_st & D12_INT_SUSPENDCHANGE)
		{
			bEPPflags.bits.suspend = 1;
		}
		if(i_st & D12_INT_ENDP0IN)   
		{
		 	F_Ep0_TxDone();
		}
		if(i_st & D12_INT_ENDP0OUT)    
		{
			F_Ep0_RxDone();
		}
			
		if(i_st & D12_INT_ENDP1IN)
		{
			F_Ep1_TxDone();
		}
		if(i_st & D12_INT_ENDP1OUT)
		{
			F_Ep1_RxDone();
		}
		if(i_st & D12_INT_ENDP2IN)
		{
	//		F_Main_RxDone();
		}
		
		if(i_st & D12_INT_ENDP2OUT)
		{
			F_Main_RxDone();
		}
	}
	bEPPflags.bits.in_isr = 0;
	*P_Watchdog_Clear=0x0001;	
}
while(!(*P_IOB_Data & 0x08));	
}
//=====================================================================
// 函数:    F_DMA_Eot
// 语法:    void F_DMA_Eot(void)
// 描述:    PDIUSBD12的DMA处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_DMA_Eot(void)
{
}
//=====================================================================
// 函数:    F_Ep0_RxDone
// 语法:    void F_Ep0_RxDone(void)
// 描述:    端点0,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Ep0_RxDone(void)
{
	ep_last = F_D12_ReadLastTransactionStatus(0); // Clear interrupt flag
	F_Ep0_RxDone_Detail();
}
//=====================================================================
// 函数:    F_Ep0_TxDone
// 语法:    void F_Ep0_TxDone(void)
// 描述:    端点0,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Ep0_TxDone(void)
{
    
	F_D12_ReadLastTransactionStatus(1);
	F_Ep0_TxDone_Detail();

}
//=====================================================================
// 函数:    F_Ep1_TxDone
// 语法:    void F_Ep1_TxDone(void)
// 描述:    端点1,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Ep1_TxDone(void)
{
	bEPPflags.bits.Ep1_SendDataFlag=1;
	F_D12_ReadLastTransactionStatus(3); //Clear interrupt flag
}
//=====================================================================
// 函数:    F_Ep1_RxDone
// 语法:    void F_Ep1_RxDone(void)
// 描述:    端点1,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Ep1_RxDone(void)
{
unsigned int EP2Len,tBuf[16],i;
	bEPPflags.bits.Ep1_ReceiveDataFlag=1;
    EP2Len=F_D12_ReadEndpoint(2, 16,tBuf);
//	F_D12_WriteEndpoint(3,EP2Len,tBuf);//回送数据
	F_D12_ReadLastTransactionStatus(2); // Clear interrupt flag 
}

//=====================================================================
// 函数:    F_Main_TxDone (Device -> Host)
// 语法:    void F_Main_TxDone(void)
// 描述:    端点1,发送数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Main_TxDone(void)
{
unsigned int EP2Len;
bEPPflags.bits.Ep2_SendDataFlag=1;
//F_D12_ReadLastTransactionStatus(5); // Clear D12 interrupt flag 

/*** Data In Stage ***/
if (BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
   {
    if(BOTXfer_wResidue>64)
	    {
		 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,64,BOTXfer_pData);//回送数据
		 BOTXfer_pData+=EP2Len;
		 BOTXfer_wResidue-=EP2Len;	
		}
	else
		{
		 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,BOTXfer_wResidue,BOTXfer_pData);//回送数据
		 BOTXfer_pData+=EP2Len;
		 BOTXfer_wResidue-=EP2Len;
		 if(BOTXfer_wResidue==0)		
			TPBulk_CSWHandler();	
		}	  						 
	}//Data In Stage End
				
/*** CSW Stage ***/
if(BOTFSM_CSW)	//BOTFSM_CSW = BOTFSMstate^5
	{            	
	 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,13,BOTXfer_pData);//回送数据
	 BOTXfer_pData += EP2Len;
	 BOTXfer_wResidue -= EP2Len;
	 if(BOTXfer_wResidue==0x00)		
		 BOTFSMstate=USBFSM4BOT_IDLE;				 
	}//CSW Stage End	*/    	
}
//=====================================================================
// 函数:    F_Main_RxDone (Host -> Device)
// 语法:    void F_Main_RxDone(void)
// 描述:    端点2,接收数据处理
// 参数:    无
// 返回:    无
//=====================================================================
void F_Main_RxDone(void)
{
unsigned int EP2Len;
//F_D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */

/*** CBW ***/		
if( BOTFSM_IDLE)   //BOTFSM_IDLE = BOTFSMstate^0
	{
     TPBulk_CBWHandler(); 	// Goto BOTFSMstate_CBWProc
//     F_Single_Transmit(5, 0);
     }	/* CBW Proc End */
         
/*** Data Out Stage ***/
while(BOTFSM_DataOut) //BOTFSM_DataOut = BOTFSMstate^3
     {
      F_InitWriteD12();
      F_WriteCmdToD12(0x04);		//Select EP BulkOut
	  F_InitReadD12();
      if(!(F_ReadD12() & 0x01)) 	// if fifo is empty
            continue;				//continue; */                        
            
      EP2Len=F_D12_ReadEndpointAndClrD12Int(4, 64,BOTXfer_pData);
      
      BOTXfer_pData += EP2Len;
	  BOTXfer_wResidue -= EP2Len;
	        	        
if( (BOTXfer_wResidue%0x200) == 0x00)
{
	BOTXfer_pData=g_RWBuf;
	if(BOTXfer_atNF)
	{//在NandFalsh
		NF_PageProgram(0x00,0xffe0 + (Current_LBA & 0x1f), g_RWBuf);
		Current_LBA++;
		if(--SectorCount !=0)
		{//没有到最后的扇区
			if((Current_LBA&0x1f)==0)
			{//新块
				//UartSendData(0x3A);
				NF_ResumeBlock(Current_LBA-1);
				NF_EraseBackBlock();
       		    if((SectorCount +(Current_LBA & 0x1f)) < 0x20 )
       		    {
       		    	NF_BackBlockTail(Current_LBA);
       		    }				
			}
		}
		else
		{//到了最后的扇区
//		    UartSendData(0x39);
		  	NF_ResumeBlock(Current_LBA-1);
       		BOTXfer_wResidue=0;
       		TPBulk_CSWHandler();
		}
	}
	else if (BOTXfer_wResidue == 0x00)
			{//在ROM/RAM
			   TPBulk_CSWHandler();	
			}
	
}
      		   			
}	/* Data Out Stage End */

/*** Data In Stage ***/        
while (BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
	{
      F_InitWriteD12();
      F_WriteCmdToD12(0x05);		//Select EP BulkOut
	  F_InitReadD12();
      if((F_ReadD12() & 0x01)) 	// if fifo is full
            continue;				//continue; */       	
	 if(BOTXfer_wResidue>64)
		{
		 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,64,BOTXfer_pData);//回送数据
		 BOTXfer_pData+=EP2Len;
		 BOTXfer_wResidue-=EP2Len;	
		 if( ( BOTXfer_wResidue > 0 ) && ( (BOTXfer_wResidue%0x200)==0x00) )
		 	{
		 	 NF_PageRead(0x0000,++g_RWaddress, g_RWBuf);
			 BOTXfer_pData = g_RWBuf;
		 	}
		}
	 else
		{
		 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,BOTXfer_wResidue,BOTXfer_pData);//回送数据
		 BOTXfer_pData+=EP2Len;
		 BOTXfer_wResidue-=EP2Len;
		 if(BOTXfer_wResidue==0)		
			TPBulk_CSWHandler();	
		}	  						 
	}	//DataIn Stage End
					
/*** CSW Stage ***/
if(BOTFSM_CSW)	//BOTFSM_CSW = BOTFSMstate^5
	{            	
	 EP2Len=F_D12_WriteEndpointAndClrD12Int(5,13,BOTXfer_pData);//回送数据
	 BOTXfer_wResidue=0x00;
     BOTFSMstate=USBFSM4BOT_IDLE;				 
	 } 	// CSW PROC END 	
} /* Main Rx Handler */

⌨️ 快捷键说明

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