Files
acquisition_module/CAN.C

1656 lines
65 KiB
C

//****************************************************************************
// @Module MultiCAN Controller
// @Filename CAN.C
// @Project CL2.0.dav
//----------------------------------------------------------------------------
// @Controller Infineon XC886CLM-8FF
//
// @Compiler Keil
//
// @Codegenerator 1.3
//
// @Description: This file contains functions that use the CAN module.
//
//----------------------------------------------------------------------------
// @Date 2025/1/18 20:45:35
//
//****************************************************************************
// USER CODE BEGIN (CAN_General,1)
// USER CODE END
//****************************************************************************
// @Project Includes
//****************************************************************************
#include "MAIN.H"
// USER CODE BEGIN (CAN_General,2)
// USER CODE END
//****************************************************************************
// @Macros
//****************************************************************************
// USER CODE BEGIN (CAN_General,3)
// USER CODE END
//****************************************************************************
// @Defines
//****************************************************************************
// USER CODE BEGIN (CAN_General,4)
// USER CODE END
//****************************************************************************
// @Typedefs
//****************************************************************************
// USER CODE BEGIN (CAN_General,5)
// USER CODE END
//****************************************************************************
// @Imported Global Variables
//****************************************************************************
// USER CODE BEGIN (CAN_General,6)
// USER CODE END
//****************************************************************************
// @Global Variables
//****************************************************************************
// USER CODE BEGIN (CAN_General,7)
// USER CODE END
//****************************************************************************
// @External Prototypes
//****************************************************************************
// USER CODE BEGIN (CAN_General,8)
// USER CODE END
//****************************************************************************
// @Prototypes Of Local Functions
//****************************************************************************
// USER CODE BEGIN (CAN_General,9)
// USER CODE END
//****************************************************************************
// @Function void CAN_vInit(void)
//
//----------------------------------------------------------------------------
// @Description This is the initialization function of the CAN function
// library. It is assumed that the SFRs used by this library
// are in their reset state.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (Init,1)
// USER CODE END
void CAN_vInit(void)
{
// USER CODE BEGIN (Init,2)
// USER CODE END
/// -----------------------------------------------------------------------
/// Configuration of the Module Clock:
/// -----------------------------------------------------------------------
/// - the CAN module clock = 48.00 MHz
/// - FCLK runs at 2 times the frequency of PCLK.
/// - CMCON - Clock Control Register is Configured in MAIN_vInit
// - wait until Panel has finished the initialisation
CAN_vWriteCANAddress(CAN_PANCTR); // Addressing CAN_PANCTR
CAN_DATA1 = CAN_PANCTR_BUSY;
while(CAN_DATA1 & CAN_PANCTR_BUSY){ // wait until Panel has finished the
// initialisation
CAN_ADCON &= ~0x01;
}
/// -----------------------------------------------------------------------
/// Configuration of CAN Node 0:
/// -----------------------------------------------------------------------
/// General Configuration of the Node 0:
/// - set INIT and CCE
/// - enable interrupt generation upon a change of BOFF or EWARN or upon a
/// set of LLE, LOE or INIT
/// - alert interrupt node pointer: MultiCAN SRN 0
//-----------CAN_NCR0 = 0x00000049-------------------------------------
CAN_vWriteCANAddress(CAN_NCR0); // Addressing CAN_NCR0
CAN_DATA0 = 0x49; // load NODE 0 control register[7-0]
CAN_vWriteEN(D0_VALID+ADR_INC); // Data0 is Valid for transmission and
// Write is EnabledCAN Address pointing
// to the CAN_NSR0.
// CAN Address pointing to the CAN_NIPR0
CAN_ADCON = ADR_INC; // Auto Increment the current address(+1)
/// - load NODE 0 interrupt pointer register
//-----------CAN_NIPR0 = 0x00000000-------------------------------------
CAN_DATA0 = 0x00; // load NIPR0_LECINP, NIPR0_ALINP
CAN_DATA1 = 0x00; // load NIPR0_CFCINP, NIPR0_TRINP
CAN_vWriteEN(D0_VALID+D1_VALID+ADR_INC); // Data0 and Data1 are Valid for
// with Auto Increment
// transmission and Write is
// Enabled CAN Address pointing
// to the CAN_NPCR0
/// -----------------------------------------------------------------------
/// Configuration of the used CAN Input Port Pins:
/// -----------------------------------------------------------------------
/// - Pin P1.0 is used as RXDC0_0 input
//-----------CAN_NPCR0 = 0x00000000-------------------------------------
/// - Loop-back mode is disabled
CAN_DATA0 = 0x00; // Receive Select NPCR0_RXSEL
CAN_DATA1 = 0x00; // Loop-back mode is disabled
CAN_vWriteEN(D0_VALID+D1_VALID+ADR_INC); // Data0 & 1 are Valid for
// transmission and Write is
// Enabled with AutoIncrement
// CAN Address pointing to the
// CAN_NBTR0
/// Configuration of the Node 0 Baud Rate:
/// - required baud rate = 250.000 kbaud
/// - real baud rate = 250.000 kbaud
/// - sample point = 75.00 %
/// - there are 11 time quanta before sample point
/// - there are 4 time quanta after sample point
/// - the (re)synchronization jump width is 2 time quanta
//-----------CAN_NBTR0 = 0x00003A4B-------------------------------------
CAN_DATA0 = 0x4B; // load NBTR0_SJW, BRP
CAN_DATA1 = 0x3A; // load NBTR0_DIV8, TSEG2, TSEG1
CAN_vWriteEN(D0_VALID+D1_VALID+ADR_INC); // Data0, 1 are valid for
// transmission and Write is
// Enabled with Auto
// Increment(+1) CAN Address
// pointing to the CAN_NECNT0
/// Configuration of the Node 0 Error Counter:
/// - the error warning threshold value (warning level) is 96
//-----------CAN_NECNT0 = 0x00600000-------------------------------------
CAN_DATA2 = 0x60; // load NECNT0_EWRNLVL register
CAN_vWriteEN(D2_VALID+ADR_INC); // Data2 is Valid for transmission, Auto
// Increment current address(+1) and
// Write is Enabled CAN Address pointing
// to the CAN_NFCR0
/// Configuration of the Frame Counter:
/// - Frame Counter Mode: the counter is incremented upon the reception
/// and transmission of frames
/// - frame counter: 0x0000
//-----------CAN_NFCR0 = 0x00000000-------------------------------------
CAN_DATA0 = 0x00; // load NFCR0_CFCL
CAN_DATA1 = 0x00; // load NFCR0_CFCH
CAN_DATA2 = 0x00; // load NFCR0_CFCOV, CFCIE, CFMOD, CFSEL
CAN_vWriteEN(D0_VALID+D1_VALID+D2_VALID); // Data0, 1, 2 are valid for
// transmission and Write is
// Enabled
/// -----------------------------------------------------------------------
/// Configuration of CAN Node 1:
/// -----------------------------------------------------------------------
/// General Configuration of the Node 1:
/// - set INIT and CCE
//-----------CAN_NCR1 = 0x00000041-------------------------------------
CAN_vWriteCANAddress(CAN_NCR1); // Addressing CAN_NCR1
CAN_DATA0 = 0x41; // load NODE 1 control register[7-0]
CAN_vWriteEN(D0_VALID+ADR_INC); // Data0 is Valid for transmission and
// Write is EnabledCAN Address pointing
// to the CAN_NSR1.
/// -----------------------------------------------------------------------
/// Configuration of the used CAN Output Port Pins:
/// -----------------------------------------------------------------------
/// Pin P1.1 is used as TXDC0_0 Output
/// - NODE1 TXD Pin's are not used
SFR_PAGE(_pp2, noSST); // switch to page 2
P1_ALTSEL0 |= 0x02; // set AltSel0
P1_ALTSEL1 |= 0x02; // set AltSel1
SFR_PAGE(_pp0, noSST); // switch to page 0
P1_DIR |= 0x02; // set Direction as Output
/// -----------------------------------------------------------------------
/// Configuration of the CAN Message Object List Structure:
/// -----------------------------------------------------------------------
CAN_vWriteCANAddress(CAN_PANCTR); // Addressing CAN_PANCTR
/// Allocate MOs for list 1:
CAN_vSetListCommand(0x01080002); // MO8 for list 1
CAN_vSetListCommand(0x01050002); // MO5 for list 1
CAN_vSetListCommand(0x01060002); // MO6 for list 1
CAN_vSetListCommand(0x01070002); // MO7 for list 1
CAN_vSetListCommand(0x01090002); // MO9 for list 1
CAN_vSetListCommand(0x010A0002); // MO10 for list 1
CAN_vSetListCommand(0x010B0002); // MO11 for list 1
CAN_vSetListCommand(0x010C0002); // MO12 for list 1
CAN_vSetListCommand(0x010D0002); // MO13 for list 1
CAN_vSetListCommand(0x010E0002); // MO14 for list 1
/// -----------------------------------------------------------------------
/// Configuration of the CAN Message Objects 0 - 31:
/// -----------------------------------------------------------------------
/// -----------------------------------------------------------------------
/// Configuration of Message Object 0:
/// -----------------------------------------------------------------------
/// - message object 0 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 1:
/// -----------------------------------------------------------------------
/// - message object 1 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 2:
/// -----------------------------------------------------------------------
/// - message object 2 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 3:
/// -----------------------------------------------------------------------
/// - message object 3 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 4:
/// -----------------------------------------------------------------------
/// - message object 4 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 5:
/// -----------------------------------------------------------------------
/// - message object 5 is valid
/// - message object is used as receive object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR5 = 0x00A00000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR5); // Addressing MO5 control register
CAN_vWriteAMData(0x00A00000); // load MO5 control register
// CAN Address pointing to the CAN_MOAR5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x00000003
//--------------MOAR5 = 0xE0000003---------------------------------------
CAN_vWriteAMData(0xE0000003); // load MO5 arbitration register
// CAN Address pointing to the CAN_MODATAH5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH5 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO5 data register high
// CAN Address pointing to the CAN_MODATAL5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL5 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO5 data register low
// CAN Address pointing to the CAN_MOAMR5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR5 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO5 acceptance mask register
// CAN Address pointing to the CAN_MOIPR5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 5
//--------------MOIPR5 = 0x00000500---------------------------------------
CAN_vWriteAMData(0x00000500); // load MO5 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR5 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO5 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR5
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR5 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO5 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 6:
/// -----------------------------------------------------------------------
/// - message object 6 is valid
/// - message object is used as transmit object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR6 = 0x0EA80000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR6); // Addressing MO6 control register
CAN_vWriteAMData(0x0EA80000); // load MO6 control register
// CAN Address pointing to the CAN_MOAR6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x15000001
//--------------MOAR6 = 0xF5000001---------------------------------------
CAN_vWriteAMData(0xF5000001); // load MO6 arbitration register
// CAN Address pointing to the CAN_MODATAH6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH6 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO6 data register high
// CAN Address pointing to the CAN_MODATAL6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL6 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO6 data register low
// CAN Address pointing to the CAN_MOAMR6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR6 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO6 acceptance mask register
// CAN Address pointing to the CAN_MOIPR6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 6
//--------------MOIPR6 = 0x00000600---------------------------------------
CAN_vWriteAMData(0x00000600); // load MO6 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR6 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO6 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR6
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR6 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO6 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 7:
/// -----------------------------------------------------------------------
/// - message object 7 is valid
/// - message object is used as receive object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR7 = 0x00A00000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR7); // Addressing MO7 control register
CAN_vWriteAMData(0x00A00000); // load MO7 control register
// CAN Address pointing to the CAN_MOAR7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x15000002
//--------------MOAR7 = 0xF5000002---------------------------------------
CAN_vWriteAMData(0xF5000002); // load MO7 arbitration register
// CAN Address pointing to the CAN_MODATAH7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH7 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO7 data register high
// CAN Address pointing to the CAN_MODATAL7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL7 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO7 data register low
// CAN Address pointing to the CAN_MOAMR7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR7 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO7 acceptance mask register
// CAN Address pointing to the CAN_MOIPR7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 7
//--------------MOIPR7 = 0x00000700---------------------------------------
CAN_vWriteAMData(0x00000700); // load MO7 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR7 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO7 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR7
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR7 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO7 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 8:
/// -----------------------------------------------------------------------
/// - message object 8 is valid
/// - message object is used as transmit object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR8 = 0x0EA80000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR8); // Addressing MO8 control register
CAN_vWriteAMData(0x0EA80000); // load MO8 control register
// CAN Address pointing to the CAN_MOAR8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x11000002
//--------------MOAR8 = 0xF1000002---------------------------------------
CAN_vWriteAMData(0xF1000002); // load MO8 arbitration register
// CAN Address pointing to the CAN_MODATAH8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH8 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO8 data register high
// CAN Address pointing to the CAN_MODATAL8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL8 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO8 data register low
// CAN Address pointing to the CAN_MOAMR8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR8 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO8 acceptance mask register
// CAN Address pointing to the CAN_MOIPR8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 8
//--------------MOIPR8 = 0x00000800---------------------------------------
CAN_vWriteAMData(0x00000800); // load MO8 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR8 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO8 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR8
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR8 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO8 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 9:
/// -----------------------------------------------------------------------
/// - message object 9 is valid
/// - message object is used as transmit object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR9 = 0x0EA80000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR9); // Addressing MO9 control register
CAN_vWriteAMData(0x0EA80000); // load MO9 control register
// CAN Address pointing to the CAN_MOAR9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x1FFFFFF0
//--------------MOAR9 = 0xFFFFFFF0---------------------------------------
CAN_vWriteAMData(0xFFFFFFF0); // load MO9 arbitration register
// CAN Address pointing to the CAN_MODATAH9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH9 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO9 data register high
// CAN Address pointing to the CAN_MODATAL9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL9 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO9 data register low
// CAN Address pointing to the CAN_MOAMR9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR9 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO9 acceptance mask register
// CAN Address pointing to the CAN_MOIPR9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 9
//--------------MOIPR9 = 0x00000900---------------------------------------
CAN_vWriteAMData(0x00000900); // load MO9 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR9 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO9 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR9
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR9 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO9 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 10:
/// -----------------------------------------------------------------------
/// - message object 10 is valid
/// - message object is used as transmit object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR10 = 0x0EA80000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR10); // Addressing MO10 control register
CAN_vWriteAMData(0x0EA80000); // load MO10 control register
// CAN Address pointing to the CAN_MOAR10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x14000002
//--------------MOAR10 = 0xF4000002---------------------------------------
CAN_vWriteAMData(0xF4000002); // load MO10 arbitration register
// CAN Address pointing to the CAN_MODATAH10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH10 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO10 data register high
// CAN Address pointing to the CAN_MODATAL10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL10 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO10 data register low
// CAN Address pointing to the CAN_MOAMR10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR10 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO10 acceptance mask register
// CAN Address pointing to the CAN_MOIPR10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 10
//--------------MOIPR10 = 0x00000A00---------------------------------------
CAN_vWriteAMData(0x00000A00); // load MO10 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR10 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO10 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR10
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR10 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO10 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 11:
/// -----------------------------------------------------------------------
/// - message object 11 is valid
/// - message object is used as receive object
/// - this message object is assigned to list 1 (node 0)
CAN_vWriteCANAddress(CAN_MOCTR11); // Addressing MO11 control register
CAN_vWriteAMData(0x00A00000); // load MO11 control register
// CAN Address pointing to the CAN_MOAR11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x15000006
//--------------MOAR11 = 0xF5000006---------------------------------------
CAN_vWriteAMData(0xF5000006); // load MO11 arbitration register
// CAN Address pointing to the CAN_MODATAH11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH11 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO11 data register high
// CAN Address pointing to the CAN_MODATAL11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL11 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO11 data register low
// CAN Address pointing to the CAN_MOAMR11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR11 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO11 acceptance mask register
// CAN Address pointing to the CAN_MOIPR11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 11
//--------------MOIPR11 = 0x00000B00---------------------------------------
CAN_vWriteAMData(0x00000B00); // load MO11 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR11 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO11 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR11
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR11 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO11 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 12:
/// -----------------------------------------------------------------------
/// - message object 12 is valid
/// - message object is used as transmit object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR12 = 0x0EA80000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR12); // Addressing MO12 control register
CAN_vWriteAMData(0x0EA80000); // load MO12 control register
// CAN Address pointing to the CAN_MOAR12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x15000003
//--------------MOAR12 = 0xF5000003---------------------------------------
CAN_vWriteAMData(0xF5000003); // load MO12 arbitration register
// CAN Address pointing to the CAN_MODATAH12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH12 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO12 data register high
// CAN Address pointing to the CAN_MODATAL12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL12 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO12 data register low
// CAN Address pointing to the CAN_MOAMR12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR12 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO12 acceptance mask register
// CAN Address pointing to the CAN_MOIPR12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 12
//--------------MOIPR12 = 0x00000C00---------------------------------------
CAN_vWriteAMData(0x00000C00); // load MO12 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR12 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO12 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR12
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR12 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO12 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 13:
/// -----------------------------------------------------------------------
/// - message object 13 is valid
/// - message object is used as receive object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR13 = 0x00A00000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR13); // Addressing MO13 control register
CAN_vWriteAMData(0x00A00000); // load MO13 control register
// CAN Address pointing to the CAN_MOAR13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x11000001
//--------------MOAR13 = 0xF1000001---------------------------------------
CAN_vWriteAMData(0xF1000001); // load MO13 arbitration register
// CAN Address pointing to the CAN_MODATAH13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH13 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO13 data register high
// CAN Address pointing to the CAN_MODATAL13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL13 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO13 data register low
// CAN Address pointing to the CAN_MOAMR13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - accept reception of standard and extended frames
/// - acceptance mask 29-bit: 0x1FFFFFFF
/// - acceptance mask 11-bit: 0x7FF
//--------------CAN_MOAMR13 = 0x1FFFFFFF------------------------------------
CAN_vWriteAMData(0x1FFFFFFF); // load MO13 acceptance mask register
// CAN Address pointing to the CAN_MOIPR13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 13
//--------------MOIPR13 = 0x00000D00---------------------------------------
CAN_vWriteAMData(0x00000D00); // load MO13 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR13 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO13 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR13
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR13 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO13 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 14:
/// -----------------------------------------------------------------------
/// - message object 14 is valid
/// - message object is used as receive object
/// - this message object is assigned to list 1 (node 0)
//--------------MOCTR14 = 0x00A00000---------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR14); // Addressing MO14 control register
CAN_vWriteAMData(0x00A00000); // load MO14 control register
// CAN Address pointing to the CAN_MOAR14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - priority class 3; transmit acceptance filtering is based on the list
/// order (like class 1)
/// - extended 29-bit identifier
/// - identifier 29-bit: 0x15000004
//--------------MOAR14 = 0xF5000004---------------------------------------
CAN_vWriteAMData(0xF5000004); // load MO14 arbitration register
// CAN Address pointing to the CAN_MODATAH14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAH14 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO14 data register high
// CAN Address pointing to the CAN_MODATAL14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MODATAL14 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO14 data register low
// CAN Address pointing to the CAN_MOAMR14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - only accept receive frames with matching IDE bit
/// - acceptance mask 29-bit: 0x1FFFFFFF
//--------------CAN_MOAMR14 = 0x3FFFFFFF------------------------------------
CAN_vWriteAMData(0x3FFFFFFF); // load MO14 acceptance mask register
// CAN Address pointing to the CAN_MOIPR14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - use message pending register 0 bit position 14
//--------------MOIPR14 = 0x00000E00---------------------------------------
CAN_vWriteAMData(0x00000E00); // load MO14 interrupt pointer register
// CAN Address pointing to the CAN_MOFGPR14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
//--------------MOFGPR14 = 0x00000000---------------------------------------
CAN_vWriteAMData(0x00000000); // load MO14 FIFO/gateway pointer register
// CAN Address pointing to the CAN_MOFCR14
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
/// - this object is a STANDARD MESSAGE OBJECT
/// - 8 valid data bytes
//--------------MOFCR14 = 0x08000000---------------------------------------
CAN_vWriteAMData(0x08000000); // load MO14 function control register
/// -----------------------------------------------------------------------
/// Configuration of Message Object 15:
/// -----------------------------------------------------------------------
/// - message object 15 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 16:
/// -----------------------------------------------------------------------
/// - message object 16 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 17:
/// -----------------------------------------------------------------------
/// - message object 17 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 18:
/// -----------------------------------------------------------------------
/// - message object 18 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 19:
/// -----------------------------------------------------------------------
/// - message object 19 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 20:
/// -----------------------------------------------------------------------
/// - message object 20 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 21:
/// -----------------------------------------------------------------------
/// - message object 21 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 22:
/// -----------------------------------------------------------------------
/// - message object 22 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 23:
/// -----------------------------------------------------------------------
/// - message object 23 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 24:
/// -----------------------------------------------------------------------
/// - message object 24 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 25:
/// -----------------------------------------------------------------------
/// - message object 25 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 26:
/// -----------------------------------------------------------------------
/// - message object 26 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 27:
/// -----------------------------------------------------------------------
/// - message object 27 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 28:
/// -----------------------------------------------------------------------
/// - message object 28 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 29:
/// -----------------------------------------------------------------------
/// - message object 29 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 30:
/// -----------------------------------------------------------------------
/// - message object 30 is not valid
/// -----------------------------------------------------------------------
/// Configuration of Message Object 31:
/// -----------------------------------------------------------------------
/// - message object 31 is not valid
/// -----------------------------------------------------------------------
/// Configuration of the Interrupts:
/// -----------------------------------------------------------------------
/// - CAN interrupt node 0 is disabled
/// - CAN interrupt node 1 is disabled
/// - CAN interrupt node 2 is disabled
/// - CAN interrupt node 3 is disabled
/// - CAN interrupt node 4 is disabled
/// - CAN interrupt node 5 is disabled
/// - CAN interrupt node 6 is disabled
/// - CAN interrupt node 7 is disabled
// -----------------------------------------------------------------------
// Start the CAN Nodes:
// -----------------------------------------------------------------------
/// - -----------CAN_NCR0--------------------------------------------------------
CAN_vWriteCANAddress(CAN_NCR0); // Addressing CAN_NCR0
CAN_vReadEN(); // Read Mode is Enabled
CAN_DATA0 &= ~0x41; // reset INIT and CCE
CAN_vWriteEN(D0_VALID); // Data0 is Valid for transmission and Write
// is Enabled
// USER CODE BEGIN (Init,3)
// USER CODE END
} // End of function CAN_vInit
//****************************************************************************
// @Function void CAN_vWriteAMData(ulong ulValue)
//
//----------------------------------------------------------------------------
// @Description This function 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
//
//****************************************************************************
// USER CODE BEGIN (WriteAMData,1)
// USER CODE END
void CAN_vWriteAMData(ulong ulValue)
{
un_32bit ulData;
ulData.ulVal = ulValue;
CAN_DATA0 = ulData.ubDB[3]; // load CAN Data Register 0
CAN_DATA1 = ulData.ubDB[2]; // load CAN Data Register 1
CAN_DATA2 = ulData.ubDB[1]; // load CAN Data Register 2
CAN_DATA3 = ulData.ubDB[0]; // load CAN Data Register 3
CAN_vWriteEN(ALL_DATA_VALID); // Writemode is Enabled
} // End of function CAN_vWriteAMData
//****************************************************************************
// @Function void CAN_vSetListCommand(ulong ulVal)
//
//----------------------------------------------------------------------------
// @Description This function write's 32-bit Data to CAN_PANCTR Register.
//
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ulVal:
// 32-bit Data
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (SetListCommand,1)
// USER CODE END
void CAN_vSetListCommand(ulong ulVal)
{
CAN_vWriteAMData(ulVal); // - load Panel Control Register
CAN_DATA1 = CAN_PANCTR_BUSY;
while(CAN_DATA1 & CAN_PANCTR_BUSY){ // wait until Panel has finished the
// initialisation
CAN_ADCON &= ~0x01;
}
} // End of function CAN_vSetListCommand
//****************************************************************************
// @Function void CAN_vGetMsgObj(ubyte ubObjNr, stCAN_SWObj *pstObj)
//
//----------------------------------------------------------------------------
// @Description This function fills the forwarded SW message object with
// the content of the chosen HW message object.
//
// The structure of the SW message object is defined in the
// header file CAN.H (see stCAN_SWObj).
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object to be read (0-31)
// @Parameters *pstObj:
// Pointer on a message object to be filled by this function
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (GetMsgObj,1)
// USER CODE END
void CAN_vGetMsgObj(ubyte ubObjNr, stCAN_SWObj *pstObj)
{
ubyte ubTemp;
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
//----- get DLC -------------------------------------------------------
CAN_vWriteCANAddress(CAN_MOFCR(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
pstObj->ubMOdlc = CAN_DATA3;//MOFCRn[31-24] DLC
//----- get MODATAL ---------------------------------------------------
CAN_vWriteCANAddress(CAN_MODATAL(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
pstObj->ulDATAL.ubDB[3] = CAN_DATA0; // Read CAN Data Register 0
pstObj->ulDATAL.ubDB[2] = CAN_DATA1; // Read CAN Data Register 1
pstObj->ulDATAL.ubDB[1] = CAN_DATA2; // Read CAN Data Register 2
pstObj->ulDATAL.ubDB[0] = CAN_DATA3; // Read CAN Data Register 3
// CAN Address pointing to the CAN_MODATAH
CAN_ADCON = ADR_INC;
//----- get MODATAH ---------------------------------------------------
CAN_vReadEN(); // Readmode is Enabled
pstObj->ulDATAH.ubDB[3] = CAN_DATA0; // Read CAN Data Register 0
pstObj->ulDATAH.ubDB[2] = CAN_DATA1; // Read CAN Data Register 1
pstObj->ulDATAH.ubDB[1] = CAN_DATA2; // Read CAN Data Register 2
pstObj->ulDATAH.ubDB[0] = CAN_DATA3; // Read CAN Data Register 3
//----- get DIR -------------------------------------------------------
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
if(CAN_DATA1 & 0x08) // if transmit object (MOSTAT_DIR)
{
pstObj->ubMOcfg = (pstObj->ubMOcfg | 0x08); // set DIR
}
//----- get XID - Extended Identifier ---------------------------------
// CAN Address pointing to the CAN_MOARn
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
CAN_vReadEN(); // ReadMode is Enabled
if(CAN_DATA3 & 0x20) // if extended identifier
{
//----- get XID - Extended Identifier (MOARn) ------------------------
pstObj->ulID.ubDB[3] = CAN_DATA0; // MOARn[7-0]
pstObj->ulID.ubDB[2] = CAN_DATA1; // MOARn[15-8]
pstObj->ulID.ubDB[1] = CAN_DATA2; // MOARn[23-16]
pstObj->ulID.ubDB[0] = (CAN_DATA3 & 0x1f); // MOARn[31-24]
// CAN Address pointing to the CAN_MODATAH
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MODATAL
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MOAMR
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
CAN_vReadEN(); // ReadMode is Enabled
//----- get XID - Extended Acceptance Mask (MOAMRn) -----------------
pstObj->ulMask.ubDB[3] = CAN_DATA0; // MOAMRn[7-0]
pstObj->ulMask.ubDB[2] = CAN_DATA1; // MOAMRn[15-8]
pstObj->ulMask.ubDB[1] = CAN_DATA2; // MOAMRn[23-16]
pstObj->ulMask.ubDB[0] = (CAN_DATA3 & 0x1f); // MOAMRn[31-24]
pstObj->ubMOcfg = (pstObj->ubMOcfg | 0x04); // set IDE 29-bit
}
else // standard identifier
{
//----- get - ID - Standard Identifier (MOARn) ---------------------
pstObj->ulID.ubDB[3] = (CAN_DATA2 & 0xFC) >> 2; // MOARn[23-16]
pstObj->ulID.ubDB[2] = (CAN_DATA3 & 0x1f); // MOARn[31-24]
pstObj->ulID.ubDB[1] = 0x00; // MOARn[15-8]
pstObj->ulID.ubDB[0] = 0x00; // MOARn[15-8]
ubTemp = 0;
ubTemp = ((pstObj->ulID.ubDB[2]) & 0x03) << 6;
pstObj->ulID.ubDB[2] = (pstObj->ulID.ubDB[2] >> 2);
pstObj->ulID.ubDB[3] = (pstObj->ulID.ubDB[3] + ubTemp);
// CAN Address pointing to the CAN_MODATAH
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MODATAL
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MOAMR
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
CAN_vReadEN(); // ReadMode is Enabled
//----- get - ID - Acceptance Mask (MOAMRn) -----------------------
pstObj->ulMask.ubDB[3] = (CAN_DATA2 & 0xFC) >> 2; // MOAMRn[23-16]
pstObj->ulMask.ubDB[2] = (CAN_DATA3 & 0x1f); // MOAMRn[31-24]
pstObj->ulMask.ubDB[1] = 0x00; // MOAMRn[15-8]
pstObj->ulMask.ubDB[0] = 0x00; // MOAMRn[15-8]
ubTemp = 0;
ubTemp = ((pstObj->ulMask.ubDB[2]) & 0x03) << 6;
pstObj->ulMask.ubDB[2] = (pstObj->ulMask.ubDB[2] >> 2);
pstObj->ulMask.ubDB[3] = (pstObj->ulMask.ubDB[3] + ubTemp);
}
//----- get CFCVAL - CAN Frame Counter Value (MOIPRn) -----------------
CAN_vWriteCANAddress(CAN_MOIPR(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
pstObj->uwCounter.ubDB[1] = CAN_DATA2; // MOIPRn[16-23]
pstObj->uwCounter.ubDB[0] = CAN_DATA3; // MOIPRn[31-24]
CAN_popAMRegs(); // POP the CAN Access Mediator Register
} // End of function CAN_vGetMsgObj
//****************************************************************************
// @Function ubyte CAN_ubRequestMsgObj(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description If a TRANSMIT OBJECT is to be reconfigured it must first be
// accessed. The access to the transmit object is exclusive.
// This function checks whether the choosen message object is
// still executing a transmit request, or if the object can be
// accessed exclusively.
// After the message object is reserved, it can be
// reconfigured by using the function CAN_vConfigMsgObj or
// CAN_vLoadData.
// Both functions enable access to the object for the CAN
// controller.
// By calling the function CAN_vTransmit transfering of data
// is started.
//
//----------------------------------------------------------------------------
// @Returnvalue 0 message object is busy (a transfer is active), else 1
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (RequestMsgObj,1)
// USER CODE END
ubyte CAN_ubRequestMsgObj(ubyte ubObjNr)
{
ubyte ubReturn = 0;
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
if((CAN_DATA1 & 0x01) == 0) // if reset TXRQ
{
CAN_vWriteCANData(0x00000020); // reset MSGVAL
ubReturn = 1;
}
CAN_popAMRegs(); // POP the CAN Access Mediator Register
return(ubReturn);
} // End of function CAN_ubRequestMsgObj
//****************************************************************************
// @Function ubyte CAN_ubNewData(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description This function checks whether the selected RECEIVE OBJECT
// has received a new message. If so the function returns the
// value '1'.
//
//----------------------------------------------------------------------------
// @Returnvalue 1 the message object has received a new message, else 0
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (NewData,1)
// USER CODE END
ubyte CAN_ubNewData(ubyte ubObjNr)
{
ubyte ubReturn = 0;
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr));
CAN_vReadEN(); // Readmode is Enabled
if(CAN_DATA0 & 0x08) // if NEWDAT
{
ubReturn = 1;
}
CAN_popAMRegs(); // POP the CAN Access Mediator Register
return(ubReturn);
} // End of function CAN_ubNewData
//****************************************************************************
// @Function void CAN_vTransmit(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description This function triggers the CAN controller to send the
// selected message.
// If the selected message object is a TRANSMIT OBJECT then
// this function triggers the sending of a data frame. If
// however the selected message object is a RECEIVE OBJECT
// this function triggers the sending of a remote frame.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (Transmit,1)
// USER CODE END
void CAN_vTransmit(ubyte ubObjNr)
{
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr)); //Addressing CAN_MOCTR register
CAN_vWriteCANData(0x07200000); // set TXRQ,TXEN0,TXEN1,MSGVAL
CAN_popAMRegs(); // POP the CAN Access Mediator Register
} // End of function CAN_vTransmit
//****************************************************************************
// @Function void CAN_vLoadData(ubyte ubObjNr, ulong *ulpubData)
//
//----------------------------------------------------------------------------
// @Description If a hardware TRANSMIT OBJECT has to be loaded with data
// but not with a new identifier, this function may be used
// instead of the function CAN_vConfigMsgObj. The message
// object should be accessed by calling the function
// CAN_ubRequestMsgObj before calling this function. This
// prevents the CAN controller from working with invalid data.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object to be configured (0-31)
// @Parameters *ulpubData:
// Pointer on a data buffer
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (LoadData,1)
// USER CODE END
void CAN_vLoadData(ubyte ubObjNr, ulong *ulpubData)
{
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr)); // Addressing CAN_MOCTRn register
CAN_vWriteCANData(0x00080000); // Set NEWDATA
// CAN Address pointing to the CAN_MOARn
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MODATAHn
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
// CAN Address pointing to the CAN_MODATALn
CAN_ADCON = ADR_DEC; // Auto Decrement the current address(-1)
CAN_vWriteCANData(*ulpubData); // Loading CAN_MODATALn
// CAN Address pointing to the CAN_MODATAH
CAN_ADCON = ADR_INC; // Auto Increment the current address(+1)
ulpubData++;
CAN_vWriteCANData(*ulpubData); // Loading CAN_MODATAHn
// CAN Address pointing to the CAN_MOARn
CAN_ADCON = ADR_INC; // Auto Increment the current address(+1)
// CAN Address pointing to the CAN_MOCTRn
CAN_ADCON = ADR_INC; // Auto Increment the current address(+1)
CAN_vWriteCANData(0x00200040); // reset RTSEL, set MSGVAL
CAN_popAMRegs(); // POP the CAN Access Mediator Register
} // End of function CAN_vLoadData
//****************************************************************************
// @Function void CAN_vReleaseObj(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description This function resets the NEWDAT flag of the selected
// RECEIVE OBJECT, so that the CAN controller have access to
// it. This function must be called if the function
// CAN_ubNewData detects, that new data are present in the
// message object and the actual data have been read by
// calling the function CAN_vGetMsgObj.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2025/1/18
//
//****************************************************************************
// USER CODE BEGIN (ReleaseObj,1)
// USER CODE END
void CAN_vReleaseObj(ubyte ubObjNr)
{
CAN_pushAMRegs(); // PUSH the CAN Access Mediator Register
CAN_vWriteCANAddress(CAN_MOCTR(ubObjNr)); // Addressing CAN_MOCTRn register
CAN_vWriteCANData(0x00000008); // reset NEWDAT
CAN_popAMRegs(); // POP the CAN Access Mediator Register
} // End of function CAN_vReleaseObj
// USER CODE BEGIN (CAN_General,10)
// USER CODE END