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