763 lines
26 KiB
C
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 2025/1/18 20:45:35
|
|
//
|
|
//****************************************************************************
|
|
|
|
// 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 2025/1/18
|
|
//
|
|
//****************************************************************************
|
|
|
|
#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 2025/1/18
|
|
//
|
|
//****************************************************************************
|
|
|
|
#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 2025/1/18
|
|
//
|
|
//****************************************************************************
|
|
|
|
#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 2025/1/18
|
|
//
|
|
//****************************************************************************
|
|
|
|
#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 2025/1/18
|
|
//
|
|
//****************************************************************************
|
|
|
|
#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_
|