247 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			247 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /**********************************************************************
 | |||
|  | * $Id$		lpc43xx_can.h			2011-06-02 | |||
|  | *//**
 | |||
|  | * @file		lpc43xx_can.h | |||
|  | * @brief	Contains all macro definitions and function prototypes | |||
|  | * 			support for CAN firmware library on lpc43xx | |||
|  | * @version	1.0 | |||
|  | * @date		02. June. 2011 | |||
|  | * @author	NXP MCU SW Application Team | |||
|  | * | |||
|  | * Copyright(C) 2011, NXP Semiconductor | |||
|  | * All rights reserved. | |||
|  | * | |||
|  | *********************************************************************** | |||
|  | * Software that is described herein is for illustrative purposes only | |||
|  | * which provides customers with programming information regarding the | |||
|  | * products. This software is supplied "AS IS" without any warranties. | |||
|  | * NXP Semiconductors assumes no responsibility or liability for the | |||
|  | * use of the software, conveys no license or title under any patent, | |||
|  | * copyright, or mask work right to the product. NXP Semiconductors | |||
|  | * reserves the right to make changes in the software without | |||
|  | * notification. NXP Semiconductors also make no representation or | |||
|  | * warranty that such application will be suitable for the specified | |||
|  | * use without further testing or modification. | |||
|  | * Permission to use, copy, modify, and distribute this software and its | |||
|  | * documentation is hereby granted, under NXP Semiconductors<EFBFBD> | |||
|  | * relevant copyright in the software, without fee, provided that it | |||
|  | * is used in conjunction with NXP Semiconductors microcontrollers.  This | |||
|  | * copyright, permission, and disclaimer notice must appear in all copies of | |||
|  | * this code. | |||
|  | **********************************************************************/ | |||
|  | 
 | |||
|  | /* Peripheral group ----------------------------------------------------------- */ | |||
|  | /** @defgroup C_CAN C_CAN (Controller Area Network)
 | |||
|  |  * @ingroup LPC4300CMSIS_FwLib_Drivers | |||
|  |  * @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | #ifndef __lpc43xx_CAN_H
 | |||
|  | #define __lpc43xx_CAN_H
 | |||
|  | 
 | |||
|  | /* Includes ------------------------------------------------------------------- */ | |||
|  | #include "LPC43xx.h"
 | |||
|  | #include "lpc_types.h"
 | |||
|  | 
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | extern "C" | |||
|  | { | |||
|  | #endif
 | |||
|  | 
 | |||
|  | /* Public Macros -------------------------------------------------------------- */ | |||
|  | /** @defgroup C_CAN_Public_Macros  C_CAN Public Macros
 | |||
|  |  * @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | /** In BASIC_MODE IF1 registers are used directly as TX buffer, IF2 registers are used as RX buffer.
 | |||
|  |  * If not BASIC_MODE use message objects and IF registers to communicate with message buffers | |||
|  |  */ | |||
|  | #define BASIC_MODE 		0
 | |||
|  | 
 | |||
|  | /** In Silent Mode, the CAN controller is able to receive valid data frames and valid remote
 | |||
|  |  * frames, but it sends only recessive bits on the CAN bus, and it cannot start a transmission | |||
|  |  */ | |||
|  | #define SILENT_MODE		0
 | |||
|  | 
 | |||
|  | /** In Loop-back Mode, the CAN Core treats its own transmitted messages as received messages
 | |||
|  |  * and stores them (if they pass acceptance filtering) into a Receive Buffer. | |||
|  |  */ | |||
|  | #define LOOPBACK_MODE	0
 | |||
|  | 
 | |||
|  | /** Enables receiving remote frame requests */ | |||
|  | #define REMOTE_ENABLE	1
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @} | |||
|  |  */ | |||
|  | 
 | |||
|  | /* Private Macros -------------------------------------------------------------- */ | |||
|  | /** @defgroup C_CAN_Private_Macros  C_CAN Private Macros
 | |||
|  |  * @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | /** MAX CAN message obj */ | |||
|  | #define CAN_MSG_OBJ_MAX			0x0020
 | |||
|  | /** MAX data length */ | |||
|  | #define CAN_DLC_MAX				8
 | |||
|  | 
 | |||
|  | /********************************************************************//**
 | |||
|  |  *  BRP+1 = Fpclk/(CANBitRate * QUANTAValue) | |||
|  |  * QUANTAValue = 1 + (Tseg1+1) + (Tseg2+1) | |||
|  |  * QUANTA value varies based on the Fpclk and sample point | |||
|  |  * e.g. (1) sample point is 87.5%, Fpclk is 48Mhz | |||
|  |  * the QUANTA should be 16 | |||
|  |  * 		(2) sample point is 90%, Fpclk is 12.5Mhz | |||
|  |  * the QUANTA should be 10 | |||
|  |  * 		 Fpclk = Fclk /APBDIV | |||
|  |  * or | |||
|  |  *  BitRate = Fcclk/(APBDIV * (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1)) | |||
|  |  */ | |||
|  | 
 | |||
|  | /*********************************************************************//**
 | |||
|  |  * @brief CAN Bit Timing Values definitions at 8Mhz | |||
|  |  **********************************************************************/ | |||
|  | /** Bitrate: 100K */ | |||
|  | #define CAN_BITRATE100K12MHZ           0x00004509
 | |||
|  | /** Bitrate: 125K */ | |||
|  | #define CAN_BITRATE125K12MHZ           0x00004507
 | |||
|  | /** Bitrate: 250K */ | |||
|  | #define CAN_BITRATE250K12MHZ           0x00004503
 | |||
|  | /** Bitrate: 500K */ | |||
|  | #define CAN_BITRATE500K12MHZ            0x00004501
 | |||
|  | /** Bitrate: 1000K */ | |||
|  | #define CAN_BITRATE1000K12MHZ          0x00004500
 | |||
|  | 
 | |||
|  | /*********************************************************************//**
 | |||
|  |  * @brief CAN Bit Timing Values definitions at 16Mhz | |||
|  |  **********************************************************************/ | |||
|  | /** Bitrate: 100K */ | |||
|  | #define CAN_BITRATE100K16MHZ          0x00005809
 | |||
|  | /** Bitrate: 125K */ | |||
|  | #define CAN_BITRATE125K16MHZ          0x00005807
 | |||
|  | /** Bitrate: 250K */ | |||
|  | #define CAN_BITRATE250K16MHZ          0x00005803
 | |||
|  | /** Bitrate: 500K */ | |||
|  | #define CAN_BITRATE500K16MHZ          0x00005801
 | |||
|  | 
 | |||
|  | 
 | |||
|  | /*********************************************************************//**
 | |||
|  |  * @brief CAN Bit Timing Values definitions at 24Mhz | |||
|  |  **********************************************************************/ | |||
|  | /** Bitrate: 100K */ | |||
|  | #define CAN_BITRATE100K24MHZ          0x00007E09
 | |||
|  | /** Bitrate: 125K */ | |||
|  | #define CAN_BITRATE125K24MHZ          0x0000450F
 | |||
|  | /** Bitrate: 250K */ | |||
|  | #define CAN_BITRATE250K24MHZ          0x00004507
 | |||
|  | /** Bitrate: 500K */ | |||
|  | #define CAN_BITRATE500K24MHZ          0x00004503
 | |||
|  | /** Bitrate: 1000K */ | |||
|  | #define CAN_BITRATE1000K24MHZ         0x00004501
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @} | |||
|  |  */ | |||
|  | 
 | |||
|  | 
 | |||
|  | /* Public Types --------------------------------------------------------------- */ | |||
|  | /** @defgroup CAN_Public_Types CAN Public Types
 | |||
|  |  * @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | /*********************************************************************//**
 | |||
|  |  * @brief CAN enumeration | |||
|  |  **********************************************************************/ | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief CAN interface register type definition | |||
|  |  */ | |||
|  | typedef enum CCAN_IFREG | |||
|  | { | |||
|  | 	CMDREQ = 0,				/**< Command request */ | |||
|  | 	CMDMSK = 1,				/**< Command mask */ | |||
|  | 	MSK1 = 2,				/**< Mask 1 */ | |||
|  | 	MSK2 = 3,				/**< Mask 2 */ | |||
|  | 	ARB1 = 4,				/**< Arbitration 1 */ | |||
|  | 	ARB2 = 5,				/**< Arbitration 2 */ | |||
|  | 	MCTRL = 6,				/**< Message control */ | |||
|  | 	DA1 = 7,				/**< Data A1 */ | |||
|  | 	DA2 = 8,				/**< Data A2 */ | |||
|  | 	DB1 = 9,				/**< Data B1 */ | |||
|  | 	DB2 = 10				/**< Data B2 */ | |||
|  | }CCAN_IFREG_Type; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief CAN Clock division rate type definition | |||
|  |  */ | |||
|  | typedef enum CCAN_CLKDIV | |||
|  | { | |||
|  | 	CLKDIV1		= 0, | |||
|  | 	CLKDIV2		= 1, | |||
|  | 	CLKDIV3		= 2, | |||
|  | 	CLKDIV5		= 3, | |||
|  | 	CLKDIV9		= 4, | |||
|  | 	CLKDIV17	= 5, | |||
|  | 	CLKDIV33	= 6, | |||
|  | 	CLKDIV65	= 7 | |||
|  | }CCAN_CLKDIV_Type; | |||
|  | 
 | |||
|  | 
 | |||
|  | /********************************************************************//**
 | |||
|  | * @brief Data structure definition for a CAN message | |||
|  | **********************************************************************/ | |||
|  | /**
 | |||
|  |  * @brief CAN message object structure | |||
|  |  */ | |||
|  | typedef struct | |||
|  | { | |||
|  |     uint32_t	id;		/**< ID of message, if bit 30 is set then this is extended frame */ | |||
|  |     uint32_t 	dlc;	/**< Message data length */ | |||
|  |     uint8_t	data[8]; 	/**< Message data */ | |||
|  | } message_object; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief CAN call-back function | |||
|  |  */ | |||
|  | typedef void (*MSG_CB)(uint32_t msg_no); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @} | |||
|  |  */ | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | /* Public Functions ----------------------------------------------------------- */ | |||
|  | /** @defgroup CAN_Public_Functions CAN Public Functions
 | |||
|  |  * @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | void CAN_IRQHandler (void); | |||
|  | void CAN_Init( uint32_t BitClk, CCAN_CLKDIV_Type ClkDiv , MSG_CB Tx_cb, MSG_CB Rx_cb); | |||
|  | 
 | |||
|  | void CAN_ConfigureRxMessageObjects( void ); | |||
|  | void CAN_RxInt_MessageProcess( uint8_t MsgObjNo ); | |||
|  | void CAN_TxInt_MessageProcess( uint8_t MsgObjNo ); | |||
|  | 
 | |||
|  | void CAN_Send(uint8_t msg_no, uint32_t *msg_ptr ); | |||
|  | void CAN_Recv(uint8_t msg_no, uint32_t *msg_ptr, Bool RemoteEnable); | |||
|  | void CAN_ReadMsg(uint32_t msg_no, message_object* buff); | |||
|  | /**
 | |||
|  |  * @} | |||
|  |  */ | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | } | |||
|  | #endif
 | |||
|  | 
 | |||
|  | 
 | |||
|  | #endif /* __lpc43xx_CAN_H */
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @} | |||
|  |  */ | |||
|  | /*****************************************************************************
 | |||
|  | **                            End Of File | |||
|  | ******************************************************************************/ |