⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc2000_can_driver.c

📁 这是NXP公司的LPC2000系列ARM7内核处理器
💻 C
📖 第 1 页 / 共 4 页
字号:
\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 + -