📄 lpc2000_can_driver.c
字号:
***Demo Function: Press 1 - simple communication ( GLOBAL ACC FILTER Bypass )\n\r\
*** Press 2 - communication with GLOBAL ACC FILTER\n\r\
*** Press 3 - communication with FULLCAN GLOBAL ACC FILTER\n\r\
\n\r";
const UInt8 Demo_Sent_Choice[]="\n\r\
***The Acceptance Filter is configured, you can try transmitting a message using an external CAN analyzer \n\r";
/****Enter your choice: 1 for ACC Bypass, 2 for ACC On\n\r";*/
const UInt8 Demo_Sent_Data[] = "\n\r\
***Total 88 bytes data (using 11 frames) will be transmitted by CAN1 to CAN BUS\n\r\
***Frame1: Data - 01,02,03,04,05,06,07,08 with Standard 11bits ID:0x020;\n\r\
***Frame2: Data - 11,12,13,14,15,16,17,18 with Standard 11bits ID:0x1BC;\n\r\
***Frame3: Data - 21,22,23,24,25,26,27,28 with Standard 11bits ID:0x255;\n\r\
***Frame4: Data - 31,32,33,34,35,36,37,38 with Standard 11bits ID:0x26F;\n\r\
***Frame5: Data - 41,42,43,44,45,46,47,48 with Standard 11bits ID:0x010;\n\r\
***Frame6: Data - 51,52,53,54,55,56,57,58 with Standard 11bits ID:0x1AC;\n\r\
***Frame7: Data - 61,62,63,64,65,66,67,68 with Standard 11bits ID:0x245;\n\r\
***Frame8: Data - 71,72,73,74,75,76,77,78 with Standard 11bits ID:0x25F;\n\r\
***Frame9: Data - 81,82,83,84,85,86,87,88 with Standard 11bits ID:0x310;\n\r\
***Frame10: Data - 91,92,93,94,95,96,97,98 with Extended 29bits ID:0x18EF101E ;\n\r\
***Frame11: Data - 11,22,33,44,55,66,77,88 with Extended 29bits ID:0x18EF1E10;\n\r\
\n\r";
const UInt8 Data_Sent_Start_or_Not[] = "\
***Start transmit now? Press y or Y - start\n\r\
*** Press n or N - Not start\
\n\r";
const UInt8 Rcv_Data_OK[] = "\n\r\
*** Communication Successful! data Rcved OK! From CAN BUS by CAN2: \
\n\r";
const UInt8 Acceptance_Filter_Tables[] = "\
*** Acceptance_Filter_Tables:\n\r\
*** LPC2000_CANDRIVER_SCC_2=1\n\r\
*** Idx Table SCC# Dis/En ID\n\r\
*** 0 Standard 2 0 0010H\n\r\
*** 1 Standard 2 0 01ACH\n\r\
*** 2 Standard 2 0 0245H\n\r\
*** 3 Standard 2 0 025FH\n\r\
*** 4 Std.Group 2 0 0300H-037FH\n\r\
*** 5 Std.Group 2 0 0400H-047FH\n\r\
*** 6 Extended 2 0 18EF101EH\n\r\
*** 7 Extended 2 0 18EF1E10H\n\r\
*** 8 Extended 2 0 18EFFF10H\n\r\
*** 9 Extended 2 0 18EFFFC2H\n\r\
*** 10 Ext.Group 2 0 00007700H-000077FFH\n\r\
*** 11 Ext.Group 2 0 000085F7H-00008802H\n\r\
\n\r";
const UInt8 FULLCAN_Acceptance_Filter_Tables[] = "\
*** Acceptance_Filter_Tables:\n\r\
*** LPC2000_CANDRIVER_SCC_2=1\n\r\
*** Idx Table SCC# Dis/En ID\n\r\
*** 0 FULLCAN 2 0 0020H\n\r\
*** 1 FULLCAN 2 0 01BCH\n\r\
*** 2 FULLCAN 2 0 0255H\n\r\
*** 3 FULLCAN 2 0 026FH\n\r\
*** 4 Standard 2 0 0010H\n\r\
*** 5 Standard 2 0 01ACH\n\r\
*** 6 Standard 2 0 0245H\n\r\
*** 7 Standard 2 0 025FH\n\r\
*** 8 Std.Group 2 0 0300H-037FH\n\r\
*** 9 Std.Group 2 0 0400H-047FH\n\r\
*** 10 Extended 2 0 18EF101EH\n\r\
*** 11 Extended 2 0 18EF1E10H\n\r\
*** 12 Extended 2 0 18EFFF10H\n\r\
*** 13 Extended 2 0 18EFFFC2H\n\r\
*** 14 Ext.Group 2 0 00007700H-000077FFH\n\r\
*** 15 Ext.Group 2 0 000085F7H-00008802H\n\r\
\n\r";
// **************************************************************************
// Local Functions Prototypes
// **************************************************************************
// **************************************************************************
//
// Implementation
//
// **************************************************************************
// **************************************************************************
// FUNCTION: lpc2000CANdriver_CANInit
//
// DESCRIPTION: Initialises the CAN Controller for channel 1,2,3,4
// - Enter the Reset Mode of the selected CAN Controller Unit
// - CAN Bit Timing
// - Enter Normal Operating Mode of the CAN Controller
//
// GLOBAL VARIABLES USED:
//
// PARAMETERS: canChannel: 1,2,3,4
// canBitrate: Register value, see also global.h for defines
//
// RETURN: CanStatusCode: Status of operation
//
// LPC2000_CANDRIVER_OK - successful
//
// **************************************************************************
CanStatusCode
lpc2000CANdriver_CANInit ( UInt32 canChannel,
UInt32 canBitrate )
{
switch (canChannel) // CAN Channel
{
case 1: // Enter Reset Mode
PCONP |= (1 << 13); // Enable clock to CAN1
CAN1MOD = CAN_RESET_MODE;
CAN1IER = 0; // Disable Receive Interrupt
CAN1GSR = 0; // Reset error counter when CANxMOD is in reset
CAN1BTR = canBitrate;
// Enter Operating Mode
CAN1MOD = CAN_OPERATING_MODE;
break;
case 2: // Enter Reset Mode
PCONP |= (1 << 14); // Enable clock to CAN2
//CAN operation is disabled, and writable registers can be written.
CAN2MOD = CAN_RESET_MODE;
CAN2IER = 0; // Disable Receive Interrupt
CAN2GSR = 0; // Reset error counter when CANxMOD is in reset
CAN2BTR = canBitrate;
// Enter Operating Mode
CAN2MOD = CAN_OPERATING_MODE;
break;
#ifdef LPC2000_CAN3
case 3: // Enter Reset Mode
C3MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
C3BTR = canBitrate;
// Enter Operating Mode
C3MOD = CAN_OPERATING_MODE;
break;
#endif
#ifdef LPC2000_CAN4
case 4: // Enter Reset Mode
C4MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
C4BTR = canBitrate;
// Enter Operating Mode
C4MOD = CAN_OPERATING_MODE;
break;
#endif
default:// wrong channel number
return (LPC2000_CANDRIVER_ERR_WRONG_CAN_CHANNEL_NUMBER);
}
return (LPC2000_CANDRIVER_OK);
} // lpc2000CANdriver_CANInit ()
// **************************************************************************
// FUNCTION: lpc2000CANdriver_SetACFMode
//
// DESCRIPTION: This function sets the Acceptance Filter mode
//
// GLOBAL VARIABLES USED: - -
//
// PARAMETERS: ACFMode: 0 = Acceptance Filter On
// 1 = Acceptance Filter Off (reset status)
// 3 = Acceptance Filter Bypass
// 4 = Acceptance Filter On + FullCAN Mode enabled
//
// RETURN: CanStatusCode: Status of operation
//
// LPC2000_CANDRIVER_OK - successful
//
// LPC2000_CANDRIVER_ERR - this mode is not supported
//
// **************************************************************************
CanStatusCode
lpc2000CANdriver_SetACFMode( UInt8 ACFMode )
{
switch (ACFMode)
{
case 0: // Acceptance Filter On
CAN_AFMR = 0x00000000;
// CAN_AFMR = 0x00000002;
break;
case 1: // Acceptance Filter Off
CAN_AFMR = 0x00000001;
break;
case 3: // Acceptance Filter Bypass
CAN_AFMR = 0x00000003;
break;
case 4: // Acceptance Filter FullCAN
CAN_AFMR = 0x00000004;
// CAN_AFMR = 0x00000006;
break;
default:// Not supported
return (LPC2000_CANDRIVER_ERR);
}
return (LPC2000_CANDRIVER_OK);
} // lpc2000CANdriver_SetACFMode()
// **************************************************************************
// FUNCTION: lpc2000CANdriver_SetCANMode
//
// DESCRIPTION: This function sets the CAN Controller mode
//
// GLOBAL VARIABLES USED:
//
// PARAMETERS: canChannel: 1,2,3,4
// CANMode : 0 = Operating Mode
// 1 = Reset Mode
// 2 = Listen Only Mode
// 4 = Self Test Mode
//
// RETURN: CanStatusCode: Status of operation
//
// LPC2000_CANDRIVER_OK - successful
//
// LPC2000_CANDRIVER_ERR - this mode is not supported
//
// **************************************************************************
CanStatusCode
lpc2000CANdriver_SetCANMode(UInt32 canChannel,
UInt8 CANMode )
{
UInt32 offset;
offset = (canChannel-1) * 0x00004000; //SCC0 match can1
//SCC=CAN-1
if ( (canChannel==0) || (canChannel>4))
{
return (LPC2000_CANDRIVER_ERR_WRONG_CAN_CHANNEL_NUMBER);
}
switch (CANMode)
{
case 0: // Operating Mode
OUTW((UInt32)&CAN1MOD + offset, CAN_OPERATING_MODE);
break;
case 1: // Reset Mode
OUTW((UInt32)&CAN1MOD + offset, CAN_RESET_MODE);
break;
case 2: // Listen Only Mode
OUTW((UInt32)&CAN1MOD + offset, CAN_RESET_MODE);
OUTW((UInt32)&CAN1MOD + offset, CAN_LISTENONLY_MODE);
break;
case 4: // Self Test Mode
OUTW((UInt32)&CAN1MOD + offset, CAN_RESET_MODE);
OUTW((UInt32)&CAN1MOD + offset, CAN_SELFTEST_MODE);
break;
default:// Not supported
return (LPC2000_CANDRIVER_ERR);
}
return (LPC2000_CANDRIVER_OK);
} // lpc2000CANdriver_SetACFMode()
// **************************************************************************
// FUNCTION: lpc2000CANdriver_PrepareTransmitMessage
//
// DESCRIPTION: This function loads a certain Transmit Buffer with message
// data
//
// GLOBAL VARIABLES USED:
//
// PARAMETERS:
//
// RETURN: CanStatusCode: Status of operation
//
// LPC2000_CANDRIVER_OK - successful
//
// LPC2000_CANDRIVER_ERR - transmit buffer not free
// - wrong channel
//
// **************************************************************************
CanStatusCode
lpc2000CANdriver_CertainTxBufTransmitMessage (UInt32 canChannel,
plpc2000CANdriver_TXObj_t pTransmitBuf,
UInt32 txbuffer)
{
UInt32 TransmitBufferStatus;
UInt32 Address_TFI_ID_DATA;
UInt32 Address_CMR;
UInt32 Address_GSR;
UInt32 TXB_Offset;
UInt32 TransmitBufferFree;
UInt8 Transmit_TxBuf_Start;
Print_Chars_to_Screen(LiuJiaju_Send1);
// UInt32 Temp_Transmit;
// pUInt32 pTemp_Transmit;
// Calculate address offset depending on selected tx buffer
TXB_Offset = ((txbuffer-1) * 0x10);
// Transmit start command for different txbuffer
switch (txbuffer)
{
case 1:
Transmit_TxBuf_Start = 0x21; // Transmit by Tx1, mornal mode
// Transmit_TxBuf_Start = 0x23; // Single transmit in spite of successful
// Transmit_TxBuf_Start = 0x30; // Self-Testing mode, CAN1MOD:STM should be "1"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -