📄 lpc2000_can_driver.c
字号:
\n\r";
const UInt8 Acceptance_Filter_Tables[] = "\
*** Acceptance_Filter_Tables:\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 00002288H\n\r\
*** 7 Extended 2 0 00003377H\n\r\
*** 8 Extended 2 0 00005566H\n\r\
*** 9 Extended 2 0 00006677H\n\r\
*** 10 Ext.Group 2 0 00007700H-000077FFH\n\r\
*** 11 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
CAN1MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
CAN1BTR = canBitrate;
// Enter Operating Mode
CAN1MOD = CAN_OPERATING_MODE;
break;
case 2: // Enter Reset Mode
CAN2MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
CAN2BTR = canBitrate;
// Enter Operating Mode
CAN2MOD = CAN_OPERATING_MODE;
break;
case 3: // Enter Reset Mode
CAN3MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
CAN3BTR = canBitrate;
// Enter Operating Mode
CAN3MOD = CAN_OPERATING_MODE;
break;
case 4: // Enter Reset Mode
CAN4MOD = CAN_RESET_MODE;
// Write into Bus Timing Register
CAN4BTR = canBitrate;
// Enter Operating Mode
CAN4MOD = CAN_OPERATING_MODE;
break;
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
CANAFMR = 0x00000000;
break;
case 1: // Acceptance Filter Off
CANAFMR = 0x00000001;
break;
case 3: // Acceptance Filter Bypass
CANAFMR = 0x00000003;
break;
case 4: // Acceptance Filter FullCAN
CANAFMR = 0x00000004;
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;
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;
// 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"
// Transmit_TxBuf_Start = 0x32; // Single Self-Testing mode
break;
case 2: Transmit_TxBuf_Start = 0x41; // Transmit by Tx2
// Transmit_TxBuf_Start = 0x43; // Single transmit in spite of successful
// Transmit_TxBuf_Start = 0x50; // Self-Testing mode, CAN1MOD:STM should be "1"
// Transmit_TxBuf_Start = 0x52; // Single Self-Testing mode
break;
case 3: Transmit_TxBuf_Start = 0x81; // Transmit by Tx3
// Transmit_TxBuf_Start = 0x83; // Single transmit in spite of successful
// Transmit_TxBuf_Start = 0x90; // Self-Testing mode, CAN1MOD:STM should be "1"
// Transmit_TxBuf_Start = 0x92; // Single Self-Testing mode
break;
default:return (LPC2000_CANDRIVER_ERR_WRONG_CAN_TxBUFFER_NUMBER);
break;
}
// Read Global Status Register
switch (canChannel)
{
case 1: TransmitBufferStatus = CAN1SR;
break;
case 2: TransmitBufferStatus = CAN2SR;
break;
case 3: TransmitBufferStatus = CAN3SR;
break;
case 4: TransmitBufferStatus = CAN4SR;
break;
default:return (LPC2000_CANDRIVER_ERR_WRONG_CAN_CHANNEL_NUMBER);
}
switch (txbuffer)
{
case 1: TransmitBufferFree = TransmitBufferStatus & 0x0000000C;
if (TransmitBufferFree == 0) // one of Two(TBS,TCS) fits will pass
{
return (LPC2000_CANDRIVER_ERR_TRANSMIT_BUFFER1_NOT_FREE);
}
break;
case 2: TransmitBufferFree = TransmitBufferStatus & 0x00000C00;
if (TransmitBufferFree == 0)
{
return (LPC2000_CANDRIVER_ERR_TRANSMIT_BUFFER2_NOT_FREE);
}
break;
case 3: TransmitBufferFree = TransmitBufferStatus & 0x000C0000;
if (TransmitBufferFree == 0)
{
return (LPC2000_CANDRIVER_ERR_TRANSMIT_BUFFER3_NOT_FREE);
}
break;
default:// wrong txbuffer number
return (LPC2000_CANDRIVER_ERR);
}
switch (canChannel) // CAN Channel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -