From 305923f444c3515733479e8ed5a7267ec1662ab8 Mon Sep 17 00:00:00 2001 From: liumin Date: Sat, 5 Jul 2025 07:47:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CAN.C | 1356 +++++++++++++++++++++++++++++++++++++++++++++++++++ CAN.H | 762 +++++++++++++++++++++++++++++ CAN协议.xls | Bin 0 -> 30208 bytes CC6.C | 396 +++++++++++++++ CC6.H | 186 +++++++ 5 files changed, 2700 insertions(+) create mode 100644 CAN.C create mode 100644 CAN.H create mode 100644 CAN协议.xls create mode 100644 CC6.C create mode 100644 CC6.H diff --git a/CAN.C b/CAN.C new file mode 100644 index 0000000..e227630 --- /dev/null +++ b/CAN.C @@ -0,0 +1,1356 @@ +//**************************************************************************** +// @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 2024/8/22 08:23:16 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 + + //-----------CAN_NCR0 = 0x00000041------------------------------------- + + CAN_vWriteCANAddress(CAN_NCR0); // Addressing CAN_NCR0 + CAN_DATA0 = 0x41; // 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 5 time quanta before sample point + /// - there are 2 time quanta after sample point + /// - the (re)synchronization jump width is 2 time quanta + + //-----------CAN_NBTR0 = 0x00001457------------------------------------- + + CAN_DATA0 = 0x57; // load NBTR0_SJW, BRP + CAN_DATA1 = 0x14; // 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 + + /// ----------------------------------------------------------------------- + /// 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) + /// - standard 11-bit identifier + /// - identifier 11-bit: 0x711 + + //--------------MOAR6 = 0xDC440000--------------------------------------- + + CAN_vWriteAMData(0xDC440000); // 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 11-bit: 0x7FF + + //--------------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) + /// - standard 11-bit identifier + /// - identifier 11-bit: 0x712 + + //--------------MOAR7 = 0xDC480000--------------------------------------- + + CAN_vWriteAMData(0xDC480000); // 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 11-bit: 0x7FF + + //--------------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 receive object + /// - this message object is assigned to list 1 (node 0) + + //--------------MOCTR8 = 0x00A00000--------------------------------------- + + CAN_vWriteCANAddress(CAN_MOCTR8); // Addressing MO8 control register + + CAN_vWriteAMData(0x00A00000); // 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) + /// - standard 11-bit identifier + /// - identifier 11-bit: 0x713 + + //--------------MOAR8 = 0xDC4C0000--------------------------------------- + + CAN_vWriteAMData(0xDC4C0000); // 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 11-bit: 0x7FF + + //--------------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: 0x11000000 + + //--------------MOAR10 = 0xF1000000--------------------------------------- + + CAN_vWriteAMData(0xF1000000); // 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 not valid + /// ----------------------------------------------------------------------- + /// Configuration of Message Object 12: + /// ----------------------------------------------------------------------- + /// - message object 12 is not valid + /// ----------------------------------------------------------------------- + /// Configuration of Message Object 13: + /// ----------------------------------------------------------------------- + /// - message object 13 is not valid + /// ----------------------------------------------------------------------- + /// Configuration of Message Object 14: + /// ----------------------------------------------------------------------- + /// - message object 14 is not valid + /// ----------------------------------------------------------------------- + /// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 2024/8/22 +// +//**************************************************************************** + +// 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 + diff --git a/CAN.H b/CAN.H new file mode 100644 index 0000000..609b529 --- /dev/null +++ b/CAN.H @@ -0,0 +1,762 @@ +//**************************************************************************** +// @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_ diff --git a/CAN协议.xls b/CAN协议.xls new file mode 100644 index 0000000000000000000000000000000000000000..5e95183e59b80b4a44f08d76090c448a276276d0 GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/CC6.C b/CC6.C new file mode 100644 index 0000000..a006e5e --- /dev/null +++ b/CC6.C @@ -0,0 +1,396 @@ +//**************************************************************************** +// @Module Capture / Compare Unit 6 (CCU6) +// @Filename CC6.C +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description This file contains functions that use the CCU6 module. +// +//---------------------------------------------------------------------------- +// @Date 2025/3/28 16:46:42 +// +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,1) + +// USER CODE END + + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +#include "MAIN.H" + +// USER CODE BEGIN (CCU6_General,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,7) + +// USER CODE END + + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,8) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Local Functions +//**************************************************************************** + +// USER CODE BEGIN (CCU6_General,9) + +// USER CODE END + + +//**************************************************************************** +// @Function void CC6_vInit(void) +// +//---------------------------------------------------------------------------- +// @Description This is the initialization function of the CCU6 function +// library. It is assumed that the SFRs used by this library +// are in their reset state. +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/3/28 +// +//**************************************************************************** + +// USER CODE BEGIN (Init,1) + +// USER CODE END + +void CC6_vInit(void) +{ + // USER CODE BEGIN (Init,2) + + // USER CODE END + + SFR_PAGE(_cc1, noSST); // switch to page 1 + + /// ----------------------------------------------------------------------- + /// Configuration of Timer Control Register + /// ----------------------------------------------------------------------- + + CCU6_TCTR0L = 0x00; // load CCU6 timer control register 0 low + CCU6_TCTR0H = 0x00; // load CCU6 timer control register 0 high + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Timer 12: + /// ----------------------------------------------------------------------- + /// - timer 12 Input clock selected is 1 + /// - the additional prescaler for T12 is enabled. + /// - timer 12 run bit is set + /// - single shot mode is disabled + /// - timer 12 works in edge aligned mode + /// - interrupt on period match is disabled + /// - interrupt on one match is disabled + + CCU6_T12PRL = 0x5F; // load CCU6 T12 period register low + CCU6_T12PRH = 0x09; // load CCU6 T12 period register lhigh + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Timer 13: + /// ----------------------------------------------------------------------- + /// - Timer T13 Input clock selected is 1 + /// - The additional prescaler for T13 is disabled + /// - timer 13 run bit is set + /// - single shot mode is disabled + /// - interrupt on period match is disabled + /// - interrupt on compare match is disabled + + CCU6_T13PRL = 0x5F; // load CCU6 T13 period register low + CCU6_T13PRH = 0x09; // load CCU6 T13 period register high + + /// ----------------------------------------------------------------------- + /// Configuration of Dead-Time Control Register for Timer T12 + /// ----------------------------------------------------------------------- + + CCU6_T12DTCL = 0x01; // load CCU6 dead time control register low + // for timer T12 + + CCU6_T12DTCH = 0x03; // load CCU6 dead time control register high + // for timer T12 + + SFR_PAGE(_cc0, noSST); // switch to page 0 + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Channel 0: + /// ----------------------------------------------------------------------- + /// - compare mode 1 is selected + /// - T12 modulation for output CC60 is enabled + /// - T13 modulation for output CC60 is disabled + /// - the trap functionality of the pin CC60 is disabled + /// - the compare output CC60 drives passive level while CC60ST is '0' + /// - the passive level of the output CC60 is '0' + /// - dead time generation is enabled + + /// - generation interrupt on flag ICC60R is disabled + /// - generation interrupt on flag ICC60F is disabled + + CCU6_CC60SRL = 0x60; // load CCU6 capture/compare shadow register + // low for channel 0 + CCU6_CC60SRH = 0x09; // load CCU6 capture/compare shadow register + // high for channel 0 + + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Channel 1: + /// ----------------------------------------------------------------------- + /// - compare mode 1 is selected + /// - T12 modulation for output CC61 is enabled + /// - T13 modulation for output CC61 is disabled + /// - the trap functionality of the pin CC61 is disabled + /// - the compare output CC61 drives passive level while CC61ST is '0' + /// - the passive level of the output CC61 is '0' + /// - dead time generation is enabled + + /// - generation interrupt on flag ICC61R is disabled + /// - generation interrupt on flag ICC61F is disabled + + CCU6_CC61SRL = 0x60; // load CCU6 capture/compare shadow register + // low for channel 1 + CCU6_CC61SRH = 0x09; // load CCU6 capture/compare shadow register + // high for channel 1 + + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Channel 2: + /// ----------------------------------------------------------------------- + /// - channel 2 is disabled + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 Channel 3: + /// ----------------------------------------------------------------------- + /// - T13 output is not inverted + + + CCU6_CC63SRL = 0x00; // load CCU6 capture/compare shadow register + // low for channel 3 + CCU6_CC63SRH = 0x00; // load CCU6 capture/compare shadow register + // high for channel 3 + + + /// ----------------------------------------------------------------------- + /// Configuration of Multi-Channel Mode Output Register + /// ----------------------------------------------------------------------- + + CCU6_MCMOUTSL = 0x00; // load CCU6 multi channel mode output + // control register low + CCU6_MCMOUTSH = 0x00; // load CCU6 multi channel mode output + // control register high + + SFR_PAGE(_cc2, noSST); // switch to page 2 + + /// ----------------------------------------------------------------------- + /// Configuration of Timer Control Register + /// ----------------------------------------------------------------------- + + CCU6_TCTR2L = 0x00; // load CCU6 timer control register 2 low + CCU6_TCTR2H = 0x00; // load CCU6 timer control register 2 high + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 trap control: + /// ----------------------------------------------------------------------- + /// - a trap can only be generated by SW by setting the bit TRPF + /// - the trap state is left when a zero-match of T12 (while counting up) + /// is detected (synchronization to T12) + /// - bit TRPF is automatically cleared by HW (according to TRPPEN, TRPM0 + /// and TRPM1) + /// - trap interrupt is disabled + + CCU6_TRPCTRL = 0x00; // load CCU6 trap control register low + CCU6_TRPCTRH = 0x00; // load CCU6 trap control register high + + /// ----------------------------------------------------------------------- + /// Configuration of Multi Channel Mode: + /// ----------------------------------------------------------------------- + /// - multi channel mode is disabled + + CCU6_MODCTRL = 0x05; // load CCU6 modulation control register low + CCU6_MODCTRH = 0x00; // load CCU6 modulation control register high + + /// ----------------------------------------------------------------------- + /// Configuration of Multi_Channel Mode Control Register + /// ----------------------------------------------------------------------- + + CCU6_MCMCTR = 0x00; // load CCU6 multi channel mode control + // register + + /// ----------------------------------------------------------------------- + /// Configuration of T12 Capture/Compare Mode Select Register + /// ----------------------------------------------------------------------- + + CCU6_T12MSELL = 0x11; // load CCU6 T12 campture/compare mode + // select register low + + CCU6_T12MSELH = 0x00; // load CCU6 T12 campture/compare mode + // select register high + /// ----------------------------------------------------------------------- + /// Configuration of Passive State Level Register + /// ----------------------------------------------------------------------- + + CCU6_PSLR = 0x00; // load CCU6 passive state level register low + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 interrupt control: + /// ----------------------------------------------------------------------- + /// - for channel 0 interrupts is node I0 selected + /// - for channel 1 interrupts is node I0 selected + /// - for channel 2 interrupts is node I0 selected + /// - for correct hall event interrupt is node I0 selected + /// - for error interrupts is node I0 selected + /// - for T12 interrupts is node I0 selected + /// - for T13 interrupts is node I0 selected + + CCU6_INPL = 0x00; // load CCU6 capture/compare interrupt node + // pointer register low + CCU6_INPH = 0x00; // load CCU6 capture/compare interrupt node + // pointer register high + + CCU6_IENL = 0x00; // load CCU6 capture/compare interrupt + // enable register low + CCU6_IENH = 0x00; // load CCU6 capture/compare interrupt + // enable register high + + SFR_PAGE(_cc3, noSST); // switch to page 3 + + /// ----------------------------------------------------------------------- + /// Configuration of Compare State Register + /// ----------------------------------------------------------------------- + + CCU6_CMPSTATH = 0x00; // load CCU6 compare status register high + + /// ----------------------------------------------------------------------- + /// Configuration of CCU6 module input signals: + /// ----------------------------------------------------------------------- + /// - signal CC60_0 is used as output + /// - signal CC61_2 is used as output + /// - signal CC62 is not used + /// - signal #CTRAP is not used + + CCU6_PISEL0L = 0x00; // load CCU6 Port Input Select Register 0 Low + + /// - signal CCPOS0 is not used + /// - signal CCPOS1 is not used + /// - signal CCPOS2 is not used + /// - signal T12HR is not used + + CCU6_PISEL0H = 0x3F; // load CCU6 Port Input Select Register 0 + // High + + /// - signal T13HR is not used + + CCU6_PISEL2 = 0x00; // load CCU6 Port Input Select Register 2 + + + /// Pin P3.0 is used as CC60_0 Output + /// Pin P3.1 is used as CC61_2 Output + + SFR_PAGE(_pp2, noSST); // switch to page 2 + + P3_ALTSEL0 |= 0x01; // set AltSel0 + P3_ALTSEL1 &= ~(ubyte)0x01; // set AltSel1 + + P3_ALTSEL0 &= ~(ubyte)0x02; // set AltSel0 + P3_ALTSEL1 |= 0x02; // set AltSel1 + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR |= 0x03; // set Direction as Output + + + /// ----------------------------------------------------------------------- + /// Configuration of the used CCU6 Channels Interrupts: + /// ----------------------------------------------------------------------- + /// - capture/compare interrupt node 0 is disabled + /// - capture/compare interrupt node 1 is disabled + /// - capture/compare interrupt node 2 is disabled + /// - capture/compare interrupt node 3 is disabled + + SFR_PAGE(_cc0, noSST); // switch to page 0 + + /// ----------------------------------------------------------------------- + /// Timer Control Register + /// ----------------------------------------------------------------------- + /// - enable shadow transfer to T12 and T13 + + CCU6_TCTR4L = 0x40; // load CCU6 timer control register 4 low + + CCU6_TCTR4H = 0x40; // load CCU6 timer control register 4 high + + /// Start timer settings + + CCU6_TCTR4L = 0x02; // start timer 12 + + CCU6_TCTR4H = 0x02; // start timer 13 + + // USER CODE BEGIN (Init,3) + + // USER CODE END + +} // End of function CC6_vInit + + +// USER CODE BEGIN (CCU6_General,10) + +// USER CODE END + diff --git a/CC6.H b/CC6.H new file mode 100644 index 0000000..e7f92f0 --- /dev/null +++ b/CC6.H @@ -0,0 +1,186 @@ +//**************************************************************************** +// @Module Capture / Compare Unit 6 (CCU6) +// @Filename CC6.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 CCU6 module. +// +//---------------------------------------------------------------------------- +// @Date 2025/3/28 16:46:42 +// +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,1) + +// USER CODE END + + + +#ifndef _CC6_H_ +#define _CC6_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// This parameter identifies CC6 timer 12 +#define CC6_TIMER_12 12 + +// This parameter identifies CC6 timer 13 +#define CC6_TIMER_13 13 + +// This parameter identifies CC6 channel 0 +#define CC6_CHANNEL_0 0 + +// This parameter identifies CC6 channel 1 +#define CC6_CHANNEL_1 1 + +// This parameter identifies CC6 channel 2 +#define CC6_CHANNEL_2 2 + +// This parameter identifies CC6 channel 3 +#define CC6_CHANNEL_3 3 + + +// USER CODE BEGIN (CCU6_Header,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (CCU6_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void CC6_vInit(void); + + +// USER CODE BEGIN (CCU6_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Macro CC6_vEnableShadowTransfer(TimerNr) +// +//---------------------------------------------------------------------------- +// @Description This macro enables the transfer from the shadow registers +// to the actual CC6 registers. +// +// The following definitions for TimerNr are available: +// CC6_TIMER_12 +// CC6_TIMER_13 +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters TimerNr: +// Name of the CC6 timer to be used +// +//---------------------------------------------------------------------------- +// @Date 2025/3/28 +// +//**************************************************************************** + +#define CC6_vEnableShadowTransfer(TimerNr) CC6_vEnableShadowTransfer_##TimerNr() +#define CC6_vEnableShadowTransfer_CC6_TIMER_12() CCU6_TCTR4L |= 0x40 +#define CC6_vEnableShadowTransfer_CC6_TIMER_13() CCU6_TCTR4H |= 0x40 + + +//**************************************************************************** +// @Macro CC6_vLoadChannelShadowRegister(RegName, uwValue) +// +//---------------------------------------------------------------------------- +// @Description This macro loads the selected CC6 channel shadow register +// with the parameter Value. +// +// The following definitions are available for RegName: +// CC6_CHANNEL_0 .. CC6_CHANNEL_3 (see @Defines in header file) +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters RegName: +// Name of the CC6 channel to be loaded +// @Parameters uwValue: +// 16-bit Value with which the CC6 shadow register is to be +// loaded +// +//---------------------------------------------------------------------------- +// @Date 2025/3/28 +// +//**************************************************************************** + +#define CC6_vLoadChannelShadowRegister(RegName, uwValue) CC6_vLoadChannelShadowRegister_##RegName(uwValue) +#define CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(uwValue) CCU6_CC60SRLH = uwValue +#define CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(uwValue) CCU6_CC61SRLH = uwValue +#define CC6_vLoadChannelShadowRegister_CC6_CHANNEL_2(uwValue) CCU6_CC62SRLH = uwValue +#define CC6_vLoadChannelShadowRegister_CC6_CHANNEL_3(uwValue) CCU6_CC63SRLH = uwValue + + +//**************************************************************************** +// @Interrupt Vectors +//**************************************************************************** + +// Shared interrupt vector definitions are defined in SHARED_INT.H + + +// USER CODE BEGIN (CCU6_Header,10) + +// USER CODE END + + +#endif // ifndef _CC6_H_