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

📄 isr.c

📁 ARM嵌入式系统软件开发实例(一) 里面含有很多UCOS教程和源码
💻 C
字号:

   //*************************************************************************
   //
   //                  P H I L I P S   P R O P R I E T A R Y
   //
   //           COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE.
   //                     --  ALL RIGHTS RESERVED  --
   //
   // File Name:	    ISR.C
   // Author:           Hilbert Zhang ZhenYu
   //                   Chew Thing Piao
   // Created:          Oct. 1 99
   // Modified:
   // Revision: 		0.0.
   //
   //*************************************************************************
   //
   //*************************************************************************

#include  "config.h"                /* special function register declarations   */
#undef   GLOBAL_EXT
#include "SysCnfg.h"
#include "BasicTyp.h"
#include "Common.h"
#include "Hal4Sys.h"
#include "Hal4d12.h"


//*************************************************************************
//  Public data
//*************************************************************************

// bit Flags
STRUC_EXT BITFLAGS  bFlags;

// Timer 0
#define             MCUBF_Timer  					bFlags.bits.timer
INT8_EXT            Hal4Sys_ClockTicks;

// D12 bit flags
#define             D12BF_SetupOverwritten  		bFlags.bits.setup_overwritten
#define             D12BF_Configuration	  			bFlags.bits.;configuration

// DefaultControlPipe Finate State Machine [One-Hot]
STRUC_EXT char_bit   _DCPFSMstate;
#define		DCPFSMstate			_DCPFSMstate.char_
#define		DCPFSM_SetupProc 	_DCPFSMstate.bit_.b0
#define     DCPFSM_DataIn 		_DCPFSMstate.bit_.b1
#define     DCPFSM_DataOut 		_DCPFSMstate.bit_.b2
#define     DCPFSM_COhandshake 	_DCPFSMstate.bit_.b3
#define     DCPFSM_CIhandshake 	_DCPFSMstate.bit_.b4
#define     DCPFSM_Stall 		_DCPFSMstate.bit_.b7

STRUC_EXT char_bit _BOTFSMstate;
#define 	BOTFSMstate		_BOTFSMstate.char_ 
#define 	BOTFSM_IDLE 	_BOTFSMstate.bit_.b0
#define     BOTFSM_CBWProc  _BOTFSMstate.bit_.b1
#define     BOTFSM_DataIn 	_BOTFSMstate.bit_.b2
#define     BOTFSM_DataOut  _BOTFSMstate.bit_.b3
#define     BOTFSM_CSWProc  _BOTFSMstate.bit_.b4
#define     BOTFSM_CSW 		_BOTFSMstate.bit_.b5
#define     BOTFSM_Stall 	_BOTFSMstate.bit_.b7

// USB Device Request
STRUC_EXT DEVICE_REQUEST DCPDeviceRequest;
INT8_EXT            UsbReq_Recipient;
INT8_EXT            UsbReq_Type;
INT8_EXT            UsbReq_Request;
#define             REQBF_DCPRequest_dir  			bFlags.bits.DCPRequst_Dir
#define             REQBF_DCPRequest_EPdir  		bFlags.bits.DCPRequst_EPDir
#define             REQBF_StallDCPRequest   		bFlags.bits.Stall_DCPRequest


// Default Control Pipe Tansfer DCPXfer
STRUC_EXT char_bit  	_Xfer_Space;
#define 	Xfer_Space 			_Xfer_Space.char_
#define     DCPXfer_atMCUCODE 	_Xfer_Space.bit_.b0
#define     DCPXfer_atMCURAM 	_Xfer_Space.bit_.b1
#define    	DCPXfer_atEEROM 	_Xfer_Space.bit_.b2
#define    	DCPXfer_atATA 		_Xfer_Space.bit_.b3
#define   	BOTXfer_atRAM 		_Xfer_Space.bit_.b4
#define   	BOTXfer_atATA 		_Xfer_Space.bit_.b5
#define    	BOTXfer_atROM 		_Xfer_Space.bit_.b6

INT16_EXT           DCPXfer_wResidue;
INT8_EXT            * DCPXfer_pData;


//*************************************************************************
//  Private data
//*************************************************************************

char_bit        _ISR_eplts ;
#define ISR_eplts _ISR_eplts.char_
#define D12EP0LTS_SUCCESS _ISR_eplts.bit_.b0   //数据接收/发送成功
#define D12EP0LTS_SETUP   _ISR_eplts.bit_.b5     //setup信息包,1表示成功接收的信息包有一个SETIP标志

uint_bit        _ISR_IR;			// bit addressable data(16bits) from $20H->
#define		ISR_IR  _ISR_IR.uint_
#define 	D12IS_EOT          	_ISR_IR.bit_.b0     // D12 Interrupt Src
#define 	D12IS_SUSPENDCHANGE	_ISR_IR.bit_.b15    // D12 Interrupt Src
#define 	D12IS_BUSRESET      _ISR_IR.bit_.b14    // D12 Interrupt Src
#define 	D12IS_ENDP2IN       _ISR_IR.bit_.b13    // D12 Interrupt Src
#define 	D12IS_ENDP2OUT      _ISR_IR.bit_.b12    // D12 Interrupt Src
#define 	D12IS_ENDP1IN       _ISR_IR.bit_.b11    // D12 Interrupt Src
#define 	D12IS_ENDP1OUT      _ISR_IR.bit_.b10    // D12 Interrupt Src
#define 	D12IS_ENDP0IN       _ISR_IR.bit_.b9     // D12 Interrupt Src
#define 	D12IS_ENDP0OUT      _ISR_IR.bit_.b8     // D12 Interrupt Src



//*************************************************************************
//  Private Functions
//*************************************************************************


void ep0_txdone(void);
void ep0_rxdone(void);

void ep1_txdone(void);
void ep1_rxdone(void);

//*************************************************************************
//  Functions
//*************************************************************************
/*
timer_isr() interrupt 1
{
	RaiseIRQL();
    TIMER0_LOW = 0x00;    // 1 MS interval @24MHz
    TIMER0_HIGH =TIMER0_AT24MHZ;    // 0xF8
    Hal4Sys_ClockTicks++;
    MCUBF_Timer = 1;
    LowerIRQL();
}
*/

void usb_isr(void) 
{
	uint16 temp;
	//RaiseIRQL();
	Hal4D12_ReadInterruptRegister(&ISR_IR);
    Hal4D12_ReadLastTransactionStatus(4);
temp = ISR_IR;
	if(ISR_IR != 0)
    {
	    if(D12IS_BUSRESET)
        {
            DCPFSMstate = USBFSM4DCP_IDLE;   //USBFSM4DCP_IDLE =0x00
            BOTFSMstate = USBFSM4BOT_IDLE;   //USBFSM4BOT_IDLE =0x01
            D12BF_SetupOverwritten = 0;
          //  IOSET = SUSP;
        }
    
	    if(D12IS_SUSPENDCHANGE)    //挂起,进入掉电模式
		   {
		/*	 	if( D12BF_SetupOverwritten==1 )
					D12SUSPD=1;
				else
					D12SUSPD=0;

			   	if(D12SUSPD == 1)
		   			{
            		P0 = 0xFF;
    				P1 = 0xFF;
					P2 = 0xFF;
					P3 = 0xFF;
              	PCON |= 0x02; //Powerdown bit set
			       	while (1);		
					}
					*/
		  }

		if(D12IS_ENDP0OUT)
			ep0_rxdone();
		if(D12IS_ENDP0IN)
			ep0_txdone();
		if(D12IS_ENDP1IN)
			ep1_txdone();
		if(D12IS_ENDP1OUT)
			ep1_rxdone();

	}
   // LowerIRQL();
}

void ep0_rxdone(void)		//接收处理
{
	ISR_eplts = Hal4D12_ReadLastTransactionStatus(0); // Clear interrupt flag
    
    if (!D12EP0LTS_SUCCESS)//数据接收不成功,返回(sbit D12EP0LTS_SUCCESS = ISR_eplts^0)
        return;

    if (D12EP0LTS_SETUP)	//接收到SETUP信号
    {
        if(DCPFSM_SetupProc || DCPFSM_DataOut || DCPFSM_DataIn )
        {
			D12BF_SetupOverwritten = 1;
        }
        DCPFSMstate = USBFSM4DCP_SETUPPROC;//USBFSM4DCP_SETUPPROC =0x01
	}
	else /* not a setup packet, just a Data Out Packet */
	{
        if (DCPFSM_CIhandshake)
        {
			DCPFSMstate = USBFSM4DCP_IDLE;//USBFSM4BOT_IDLE =0x01
        }
        // else just let it stay in FIFO of Control-Out
    }
}



void ep0_txdone(void)			//发送处理
{
	ISR_eplts = Hal4D12_ReadLastTransactionStatus(1); // Clear interrupt flag
    if ( !D12EP0LTS_SUCCESS )	//数据接收不成功,返回
        return;

    if (DCPFSM_DataIn)  //DCPFSM_DataIn = DCPFSMstate^1
    {
        if( DCPXfer_wResidue >= EP0_PACKET_SIZE)
	    {
            if(DCPXfer_atMCUCODE)
                Hal4D12_WriteEPAtCode(1, EP0_PACKET_SIZE, DCPXfer_pData);
            else if(DCPXfer_atMCURAM)
                Hal4D12_WriteEndpoint(1, EP0_PACKET_SIZE, DCPXfer_pData);
            else
                return;
			DCPXfer_pData += EP0_PACKET_SIZE;
            DCPXfer_wResidue -= EP0_PACKET_SIZE;
		    /*
		    // State remains at USBFSM4DCP_DATAIN
			*/
	    }
	    else if( DCPXfer_wResidue != 0)
	    {
            if(DCPXfer_atMCUCODE)
                Hal4D12_WriteEPAtCode(1, (INT8)DCPXfer_wResidue, DCPXfer_pData );
            else if(DCPXfer_atMCURAM)
                Hal4D12_WriteEndpoint(1, (INT8)DCPXfer_wResidue, DCPXfer_pData );
            else
                return;
			//DCPXfer_pData += DCPXfer_wResidue;
            DCPXfer_wResidue = 0;
			DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI;
		}
	    else //  DCPXfer_wResidue == 0
	    {
            // Send zero packet at the end
		    Hal4D12_WriteEndpoint(1, 0, 0);
		    DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI;	// USBFSM4DCP_HANDSHAKE4CI =0x10
	    }
    }
	else if( DCPFSM_COhandshake )
    {
    	DCPFSMstate = USBFSM4DCP_IDLE;				// USBFSM4BOT_IDLE =0x01
    }
    // else just exit
#undef DCPXfer_wResidue
}


void ep1_txdone(void)			//端点1,发送处理
{
 	Hal4D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
}

void ep1_rxdone(void)			//端点1,接收处理
{
	Hal4D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
}




⌨️ 快捷键说明

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