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
							 | 
						|||
| 
								 | 
							
								******************************************************************************/
							 |