📄 isr_vectors.c
字号:
#include "LIN_Header.h"
//#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
__interrupt void UnimplementedISR(void) {
/* Unimplemented ISRs trap.*/
asm NOP;
}
typedef void (*near tIsrFunc)(void);
const tIsrFunc _vect[] @0xFFD4 = { /* Interrupt table */
#if INT_CAN_TX_EN //MSCAN08 Transmit Vector IF20
CAN_TX_ISR,
#else
UnimplementedISR,
#endif
#if INT_CAN_RX_EN //MSCAN08 Receive Vector IF19
CAN_RX_ISR,
#else
UnimplementedISR,
#endif
#if INT_CAN_ERR_EN //MSCAN08 ERROR Vector IF18
CAN_ERR_ISR,
#else
UnimplementedISR,
#endif
#if INT_CAN_WAKEUP_EN //MSCAN08 WAKEUP vector IF17
CAN_Wakeup_ISR,
#else
UnimplementedISR,
#endif
#if INT_TIMEBASE_EN //Timebase Vector IF16
Time_Base_ISR,
#else
UnimplementedISR,
#endif
#if INT_ADC_EN //ADC Conversion Complete Vector IF15
ADC_ISR,
#else
UnimplementedISR,
#endif
#if INT_KEYBOARD_EN //Keyboard Vector IF14
Keyboard_ISR,
#else
UnimplementedISR,
#endif
#if INT_SCI_TX_EN //ESCI Transmit Vector IF13
SCI_TX_ISR,
#else
UnimplementedISR,
#endif
#if INT_SCI_RX_EN //ESCI Receive Vector IF12
SCI_RX_ISR,
#else
UnimplementedISR,
#endif
#if INT_SCI_ERR_EN //ESCI Error Vector IF11
SCI_ERR_ISR,
#else
UnimplementedISR,
#endif
#if INT_SPI_TX_EN //SPI Transmit IF10
SPI_TX_ISR,
#else
UnimplementedISR,
#endif
#if INT_SPI_RX_EN //SPI Receive IF09
SPI_RX_ISR,
#else
UnimplementedISR,
#endif
#if INT_TIMER2_OV_EN //TIM2 Overflow Vector IF08
Timer2_OV_ISR,
#else
UnimplementedISR,
#endif
#if INT_T2C1_EN //TIM2 Channel 1 Vector IF07
T2C1_ISR,
#else
UnimplementedISR,
#endif
#if INT_T2C0_EN //TIM2 Channel 0 Vector IF06
T2C0_ISR,
#else
UnimplementedISR,
#endif
#if INT_TIMER1_OV_EN //TIM1 Overflow Vector IF05
Timer1_OV_ISR,
#else
UnimplementedISR,
#endif
#if INT_T1C1_EN //TIM1 Channel 1 Vector IF04
T1C1_ISR,
#else
UnimplementedISR,
#endif
#if INT_T1C0_EN //TIM1 Channel 0 Vector IF03
T1C0_ISR,
#else
UnimplementedISR,
#endif
#if INT_PLL_EN //PLL Vector IF02
PLL_ISR,
#else
UnimplementedISR,
#endif
#if INT_IRQ_EN //IRQ Vector IF01
IRQ_ISR,
#else
UnimplementedISR,
#endif
#if INT_SWI_EN //SWI vector
SWI_ISR,
#else
UnimplementedISR,
#endif
_Startup /* Reset vector */
};
#if INT_CAN_TX_EN //MSCAN08 Transmit Vector IF20
interrupt void CAN_TX_ISR(void){};
#endif
#if INT_CAN_RX_EN //MSCAN08 Receive Vector IF19
interrupt void CAN_RX_ISR(void){};
#endif
#if INT_CAN_ERR_EN //MSCAN08 ERROR Vector IF18
interrupt void CAN_ERR_ISR(void){};
#endif
#if INT_CAN_WAKEUP_EN //MSCAN08 WAKEUP vector IF17
interrupt void CAN_Wakeup_ISR(void){};
#endif
#if INT_TIMEBASE_EN //Timebase Vector IF16
interrupt void Time_Base_ISR(void)
{
LIN_TMR_ACK = 1;//Clear Interrupt Flag
//Increament Time Value
wSysTime = (L_U16)(wTimerIncrement + wSysTime);
/*
if((LIN_Node_Status & LIN_FLAG_WAKEUP_TIMEOUT) == LIN_FLAG_WAKEUP_TIMEOUT)
{
--LIN_Timeout;
if(LIN_Timeout == 0)
{
LIN_Wakeup_Phase++;
if(LIN_Wakeup_Phase == LIN_SLEEP_TIME_INDEX) LIN_Wakeup_Phase = 0;
LIN_Wakeup();
}
}
else if((LIN_Node_Status & LIN_FLAG_NO_BUS_ACTIVE) == 0)
{
--LIN_Timeout;
if(LIN_Timeout == 0)
{
//LIN_Goto_Sleep();
//LIN_SCIRIE = 1;
//LIN_SCI_FEIE = 0;
LIN_Node_Status = LIN_FLAG_SLEEP | LIN_FLAG_NO_BUS_ACTIVE;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
}
}
else
{
//Clear LIN_FLAG_SUCCESSFUL_TRANSFER EVERY 1.5 SECONDS
--LIN_Timeout;
if(LIN_Timeout == 0)
{
LIN_Error_Status &= ~LIN_SUCCESS_TRANSFER;
LIN_Timeout = LIN_Wakeup_Timer[LIN_WAKEUP_PHASE_4];
}
}
*/
}
#endif
#if INT_ADC_EN //ADC Conversion Complete Vector IF15
interrupt void ADC_ISR{};
#endif
#if INT_KEYBOARD_EN //Keyboard Vector IF14
interrupt void Keyboard_ISR(void)
{
INTKBSCR_ACKK = 1;
#if SPI_DEBUG_MODE == 1
//TEST_PIN_SG8 = ~TEST_PIN_SG8;
#endif
if(LIN_Node_Status & LIN_FLAG_SLEEP)
{
//We waked up by switch status changed events
//excute wake senquence
LIN_Node_Status = LIN_FLAG_WAKEUP;
LIN_Wakeup_Phase = 0;
LIN_Wakeup();
}
else
{
//Start SPI communication
KeyBoard_INT_Disable();
MC33993_GetInput();
}
}
#endif
#if INT_SCI_TX_EN //ESCI Transmit Vector IF13
interrupt void SCI_TX_ISR(void){};
#endif
#if INT_SCI_RX_EN //ESCI Receive Vector IF12
interrupt void SCI_RX_ISR(void)
{
LIN_SCIStatus1 = LIN_SCISR1;
LIN_TmpByte = LIN_SCIDRL;
//LIN_Pending_Status |= 0x80;
if((LIN_Node_Status & LIN_FLAG_WAKEUP_TIMEOUT) == 0) LIN_Timeout = LIN_Wakeup_Timer[LIN_NO_BUS_ACTIVE_TIME];
if((LIN_Node_Status & LIN_FLAG_SLEEP) == 0) LIN_Data_Received();
else
{
// Now we are in sleep mode, so campare the received char with LIN_WAKEUP_CHAR
if(LIN_TmpByte == LIN_WAKEUP_CHAR)
{
// 1. if we work in power save mode, here sould be set wakeup timeout, and wake up all component
// 2. we don't in power save mode, so we set LIN_DRIVE_STATUS directly.
// Add by wang jun peng, 3rd, march, 2005
LIN_Node_Status = LIN_FLAG_RDY_FOR_SYNCHBREAK;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
}
}
LIN_Node_Status &= ~LIN_FLAG_NO_BUS_ACTIVE;//we received a char and clear the LIN_FLAG_NO_BUS_ACTIVE Flag
#if LIN_DEBUG_MODE == 1
//LIN_TEST_PIN_SCI = ~LIN_TEST_PIN_SCI;
LIN_Debug_PIN_BREAK = 0;
#endif
}
#endif
#if INT_SCI_ERR_EN //ESCI Error Vector IF11
interrupt void SCI_ERR_ISR(void)
{
//1.Break Detected conditions:
// a. SCS1.FE == 1
// B. SCS1.SCRF == 1
// C. SCS2.BKF == 1
// All Flags Cleared by read status register then read data register
LIN_SCIStatus1 = LIN_SCISR1;
LIN_SCIStatus2 = LIN_SCISR2;
LIN_TmpByte = LIN_SCIDRL;
//LIN_Pending_Status |= 0x40;
if((LIN_Node_Status & LIN_FLAG_SLEEP) == 0)
{
if(((LIN_SCIStatus1 & SCI_BRKF/* SCI_FE + SCI_RF */) == SCI_BRKF) && ((LIN_SCIStatus2 & SCI_BKF) == SCI_BKF) && (LIN_TmpByte == 0))
{
//proper bread symbol dectected
LIN_Transceiver_Status = LIN_FLAG_REC_SYNCH;
LIN_Node_Status = LIN_FLAG_RDY_FOR_SYNCHBREAK;
//LIN_TIC_Enable(1);// we don't need TIC function
#if LIN_DEBUG_MODE == 1
LIN_Debug_PIN_BREAK = 1;
LIN_Debug_PIN_CHECK = 0;
LIN_Debug_PIN_ID = 0;
LIN_Debug_PIN_DATA = 0;
LIN_Debug_PIN_SYNCH = 0;
#endif
}
else
{
//Get a Frame Error
if(LIN_Transceiver_Status == LIN_FLAG_REC_SYNCH)
{
LIN_Error_Status |= LIN_ERR_SYNCH;
LIN_Err_RxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_RxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
}
else if(LIN_Transceiver_Status == LIN_FLAG_REC_HEADER)
{
LIN_Err_RxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_RxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
LIN_Error_Status |= LIN_ERR_ID_PARITY;
}
else if(LIN_Transceiver_Status == LIN_FLAG_REC_DATA)
{
LIN_Error_Status |= (LIN_ERR_BITS | LIN_ERR_IN_RESPONSE);
LIN_Err_RxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_RxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
}
else if(LIN_Transceiver_Status ==LIN_FLAG_SEND_DATA)
{
LIN_Error_Status |= (LIN_ERR_BITS | LIN_ERR_IN_RESPONSE);
LIN_Err_TxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_TxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
}
else if(LIN_Transceiver_Status == LIN_FLAG_REC_CHECKSUM)
{
LIN_Error_Status |= (LIN_ERR_CHECKSUM | LIN_ERR_IN_RESPONSE);
LIN_Err_RxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_RxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
}
else if(LIN_Transceiver_Status == LIN_FLAG_SEND_CHECKSUM)
{
LIN_Error_Status |= (LIN_ERR_CHECKSUM | LIN_ERR_IN_RESPONSE);
LIN_Err_TxCounter <<= 1;//Receiver error counter shift right 1 bit
LIN_Err_TxCounter |= 1;//The LSB record the last state -- 1 for error; 0 for no error
}
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
}
}
}
#endif
#if INT_SPI_TX_EN //SPI Transmit IF10
interrupt void SPI_TX_ISR(void)
{
//SPI_State = SPSCR;
TEST_PIN_SG6 = ~TEST_PIN_SG6;
if((SPIBuf.mState & SPI_TX_REQ) == SPI_TX_REQ)
{
SPDR = SPI_Tx_Buf[SPIBuf.mTxCounter];
SPIBuf.mTxCounter++;
if(SPIBuf.mTxCounter == SPIBuf.mDataLength)
{
SPIBuf.mState &= ~SPI_TX_REQ;
SPCR_SPTIE = 0;
}
}
else
{
// SPIBuf.mState &= ~SPI_TX_REQ;
SPCR_SPTIE = 0;
// SPIBuf.mState &= ~SPI_TX_REQ;
}
}
#endif
#if INT_SPI_RX_EN //SPI Receive IF09
interrupt void SPI_RX_ISR(void)
{
SPI_State = SPSCR;
if((SPI_State & SPI_SPRF) == SPI_SPRF)
{
SPI_Rx_Buf[SPIBuf.mRxCounter] = SPDR;
SPIBuf.mRxCounter++;
if((SPIBuf.mState & SPI_RX_REQ) == SPI_RX_REQ)
{
//SPDR = SPI_Tx_Buf[SPIBuf.mRxCounter];
if(SPIBuf.mRxCounter == SPIBuf.mDataLength)
{
SPIBuf.mState &= ~SPI_RX_REQ;
SPIBuf.mState |= SPI_RX_FULL;
SPI_RxIndicator();
}
}
else
{
//SPIBuf.mState &= ~SPI_RX_REQ;
SPIBuf.mState = SPI_XMT_IDLE;
//TEST_PIN_SG2 = 1;
//SPCR_SPTIE = 0;
Select_MC33993(MC33993_DESEL);
}
}
else if((SPI_State & SPI_OVRF) == SPI_OVRF)
{
SPI_State = SPDR;//Dump read to clear flags
SPIBuf.mState &= ~SPI_RX_REQ;
SPIBuf.mState &= ~SPI_TX_REQ;
SPIBuf.mState |= SPI_ERR_OV;
SPCR_SPTIE = 0;
Select_MC33993(MC33993_DESEL);
}
/*
else if((SPI_State & SPI_MODF) == SPI_MODF)
{
SPIBuf.mState &= ~SPI_RX_REQ;
SPIBuf.mState &= ~SPI_TX_REQ;
SPIBuf.mState = SPI_ERR_MODF;
}
else
{
TEST_PIN_SG4 = 1;
}
*/
}
#endif
#if INT_TIMER2_OV_EN //TIM2 Overflow Vector IF08
interrupt void Timer2_OV_ISR(void){};
#endif
#if INT_T2C1_EN //TIM2 Channel 1 Vector IF07
interrupt void T2C1_ISR(void){};
#endif
#if INT_T2C0_EN //TIM2 Channel 0 Vector IF06
interrupt void T2C0_ISR(void){};
#endif
#if INT_TIMER1_OV_EN //TIM1 Overflow Vector IF05
interrupt void Timer1_OV_ISR(void){};
#endif
#if INT_T1C1_EN //TIM1 Channel 1 Vector IF04
interrupt void T1C1_ISR(void){};
#endif
#if INT_T1C0_EN //TIM1 Channel 0 Vector IF03
interrupt void T1C0_ISR(void)
{
L_U8 Dummy;
LIN_TIC_Cntr_Str tmpTmr;
Dummy = LIN_TIC_SC0;
LIN_TIC_IF = 0;
#if LIN_DEBUG_MODE == 1
//LIN_TEST_PIN_IC = ~LIN_TEST_PIN_IC;
#endif
if((LIN_TIC_Counter == LIN_TIC_COUNTS_SYNCH)||(LIN_TIC_Counter == LIN_TIC_COUNTS_WAKEUP))
{
//Remember current timer value
LIN_TIC_TmrH = LIN_TIC_CNT_H;
LIN_TIC_TmrL = LIN_TIC_CNT_L;
LIN_TIC_Counter--;
}
else if(--LIN_TIC_Counter == 0)
{
tmpTmr.Bytes.LIN_TIC_CounterH = LIN_TIC_CNT_H;
tmpTmr.Bytes.LIN_TIC_CounterL = LIN_TIC_CNT_L;
if(tmpTmr.LIN_TIC_Counter > LIN_TIC_Tmr) LIN_TIC_Period = tmpTmr.LIN_TIC_Counter - LIN_TIC_Tmr;
else LIN_TIC_Period = 0xffff - LIN_TIC_Tmr + tmpTmr.LIN_TIC_Counter + 1;
LIN_Transceiver_Status |= LIN_FLAG_ADJ;
//LIN_TIC_Enable(0);
}
}
#endif
#if INT_PLL_EN //PLL Vector IF02
interrupt void PLL_ISR(void){};
#endif
#if INT_IRQ_EN //IRQ Vector IF01
IRQ_ISR(void){};
#endif
#if INT_SWI_EN //SWI vector
interrupt void SWI_ISR(void){};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -