Files
2025-07-05 07:47:58 +08:00

763 lines
26 KiB
C

//****************************************************************************
// @Module MultiCAN Controller
// @Filename CAN.H
// @Project CL2.0.dav
//----------------------------------------------------------------------------
// @Controller Infineon XC886CLM-8FF
//
// @Compiler Keil
//
// @Codegenerator 1.3
//
// @Description: This file contains all function prototypes and macros for
// the CAN module.
//
//----------------------------------------------------------------------------
// @Date 2024/8/22 08:23:15
//
//****************************************************************************
// USER CODE BEGIN (CAN_Header,1)
// USER CODE END
#ifndef _CAN_H_
#define _CAN_H_
//****************************************************************************
// @Project Includes
//****************************************************************************
// USER CODE BEGIN (CAN_Header,2)
// USER CODE END
//****************************************************************************
// @Macros
//****************************************************************************
// USER CODE BEGIN (CAN_Header,3)
// USER CODE END
//****************************************************************************
// @Defines
//****************************************************************************
// USER CODE BEGIN (CAN_Header,4)
// USER CODE END
//****************************************************************************
// @Typedefs
//****************************************************************************
//****************************************************************************
// @Declaration of SFRs
//****************************************************************************
#define CAN_LIST0 0x0040
#define CAN_LIST1 0x0041
#define CAN_LIST2 0x0042
#define CAN_LIST3 0x0043
#define CAN_LIST4 0x0044
#define CAN_LIST5 0x0045
#define CAN_LIST6 0x0046
#define CAN_LIST7 0x0047
#define CAN_MCR 0x0072
#define CAN_MITR 0x0073
#define CAN_MOAMR0 0x0403
#define CAN_MOAMR1 0x040b
#define CAN_MOAMR10 0x0453
#define CAN_MOAMR11 0x045B
#define CAN_MOAMR12 0x0463
#define CAN_MOAMR13 0x046B
#define CAN_MOAMR14 0x0473
#define CAN_MOAMR15 0x047B
#define CAN_MOAMR16 0x0483
#define CAN_MOAMR17 0x048B
#define CAN_MOAMR18 0x0493
#define CAN_MOAMR19 0x049B
#define CAN_MOAMR2 0x0413
#define CAN_MOAMR20 0x04A3
#define CAN_MOAMR21 0x04AB
#define CAN_MOAMR22 0x04B3
#define CAN_MOAMR23 0x04BB
#define CAN_MOAMR24 0x04C3
#define CAN_MOAMR25 0x04CB
#define CAN_MOAMR26 0x04D3
#define CAN_MOAMR27 0x04DB
#define CAN_MOAMR28 0x04E3
#define CAN_MOAMR29 0x04EB
#define CAN_MOAMR3 0x041B
#define CAN_MOAMR30 0x04F3
#define CAN_MOAMR31 0x04FB
#define CAN_MOAMR4 0x0423
#define CAN_MOAMR5 0x042B
#define CAN_MOAMR6 0x0433
#define CAN_MOAMR7 0x043B
#define CAN_MOAMR8 0x0443
#define CAN_MOAMR9 0x044B
#define CAN_MOAR0 0x0406
#define CAN_MOAR1 0x040e
#define CAN_MOAR10 0x0456
#define CAN_MOAR11 0x045E
#define CAN_MOAR12 0x0466
#define CAN_MOAR13 0x046E
#define CAN_MOAR14 0x0476
#define CAN_MOAR15 0x047E
#define CAN_MOAR16 0x0486
#define CAN_MOAR17 0x048E
#define CAN_MOAR18 0x0496
#define CAN_MOAR19 0x049E
#define CAN_MOAR2 0x0416
#define CAN_MOAR20 0x04A6
#define CAN_MOAR21 0x04AE
#define CAN_MOAR22 0x04B6
#define CAN_MOAR23 0x04BE
#define CAN_MOAR24 0x04C6
#define CAN_MOAR25 0x04CE
#define CAN_MOAR26 0x04D6
#define CAN_MOAR27 0x04DE
#define CAN_MOAR28 0x04E6
#define CAN_MOAR29 0x04EE
#define CAN_MOAR3 0x041E
#define CAN_MOAR30 0x04F6
#define CAN_MOAR31 0x04FE
#define CAN_MOAR4 0x0426
#define CAN_MOAR5 0x042E
#define CAN_MOAR6 0x0436
#define CAN_MOAR7 0x043E
#define CAN_MOAR8 0x0446
#define CAN_MOAR9 0x044E
#define CAN_MOCTR0 0x0407
#define CAN_MOCTR1 0x040f
#define CAN_MOCTR10 0x0457
#define CAN_MOCTR11 0x045F
#define CAN_MOCTR12 0x0467
#define CAN_MOCTR13 0x046F
#define CAN_MOCTR14 0x0477
#define CAN_MOCTR15 0x047F
#define CAN_MOCTR16 0x0487
#define CAN_MOCTR17 0x048F
#define CAN_MOCTR18 0x0497
#define CAN_MOCTR19 0x049F
#define CAN_MOCTR2 0x0417
#define CAN_MOCTR20 0x04A7
#define CAN_MOCTR21 0x04AF
#define CAN_MOCTR22 0x04B7
#define CAN_MOCTR23 0x04BF
#define CAN_MOCTR24 0x04C7
#define CAN_MOCTR25 0x04CF
#define CAN_MOCTR26 0x04D7
#define CAN_MOCTR27 0x04DF
#define CAN_MOCTR28 0x04E7
#define CAN_MOCTR29 0x04EF
#define CAN_MOCTR3 0x041F
#define CAN_MOCTR30 0x04F7
#define CAN_MOCTR31 0x04FF
#define CAN_MOCTR4 0x0427
#define CAN_MOCTR5 0x042F
#define CAN_MOCTR6 0x0437
#define CAN_MOCTR7 0x043F
#define CAN_MOCTR8 0x0447
#define CAN_MOCTR9 0x044F
#define CAN_MODATAH0 0x0405
#define CAN_MODATAH1 0x040d
#define CAN_MODATAH10 0x0455
#define CAN_MODATAH11 0x045D
#define CAN_MODATAH12 0x0465
#define CAN_MODATAH13 0x046D
#define CAN_MODATAH14 0x0475
#define CAN_MODATAH15 0x047D
#define CAN_MODATAH16 0x0485
#define CAN_MODATAH17 0x048D
#define CAN_MODATAH18 0x0495
#define CAN_MODATAH19 0x049D
#define CAN_MODATAH2 0x0415
#define CAN_MODATAH20 0x04A5
#define CAN_MODATAH21 0x04AD
#define CAN_MODATAH22 0x04B5
#define CAN_MODATAH23 0x04BD
#define CAN_MODATAH24 0x04C5
#define CAN_MODATAH25 0x04CD
#define CAN_MODATAH26 0x04D5
#define CAN_MODATAH27 0x04DD
#define CAN_MODATAH28 0x04E5
#define CAN_MODATAH29 0x04ED
#define CAN_MODATAH3 0x041D
#define CAN_MODATAH30 0x04F5
#define CAN_MODATAH31 0x04FD
#define CAN_MODATAH4 0x0425
#define CAN_MODATAH5 0x042D
#define CAN_MODATAH6 0x0435
#define CAN_MODATAH7 0x043D
#define CAN_MODATAH8 0x0445
#define CAN_MODATAH9 0x044D
#define CAN_MODATAL0 0x0404
#define CAN_MODATAL1 0x040c
#define CAN_MODATAL10 0x0454
#define CAN_MODATAL11 0x045C
#define CAN_MODATAL12 0x0464
#define CAN_MODATAL13 0x046C
#define CAN_MODATAL14 0x0474
#define CAN_MODATAL15 0x047C
#define CAN_MODATAL16 0x0484
#define CAN_MODATAL17 0x048C
#define CAN_MODATAL18 0x0494
#define CAN_MODATAL19 0x049C
#define CAN_MODATAL2 0x0414
#define CAN_MODATAL20 0x04A4
#define CAN_MODATAL21 0x04AC
#define CAN_MODATAL22 0x04B4
#define CAN_MODATAL23 0x04BC
#define CAN_MODATAL24 0x04C4
#define CAN_MODATAL25 0x04CC
#define CAN_MODATAL26 0x04D4
#define CAN_MODATAL27 0x04DC
#define CAN_MODATAL28 0x04E4
#define CAN_MODATAL29 0x04EC
#define CAN_MODATAL3 0x041C
#define CAN_MODATAL30 0x04F4
#define CAN_MODATAL31 0x04FC
#define CAN_MODATAL4 0x0424
#define CAN_MODATAL5 0x042C
#define CAN_MODATAL6 0x0434
#define CAN_MODATAL7 0x043C
#define CAN_MODATAL8 0x0444
#define CAN_MODATAL9 0x044C
#define CAN_MOFCR0 0x0400
#define CAN_MOFCR1 0x0408
#define CAN_MOFCR10 0x0450
#define CAN_MOFCR11 0x0458
#define CAN_MOFCR12 0x0460
#define CAN_MOFCR13 0x0468
#define CAN_MOFCR14 0x0470
#define CAN_MOFCR15 0x0478
#define CAN_MOFCR16 0x0480
#define CAN_MOFCR17 0x0488
#define CAN_MOFCR18 0x0490
#define CAN_MOFCR19 0x0498
#define CAN_MOFCR2 0x0410
#define CAN_MOFCR20 0x04A0
#define CAN_MOFCR21 0x04A8
#define CAN_MOFCR22 0x04B0
#define CAN_MOFCR23 0x04B8
#define CAN_MOFCR24 0x04C0
#define CAN_MOFCR25 0x04C8
#define CAN_MOFCR26 0x04D0
#define CAN_MOFCR27 0x04D8
#define CAN_MOFCR28 0x04E0
#define CAN_MOFCR29 0x04E8
#define CAN_MOFCR3 0x0418
#define CAN_MOFCR30 0x04F0
#define CAN_MOFCR31 0x04F8
#define CAN_MOFCR4 0x0420
#define CAN_MOFCR5 0x0428
#define CAN_MOFCR6 0x0430
#define CAN_MOFCR7 0x0438
#define CAN_MOFCR8 0x0440
#define CAN_MOFCR9 0x0448
#define CAN_MOFGPR0 0x0401
#define CAN_MOFGPR1 0x0409
#define CAN_MOFGPR10 0x0451
#define CAN_MOFGPR11 0x0459
#define CAN_MOFGPR12 0x0461
#define CAN_MOFGPR13 0x0469
#define CAN_MOFGPR14 0x0471
#define CAN_MOFGPR15 0x0479
#define CAN_MOFGPR16 0x0481
#define CAN_MOFGPR17 0x0489
#define CAN_MOFGPR18 0x0491
#define CAN_MOFGPR19 0x0499
#define CAN_MOFGPR2 0x0411
#define CAN_MOFGPR20 0x04A1
#define CAN_MOFGPR21 0x04A9
#define CAN_MOFGPR22 0x04B1
#define CAN_MOFGPR23 0x04B9
#define CAN_MOFGPR24 0x04C1
#define CAN_MOFGPR25 0x04C9
#define CAN_MOFGPR26 0x04D1
#define CAN_MOFGPR27 0x04D9
#define CAN_MOFGPR28 0x04E1
#define CAN_MOFGPR29 0x04E9
#define CAN_MOFGPR3 0x0419
#define CAN_MOFGPR30 0x04F1
#define CAN_MOFGPR31 0x04F9
#define CAN_MOFGPR4 0x0421
#define CAN_MOFGPR5 0x0429
#define CAN_MOFGPR6 0x0431
#define CAN_MOFGPR7 0x0439
#define CAN_MOFGPR8 0x0441
#define CAN_MOFGPR9 0x0449
#define CAN_MOIPR0 0x0402
#define CAN_MOIPR1 0x040a
#define CAN_MOIPR10 0x0452
#define CAN_MOIPR11 0x045A
#define CAN_MOIPR12 0x0462
#define CAN_MOIPR13 0x046A
#define CAN_MOIPR14 0x0472
#define CAN_MOIPR15 0x047A
#define CAN_MOIPR16 0x0482
#define CAN_MOIPR17 0x048A
#define CAN_MOIPR18 0x0492
#define CAN_MOIPR19 0x049A
#define CAN_MOIPR2 0x0412
#define CAN_MOIPR20 0x04A2
#define CAN_MOIPR21 0x04AA
#define CAN_MOIPR22 0x04B2
#define CAN_MOIPR23 0x04BA
#define CAN_MOIPR24 0x04C2
#define CAN_MOIPR25 0x04CA
#define CAN_MOIPR26 0x04D2
#define CAN_MOIPR27 0x04DA
#define CAN_MOIPR28 0x04E2
#define CAN_MOIPR29 0x04EA
#define CAN_MOIPR3 0x041a
#define CAN_MOIPR30 0x04F2
#define CAN_MOIPR31 0x04FA
#define CAN_MOIPR4 0x0422
#define CAN_MOIPR5 0x042a
#define CAN_MOIPR6 0x0432
#define CAN_MOIPR7 0x043A
#define CAN_MOIPR8 0x0442
#define CAN_MOIPR9 0x044A
#define CAN_MSID0 0x0050
#define CAN_MSID1 0x0051
#define CAN_MSIMASK 0x0070
#define CAN_MSPND0 0x0048
#define CAN_MSPND1 0x0049
#define CAN_NBTR0 0x0084
#define CAN_NBTR1 0x00C4
#define CAN_NCR0 0x0080
#define CAN_NCR1 0x00C0
#define CAN_NECNT0 0x0085
#define CAN_NECNT1 0x00C5
#define CAN_NFCR0 0x0086
#define CAN_NFCR1 0x00C6
#define CAN_NIPR0 0x0082
#define CAN_NIPR1 0x00C2
#define CAN_NPCR0 0x0083
#define CAN_NPCR1 0x00C3
#define CAN_NSR0 0x0081
#define CAN_NSR1 0x00C1
#define CAN_PANCTR 0x0071
//------------------------------------------------------------
//-- CAN Message Object x ------------------------------------
//------------------------------------------------------------
//------------------------------------------------------------
// Note: DAvE Ignores Lower Address Lines A[1:0]
//
// MO = Message Ojbect; n = 31-0
// MO base = 400H + n * 20H
//
// Message Object 0 Address Map...
// __________
// |MOCTRn | -> 0x0407
// |----------|
// |MOARn | -> 0x0406
// |----------|
// |MODATAHn | -> 0x0405
// |----------|
// |MODATALn | -> 0x0404
// |----------|
// |MOAMRn | -> 0x0403
// |----------|
// |MOOIPRn | -> 0x0402
// |----------|
// |MOFGPRn | -> 0x0401
// |----------|
// |MOFCRn | -> 0x0400
// |__________|
//
//------------------------------------------------------------
//------------------------------------------------------------
//-- CAN Message Object x ------------------------------------
//------------------------------------------------------------
#define MO_BASE 0x0400
//------------------------------------------------------------
//-- CAN Message Object 0-31 ------------------------------------
//------------------------------------------------------------
// Message Object Nr Function Control Register
#define CAN_MOFCR(Nr) (MO_BASE + (Nr * 8))
// Message Object Nr FIFO/Gateway Pointer Register
#define CAN_MOFGPR(Nr) (MO_BASE + 01 + (Nr * 8))
// Message Object Nr Interrupt Pointer Register
#define CAN_MOIPR(Nr) (MO_BASE + 02 + (Nr * 8))
// Message Object Nr Acceptance Mask Register
#define CAN_MOAMR(Nr) (MO_BASE + 03 + (Nr * 8))
// Message Object Nr Data Register Low
#define CAN_MODATAL(Nr) (MO_BASE + 04 + (Nr * 8))
// Message Object Nr Data Register High
#define CAN_MODATAH(Nr) (MO_BASE + 05 + (Nr * 8))
// Message Object Nr Arbitration Register
#define CAN_MOAR(Nr) (MO_BASE + 06 + (Nr * 8))
// Message Object Nr Control Register
#define CAN_MOCTR(Nr) (MO_BASE + 07 + (Nr * 8))
//------------------------------------------------------------
//-- CAN Node Registers 0-1 ----------------------------------
//------------------------------------------------------------
// Node x Error Counter Register
#define CAN_NECNT(Nr) (CAN_NECNT0 + (Nr * 0x40))
//****************************************************************************
// @Defines
//****************************************************************************
// Panel Busy Flag
#define CAN_PANCTR_BUSY 0x01
// Message Object Status Register
#define MOSTAT_RXPND 0x01
#define MOSTAT_TXPND 0x02
#define MOSTAT_NEWDAT 0x08
#define MOSTAT_MSGLST 0x10
#define MOSTAT_RST_MNR 0x19
// MultiCAN Access Mediator Registers
// ADCON Read is enabled
#define ADCON_R 0x00
// ADCON Write is enabled
#define ADCON_W 0x01
// Data Transmission Busy
#define CAN_ADCON_BSY 0x02
// Auto increment the current address(+1)
#define ADR_INC 0x04
// Auto increment the current address(+8)
#define ADR_INC8 0x0C
// Auto decrement the current address(-1)
#define ADR_DEC 0x08
// CAN Data 0 Valid
#define D0_VALID 0x10
// CAN Data 1 Valid
#define D1_VALID 0x20
// CAN Data 2 Valid
#define D2_VALID 0x40
// CAN Data 3 Valid
#define D3_VALID 0x80
// CAN Data 0-3 Valid
#define ALL_DATA_VALID 0xF0
/// -------------------------------------------------------------------------
/// @Definition of a union for the CAN data structure
/// -------------------------------------------------------------------------
// The following data type used for converting 32-bit data to Four 8-bit data types
// and vica-versa. This is used for accessing MultiCAN Kernel to Access Mediator
// Registers. The data type has the following fields:
//
// 31 24 23 16 15 8 7 0
// |------------------------------------------------|
// | DB0 | DB1 | DB2 | DB3 |
// |------------------------------------------------|
// | |
// | <------------------ ulVal -------------------> |
//
typedef union ulValue {
ulong ulVal; // 32-bit Data Type
ubyte ubDB[4]; // Four 8-bit Data Type
} un_32bit;
// The following data type used for converting 16-bit data to Two 8-bit data types
// and vica-versa. The data type has the following fields:
//
// 15 8 7 0
// |----------------------|
// | DB0 | DB1 |
// |----------------------|
// | |
// | <----- uwVal ------> |
//
typedef union uwValue {
uword uwVal; // 16-bit Data Type
ubyte ubDB[2]; // Two 8-bit Data Type
} un_16bit;
/// -------------------------------------------------------------------------
/// @Definition of a structure for the CAN data
/// -------------------------------------------------------------------------
// The following data type serves as a software message object. Each access to
// a hardware message object has to be made by forward a pointer to a software
// message object (MCAN_SWObj). The data type has the following fields:
//
// ubMOdlc:
// this byte has the same structure as the message configuration register of a
// MOFCRn message object. It contains the ' Data Lenght Code (DLC)'
//
// 7 6 5 4 3 2 1 0
// |------------------------------------------------|
// | 0 | DLC |
// |------------------------------------------------|
//
// ubMOcfg:
// this byte contains the 'Extended Identifier (IDE)', the 'Message Direction (DIR)',
// the 'Node Select (NODE)' And the 'Remote Monitoring Mode (RMM)'
//
//
// 7 6 5 4 3 2 1 0
// |------------------------------------------------|
// | | DIR | XTD | NODE | RMM |
// |------------------------------------------------|
//
// ulID:
// this field is four bytes long and contains either the 11-bit identifier
// or the 29-bit identifier
//
// ulMask:
// this field is four bytes long and contains either the 11-bit mask
// or the 29-bit mask
//
// ulDATAL:
// contains the lowest 4 bytes of message object
//
// ulDATAH:
// contains the upper 4 bytes of message object
//
// uwCounter:
// this field is two bytes long and contains the counter value
//
typedef struct
{
ubyte ubMOdlc; // message object function control register[31-24]
ubyte ubMOcfg; // message object configuration
un_32bit ulID; // standard (11-bit)/extended (29-bit) identifier
un_32bit ulMask; // standard (11-bit)/extended (29-bit) mask
un_32bit ulDATAL; // 32-bit data Lower bytes
un_32bit ulDATAH; // 32-bit data Higher bytes
un_16bit uwCounter; // frame counter(MOIPRn[31-16]
}stCAN_SWObj;
// USER CODE BEGIN (CAN_Header,5)
// USER CODE END
//****************************************************************************
// @Imported Global Variables
//****************************************************************************
// USER CODE BEGIN (CAN_Header,6)
// USER CODE END
//****************************************************************************
// @Global Variables
//****************************************************************************
// USER CODE BEGIN (CAN_Header,7)
// USER CODE END
//****************************************************************************
// @Prototypes Of Global Functions
//****************************************************************************
void CAN_vInit(void);
void CAN_vGetMsgObj(ubyte ubObjNr, stCAN_SWObj *pstObj);
ubyte CAN_ubRequestMsgObj(ubyte ubObjNr);
ubyte CAN_ubNewData(ubyte ubObjNr);
void CAN_vTransmit(ubyte ubObjNr);
void CAN_vLoadData(ubyte ubObjNr, ulong *ulpubData);
void CAN_vReleaseObj(ubyte ubObjNr);
void CAN_vWriteAMData(ulong ulValue);
void CAN_vSetListCommand(ulong ulVal);
// USER CODE BEGIN (CAN_Header,8)
// USER CODE END
//****************************************************************************
// @Macro CAN_vReadEN()
//
//----------------------------------------------------------------------------
// @Description This macro enables Read mode (CAN Address/Data Control
// Register).
//
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2024/8/22
//
//****************************************************************************
#define CAN_vReadEN() CAN_ADCON = 0x00; while(CAN_ADCON & CAN_ADCON_BSY)
//****************************************************************************
// @Macro CAN_vWriteEN(ubyte ubDCtrl)
//
//----------------------------------------------------------------------------
// @Description This macro enables Write mode (CAN Address/Data Control
// Register).
//
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubDCtrl:
// Data Control Flags
//
//----------------------------------------------------------------------------
// @Date 2024/8/22
//
//****************************************************************************
#define CAN_vWriteEN(ubDCtrl) CAN_ADCON = ((ubDCtrl) | ADCON_W); while(CAN_ADCON & CAN_ADCON_BSY)
//****************************************************************************
// @Macro CAN_vWriteCANAddress(uword uwAdr)
//
//----------------------------------------------------------------------------
// @Description This macro writes 16-bit CAN address to CAN Address
// Register Low and High respectively.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters uwAdr:
// 16-bit Address
//
//----------------------------------------------------------------------------
// @Date 2024/8/22
//
//****************************************************************************
#define CAN_vWriteCANAddress(uwAdr) CAN_ADLH = uwAdr
//****************************************************************************
// @Macro CAN_vWriteCANData(ulong ulValue)
//
//----------------------------------------------------------------------------
// @Description This macro writes 32-bit Data to CAN Data Register's
// 0-3respectively.
// Note:
// Write Process :
// ->Write the address of the MultiCAN kernel register to the
// CAN_ADL and CAN_ADH registers.
// use macro : CAN_vWriteCANAddress.
// ->Write the data to the
// CAN_DATA0/CAN_DATA1/CAN_DATA2/CAN_DATA3 registers.
// ->Write the register CAN_ADCON, including setting the valid
// bit of the data registers and setting register bit RWEN to
// 1.
// ->The valid data will be written to the MultiCAN kernel
// only once. Register bit BSY will become 1.
// ->When Register bit BSY becomes 0, the transmission is
// finished.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ulValue:
// 32-bit Data
//
//----------------------------------------------------------------------------
// @Date 2024/8/22
//
//****************************************************************************
#define CAN_vWriteCANData(ulValue) CAN_DATA01 = (ulValue & 0xFFFF); \
CAN_DATA23 = (ulValue >> 16) & 0xFFFF; \
CAN_vWriteEN(ALL_DATA_VALID)
//****************************************************************************
// @Macro CAN_pushAMRegs/_popAMRegs()
//
//----------------------------------------------------------------------------
// @Description The macro CAN_pushAMRegs() PUSH the CAN Access Mediator
// Registers.
// The macro CAN_popAMRegs() POP the CAN Access Mediator
// Registers.
// Note:
// This macro is used in CAN ISR/Function's to protect Access
// Mediator Register
// MultiCAN Access Mediator Registers:
// ADL, ADH, DATA0, DATA1, DATA2, DATA3.
//
// The _push_/_pop_ routine inserts a PUSH/POP instruction
// into the program saving the contents of the Special
// Function Register(sfr) on the Stack.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2024/8/22
//
//****************************************************************************
#define CAN_pushAMRegs() while(CAN_ADCON & CAN_ADCON_BSY); \
_push_(CAN_ADL); _push_(CAN_ADH); \
_push_(CAN_DATA0); _push_(CAN_DATA1); \
_push_(CAN_DATA2); _push_(CAN_DATA3)
#define CAN_popAMRegs() _pop_(CAN_DATA3); _pop_(CAN_DATA2); \
_pop_(CAN_DATA1); _pop_(CAN_DATA0); \
_pop_(CAN_ADH); _pop_(CAN_ADL)
//****************************************************************************
// @Interrupt Vectors
//****************************************************************************
// Shared interrupt vector definitions are defined in SHARED_INT.H
// USER CODE BEGIN (CAN_Header,9)
// USER CODE END
#endif // ifndef _CAN_H_