NXP's driver library for LPC17xx, ported to mbed's online compiler. Not tested! I had to fix a lot of warings and found a couple of pretty obvious bugs, so the chances are there are more. Original: http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip

Dependencies:   mbed

Committer:
igorsk
Date:
Wed Feb 17 16:22:39 2010 +0000
Revision:
0:1063a091a062

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:1063a091a062 1 /***********************************************************************//**
igorsk 0:1063a091a062 2 * @file : lpc17xx_can.h
igorsk 0:1063a091a062 3 * @brief : Contains all macro definitions and function prototypes
igorsk 0:1063a091a062 4 * support for CAN firmware library on LPC17xx
igorsk 0:1063a091a062 5 * @version : 1.0
igorsk 0:1063a091a062 6 * @date : 1.June.2009
igorsk 0:1063a091a062 7 * @author : NguyenCao
igorsk 0:1063a091a062 8 **************************************************************************
igorsk 0:1063a091a062 9 * Software that is described herein is for illustrative purposes only
igorsk 0:1063a091a062 10 * which provides customers with programming information regarding the
igorsk 0:1063a091a062 11 * products. This software is supplied "AS IS" without any warranties.
igorsk 0:1063a091a062 12 * NXP Semiconductors assumes no responsibility or liability for the
igorsk 0:1063a091a062 13 * use of the software, conveys no license or title under any patent,
igorsk 0:1063a091a062 14 * copyright, or mask work right to the product. NXP Semiconductors
igorsk 0:1063a091a062 15 * reserves the right to make changes in the software without
igorsk 0:1063a091a062 16 * notification. NXP Semiconductors also make no representation or
igorsk 0:1063a091a062 17 * warranty that such application will be suitable for the specified
igorsk 0:1063a091a062 18 * use without further testing or modification.
igorsk 0:1063a091a062 19 **************************************************************************/
igorsk 0:1063a091a062 20
igorsk 0:1063a091a062 21 /* Peripheral group ----------------------------------------------------------- */
igorsk 0:1063a091a062 22 /** @defgroup CAN
igorsk 0:1063a091a062 23 * @ingroup LPC1700CMSIS_FwLib_Drivers
igorsk 0:1063a091a062 24 * @{
igorsk 0:1063a091a062 25 */
igorsk 0:1063a091a062 26
igorsk 0:1063a091a062 27 #ifndef LPC17XX_CAN_H_
igorsk 0:1063a091a062 28 #define LPC17XX_CAN_H_
igorsk 0:1063a091a062 29
igorsk 0:1063a091a062 30 /* Includes ------------------------------------------------------------------- */
igorsk 0:1063a091a062 31 #include "cmsis.h"
igorsk 0:1063a091a062 32 #include "lpc_types.h"
igorsk 0:1063a091a062 33
igorsk 0:1063a091a062 34 #ifdef __cplusplus
igorsk 0:1063a091a062 35 extern "C"
igorsk 0:1063a091a062 36 {
igorsk 0:1063a091a062 37 #endif
igorsk 0:1063a091a062 38
igorsk 0:1063a091a062 39
igorsk 0:1063a091a062 40 /* Private Macros ------------------------------------------------------------- */
igorsk 0:1063a091a062 41 /** @defgroup CAN_Private_Macros
igorsk 0:1063a091a062 42 * @{
igorsk 0:1063a091a062 43 */
igorsk 0:1063a091a062 44
igorsk 0:1063a091a062 45 #define ID_11 1
igorsk 0:1063a091a062 46 #define MAX_HW_FULLCAN_OBJ 64
igorsk 0:1063a091a062 47 #define MAX_SW_FULLCAN_OBJ 32
igorsk 0:1063a091a062 48
igorsk 0:1063a091a062 49
igorsk 0:1063a091a062 50 /** @defgroup CAN_REGISTER_BIT_DEFINITION
igorsk 0:1063a091a062 51 * @{
igorsk 0:1063a091a062 52 */
igorsk 0:1063a091a062 53
igorsk 0:1063a091a062 54 /** CAN Reset mode */
igorsk 0:1063a091a062 55 #define CAN_MOD_RM ((uint32_t)(1))
igorsk 0:1063a091a062 56 /** CAN Listen Only Mode */
igorsk 0:1063a091a062 57 #define CAN_MOD_LOM ((uint32_t)(1<<1))
igorsk 0:1063a091a062 58 /** CAN Self Test mode */
igorsk 0:1063a091a062 59 #define CAN_MOD_STM ((uint32_t)(1<<2))
igorsk 0:1063a091a062 60 /** CAN Transmit Priority mode */
igorsk 0:1063a091a062 61 #define CAN_MOD_TPM ((uint32_t)(1<<3))
igorsk 0:1063a091a062 62 /** CAN Sleep mode */
igorsk 0:1063a091a062 63 #define CAN_MOD_SM ((uint32_t)(1<<4))
igorsk 0:1063a091a062 64 /** CAN Receive Polarity mode */
igorsk 0:1063a091a062 65 #define CAN_MOD_RPM ((uint32_t)(1<<5))
igorsk 0:1063a091a062 66 /** CAN Test mode */
igorsk 0:1063a091a062 67 #define CAN_MOD_TM ((uint32_t)(1<<7))
igorsk 0:1063a091a062 68 /*********************************************************************//**
igorsk 0:1063a091a062 69 * Macro defines for CAN Command Register
igorsk 0:1063a091a062 70 **********************************************************************/
igorsk 0:1063a091a062 71 /** CAN Transmission Request */
igorsk 0:1063a091a062 72 #define CAN_CMR_TR ((uint32_t)(1))
igorsk 0:1063a091a062 73 /** CAN Abort Transmission */
igorsk 0:1063a091a062 74 #define CAN_CMR_AT ((uint32_t)(1<<1))
igorsk 0:1063a091a062 75 /** CAN Release Receive Buffer */
igorsk 0:1063a091a062 76 #define CAN_CMR_RRB ((uint32_t)(1<<2))
igorsk 0:1063a091a062 77 /** CAN Clear Data Overrun */
igorsk 0:1063a091a062 78 #define CAN_CMR_CDO ((uint32_t)(1<<3))
igorsk 0:1063a091a062 79 /** CAN Self Reception Request */
igorsk 0:1063a091a062 80 #define CAN_CMR_SRR ((uint32_t)(1<<4))
igorsk 0:1063a091a062 81 /** CAN Select Tx Buffer 1 */
igorsk 0:1063a091a062 82 #define CAN_CMR_STB1 ((uint32_t)(1<<5))
igorsk 0:1063a091a062 83 /** CAN Select Tx Buffer 2 */
igorsk 0:1063a091a062 84 #define CAN_CMR_STB2 ((uint32_t)(1<<6))
igorsk 0:1063a091a062 85 /** CAN Select Tx Buffer 3 */
igorsk 0:1063a091a062 86 #define CAN_CMR_STB3 ((uint32_t)(1<<7))
igorsk 0:1063a091a062 87
igorsk 0:1063a091a062 88 /*********************************************************************//**
igorsk 0:1063a091a062 89 * Macro defines for CAN Global Status Register
igorsk 0:1063a091a062 90 **********************************************************************/
igorsk 0:1063a091a062 91 /** CAN Receive Buffer Status */
igorsk 0:1063a091a062 92 #define CAN_GSR_RBS ((uint32_t)(1))
igorsk 0:1063a091a062 93 /** CAN Data Overrun Status */
igorsk 0:1063a091a062 94 #define CAN_GSR_DOS ((uint32_t)(1<<1))
igorsk 0:1063a091a062 95 /** CAN Transmit Buffer Status */
igorsk 0:1063a091a062 96 #define CAN_GSR_TBS ((uint32_t)(1<<2))
igorsk 0:1063a091a062 97 /** CAN Transmit Complete Status */
igorsk 0:1063a091a062 98 #define CAN_GSR_TCS ((uint32_t)(1<<3))
igorsk 0:1063a091a062 99 /** CAN Receive Status */
igorsk 0:1063a091a062 100 #define CAN_GSR_RS ((uint32_t)(1<<4))
igorsk 0:1063a091a062 101 /** CAN Transmit Status */
igorsk 0:1063a091a062 102 #define CAN_GSR_TS ((uint32_t)(1<<5))
igorsk 0:1063a091a062 103 /** CAN Error Status */
igorsk 0:1063a091a062 104 #define CAN_GSR_ES ((uint32_t)(1<<6))
igorsk 0:1063a091a062 105 /** CAN Bus Status */
igorsk 0:1063a091a062 106 #define CAN_GSR_BS ((uint32_t)(1<<7))
igorsk 0:1063a091a062 107 /** CAN Current value of the Rx Error Counter */
igorsk 0:1063a091a062 108 #define CAN_GSR_RXERR(n) ((uint32_t)((n&0xFF)<<16))
igorsk 0:1063a091a062 109 /** CAN Current value of the Tx Error Counter */
igorsk 0:1063a091a062 110 #define CAN_GSR_TXERR(n) ((uint32_t)(n&0xFF)<<24))
igorsk 0:1063a091a062 111
igorsk 0:1063a091a062 112 /*********************************************************************//**
igorsk 0:1063a091a062 113 * Macro defines for CAN Interrupt and Capture Register
igorsk 0:1063a091a062 114 **********************************************************************/
igorsk 0:1063a091a062 115 /** CAN Receive Interrupt */
igorsk 0:1063a091a062 116 #define CAN_ICR_RI ((uint32_t)(1))
igorsk 0:1063a091a062 117 /** CAN Transmit Interrupt 1 */
igorsk 0:1063a091a062 118 #define CAN_ICR_TI1 ((uint32_t)(1<<1))
igorsk 0:1063a091a062 119 /** CAN Error Warning Interrupt */
igorsk 0:1063a091a062 120 #define CAN_ICR_EI ((uint32_t)(1<<2))
igorsk 0:1063a091a062 121 /** CAN Data Overrun Interrupt */
igorsk 0:1063a091a062 122 #define CAN_ICR_DOI ((uint32_t)(1<<3))
igorsk 0:1063a091a062 123 /** CAN Wake-Up Interrupt */
igorsk 0:1063a091a062 124 #define CAN_ICR_WUI ((uint32_t)(1<<4))
igorsk 0:1063a091a062 125 /** CAN Error Passive Interrupt */
igorsk 0:1063a091a062 126 #define CAN_ICR_EPI ((uint32_t)(1<<5))
igorsk 0:1063a091a062 127 /** CAN Arbitration Lost Interrupt */
igorsk 0:1063a091a062 128 #define CAN_ICR_ALI ((uint32_t)(1<<6))
igorsk 0:1063a091a062 129 /** CAN Bus Error Interrupt */
igorsk 0:1063a091a062 130 #define CAN_ICR_BEI ((uint32_t)(1<<7))
igorsk 0:1063a091a062 131 /** CAN ID Ready Interrupt */
igorsk 0:1063a091a062 132 #define CAN_ICR_IDI ((uint32_t)(1<<8))
igorsk 0:1063a091a062 133 /** CAN Transmit Interrupt 2 */
igorsk 0:1063a091a062 134 #define CAN_ICR_TI2 ((uint32_t)(1<<9))
igorsk 0:1063a091a062 135 /** CAN Transmit Interrupt 3 */
igorsk 0:1063a091a062 136 #define CAN_ICR_TI3 ((uint32_t)(1<<10))
igorsk 0:1063a091a062 137 /** CAN Error Code Capture */
igorsk 0:1063a091a062 138 #define CAN_ICR_ERRBIT(n) ((uint32_t)((n&0x1F)<<16))
igorsk 0:1063a091a062 139 /** CAN Error Direction */
igorsk 0:1063a091a062 140 #define CAN_ICR_ERRDIR ((uint32_t)(1<<21))
igorsk 0:1063a091a062 141 /** CAN Error Capture */
igorsk 0:1063a091a062 142 #define CAN_ICR_ERRC(n) ((uint32_t)((n&0x3)<<22))
igorsk 0:1063a091a062 143 /** CAN Arbitration Lost Capture */
igorsk 0:1063a091a062 144 #define CAN_ICR_ALCBIT(n) ((uint32_t)((n&0xFF)<<24))
igorsk 0:1063a091a062 145
igorsk 0:1063a091a062 146 /*********************************************************************//**
igorsk 0:1063a091a062 147 * Macro defines for CAN Interrupt Enable Register
igorsk 0:1063a091a062 148 **********************************************************************/
igorsk 0:1063a091a062 149 /** CAN Receive Interrupt Enable */
igorsk 0:1063a091a062 150 #define CAN_IER_RIE ((uint32_t)(1))
igorsk 0:1063a091a062 151 /** CAN Transmit Interrupt Enable for buffer 1 */
igorsk 0:1063a091a062 152 #define CAN_IER_TIE1 ((uint32_t)(1<<1))
igorsk 0:1063a091a062 153 /** CAN Error Warning Interrupt Enable */
igorsk 0:1063a091a062 154 #define CAN_IER_EIE ((uint32_t)(1<<2))
igorsk 0:1063a091a062 155 /** CAN Data Overrun Interrupt Enable */
igorsk 0:1063a091a062 156 #define CAN_IER_DOIE ((uint32_t)(1<<3))
igorsk 0:1063a091a062 157 /** CAN Wake-Up Interrupt Enable */
igorsk 0:1063a091a062 158 #define CAN_IER_WUIE ((uint32_t)(1<<4))
igorsk 0:1063a091a062 159 /** CAN Error Passive Interrupt Enable */
igorsk 0:1063a091a062 160 #define CAN_IER_EPIE ((uint32_t)(1<<5))
igorsk 0:1063a091a062 161 /** CAN Arbitration Lost Interrupt Enable */
igorsk 0:1063a091a062 162 #define CAN_IER_ALIE ((uint32_t)(1<<6))
igorsk 0:1063a091a062 163 /** CAN Bus Error Interrupt Enable */
igorsk 0:1063a091a062 164 #define CAN_IER_BEIE ((uint32_t)(1<<7))
igorsk 0:1063a091a062 165 /** CAN ID Ready Interrupt Enable */
igorsk 0:1063a091a062 166 #define CAN_IER_IDIE ((uint32_t)(1<<8))
igorsk 0:1063a091a062 167 /** CAN Transmit Enable Interrupt for Buffer 2 */
igorsk 0:1063a091a062 168 #define CAN_IER_TIE2 ((uint32_t)(1<<9))
igorsk 0:1063a091a062 169 /** CAN Transmit Enable Interrupt for Buffer 3 */
igorsk 0:1063a091a062 170 #define CAN_IER_TIE3 ((uint32_t)(1<<10))
igorsk 0:1063a091a062 171
igorsk 0:1063a091a062 172 /*********************************************************************//**
igorsk 0:1063a091a062 173 * Macro defines for CAN Bus Timing Register
igorsk 0:1063a091a062 174 **********************************************************************/
igorsk 0:1063a091a062 175 /** CAN Baudrate Prescaler */
igorsk 0:1063a091a062 176 #define CAN_BTR_BRP(n) ((uint32_t)(n&0x3FF))
igorsk 0:1063a091a062 177 /** CAN Synchronization Jump Width */
igorsk 0:1063a091a062 178 #define CAN_BTR_SJM(n) ((uint32_t)((n&0x3)<<14))
igorsk 0:1063a091a062 179 /** CAN Time Segment 1 */
igorsk 0:1063a091a062 180 #define CAN_BTR_TESG1(n) ((uint32_t)(n&0xF)<<16))
igorsk 0:1063a091a062 181 /** CAN Time Segment 2 */
igorsk 0:1063a091a062 182 #define CAN_BTR_TESG2(n) ((uint32_t)(n&0xF)<<20))
igorsk 0:1063a091a062 183 /** CAN Sampling */
igorsk 0:1063a091a062 184 #define CAN_BTR_SAM(n) ((uint32_t)(1<<23))
igorsk 0:1063a091a062 185
igorsk 0:1063a091a062 186 /*********************************************************************//**
igorsk 0:1063a091a062 187 * Macro defines for CAN Error Warning Limit Register
igorsk 0:1063a091a062 188 **********************************************************************/
igorsk 0:1063a091a062 189 /** CAN Error Warning Limit */
igorsk 0:1063a091a062 190 #define CAN_EWL_EWL(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 191
igorsk 0:1063a091a062 192 /*********************************************************************//**
igorsk 0:1063a091a062 193 * Macro defines for CAN Status Register
igorsk 0:1063a091a062 194 **********************************************************************/
igorsk 0:1063a091a062 195 /** CAN Receive Buffer Status */
igorsk 0:1063a091a062 196 #define CAN_SR_RBS ((uint32_t)(1))
igorsk 0:1063a091a062 197 /** CAN Data Overrun Status */
igorsk 0:1063a091a062 198 #define CAN_SR_DOS ((uint32_t)(1<<1))
igorsk 0:1063a091a062 199 /** CAN Transmit Buffer Status 1 */
igorsk 0:1063a091a062 200 #define CAN_SR_TBS1 ((uint32_t)(1<<2))
igorsk 0:1063a091a062 201 /** CAN Transmission Complete Status of Buffer 1 */
igorsk 0:1063a091a062 202 #define CAN_SR_TCS1 ((uint32_t)(1<<3))
igorsk 0:1063a091a062 203 /** CAN Receive Status */
igorsk 0:1063a091a062 204 #define CAN_SR_RS ((uint32_t)(1<<4))
igorsk 0:1063a091a062 205 /** CAN Transmit Status 1 */
igorsk 0:1063a091a062 206 #define CAN_SR_TS1 ((uint32_t)(1<<5))
igorsk 0:1063a091a062 207 /** CAN Error Status */
igorsk 0:1063a091a062 208 #define CAN_SR_ES ((uint32_t)(1<<6))
igorsk 0:1063a091a062 209 /** CAN Bus Status */
igorsk 0:1063a091a062 210 #define CAN_SR_BS ((uint32_t)(1<<7))
igorsk 0:1063a091a062 211 /** CAN Transmit Buffer Status 2 */
igorsk 0:1063a091a062 212 #define CAN_SR_TBS2 ((uint32_t)(1<<10))
igorsk 0:1063a091a062 213 /** CAN Transmission Complete Status of Buffer 2 */
igorsk 0:1063a091a062 214 #define CAN_SR_TCS2 ((uint32_t)(1<<11))
igorsk 0:1063a091a062 215 /** CAN Transmit Status 2 */
igorsk 0:1063a091a062 216 #define CAN_SR_TS2 ((uint32_t)(1<<13))
igorsk 0:1063a091a062 217 /** CAN Transmit Buffer Status 2 */
igorsk 0:1063a091a062 218 #define CAN_SR_TBS3 ((uint32_t)(1<<18))
igorsk 0:1063a091a062 219 /** CAN Transmission Complete Status of Buffer 2 */
igorsk 0:1063a091a062 220 #define CAN_SR_TCS3 ((uint32_t)(1<<19))
igorsk 0:1063a091a062 221 /** CAN Transmit Status 2 */
igorsk 0:1063a091a062 222 #define CAN_SR_TS3 ((uint32_t)(1<<21))
igorsk 0:1063a091a062 223
igorsk 0:1063a091a062 224 /*********************************************************************//**
igorsk 0:1063a091a062 225 * Macro defines for CAN Receive Frame Status Register
igorsk 0:1063a091a062 226 **********************************************************************/
igorsk 0:1063a091a062 227 /** CAN ID Index */
igorsk 0:1063a091a062 228 #define CAN_RFS_ID_INDEX(n) ((uint32_t)(n&0x3FF))
igorsk 0:1063a091a062 229 /** CAN Bypass */
igorsk 0:1063a091a062 230 #define CAN_RFS_BP ((uint32_t)(1<<10))
igorsk 0:1063a091a062 231 /** CAN Data Length Code */
igorsk 0:1063a091a062 232 #define CAN_RFS_DLC(n) ((uint32_t)((n&0xF)<<16)
igorsk 0:1063a091a062 233 /** CAN Remote Transmission Request */
igorsk 0:1063a091a062 234 #define CAN_RFS_RTR ((uint32_t)(1<<30))
igorsk 0:1063a091a062 235 /** CAN control 11 bit or 29 bit Identifier */
igorsk 0:1063a091a062 236 #define CAN_RFS_FF ((uint32_t)(1<<31))
igorsk 0:1063a091a062 237
igorsk 0:1063a091a062 238 /*********************************************************************//**
igorsk 0:1063a091a062 239 * Macro defines for CAN Receive Identifier Register
igorsk 0:1063a091a062 240 **********************************************************************/
igorsk 0:1063a091a062 241 /** CAN 11 bit Identifier */
igorsk 0:1063a091a062 242 #define CAN_RID_ID_11(n) ((uint32_t)(n&0x7FF))
igorsk 0:1063a091a062 243 /** CAN 29 bit Identifier */
igorsk 0:1063a091a062 244 #define CAN_RID_ID_29(n) ((uint32_t)(n&0x1FFFFFFF))
igorsk 0:1063a091a062 245
igorsk 0:1063a091a062 246 /*********************************************************************//**
igorsk 0:1063a091a062 247 * Macro defines for CAN Receive Data A Register
igorsk 0:1063a091a062 248 **********************************************************************/
igorsk 0:1063a091a062 249 /** CAN Receive Data 1 */
igorsk 0:1063a091a062 250 #define CAN_RDA_DATA1(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 251 /** CAN Receive Data 2 */
igorsk 0:1063a091a062 252 #define CAN_RDA_DATA2(n) ((uint32_t)((n&0xFF)<<8))
igorsk 0:1063a091a062 253 /** CAN Receive Data 3 */
igorsk 0:1063a091a062 254 #define CAN_RDA_DATA3(n) ((uint32_t)((n&0xFF)<<16))
igorsk 0:1063a091a062 255 /** CAN Receive Data 4 */
igorsk 0:1063a091a062 256 #define CAN_RDA_DATA4(n) ((uint32_t)((n&0xFF)<<24))
igorsk 0:1063a091a062 257
igorsk 0:1063a091a062 258 /*********************************************************************//**
igorsk 0:1063a091a062 259 * Macro defines for CAN Receive Data B Register
igorsk 0:1063a091a062 260 **********************************************************************/
igorsk 0:1063a091a062 261 /** CAN Receive Data 5 */
igorsk 0:1063a091a062 262 #define CAN_RDB_DATA5(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 263 /** CAN Receive Data 6 */
igorsk 0:1063a091a062 264 #define CAN_RDB_DATA6(n) ((uint32_t)((n&0xFF)<<8))
igorsk 0:1063a091a062 265 /** CAN Receive Data 7 */
igorsk 0:1063a091a062 266 #define CAN_RDB_DATA7(n) ((uint32_t)((n&0xFF)<<16))
igorsk 0:1063a091a062 267 /** CAN Receive Data 8 */
igorsk 0:1063a091a062 268 #define CAN_RDB_DATA8(n) ((uint32_t)((n&0xFF)<<24))
igorsk 0:1063a091a062 269
igorsk 0:1063a091a062 270 /*********************************************************************//**
igorsk 0:1063a091a062 271 * Macro defines for CAN Transmit Frame Information Register
igorsk 0:1063a091a062 272 **********************************************************************/
igorsk 0:1063a091a062 273 /** CAN Priority */
igorsk 0:1063a091a062 274 #define CAN_TFI_PRIO(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 275 /** CAN Data Length Code */
igorsk 0:1063a091a062 276 #define CAN_TFI_DLC(n) ((uint32_t)((n&0xF)<<16))
igorsk 0:1063a091a062 277 /** CAN Remote Frame Transmission */
igorsk 0:1063a091a062 278 #define CAN_TFI_RTR ((uint32_t)(1<<30))
igorsk 0:1063a091a062 279 /** CAN control 11-bit or 29-bit Identifier */
igorsk 0:1063a091a062 280 #define CAN_TFI_FF ((uint32_t)(1<<31))
igorsk 0:1063a091a062 281
igorsk 0:1063a091a062 282 /*********************************************************************//**
igorsk 0:1063a091a062 283 * Macro defines for CAN Transmit Identifier Register
igorsk 0:1063a091a062 284 **********************************************************************/
igorsk 0:1063a091a062 285 /** CAN 11-bit Identifier */
igorsk 0:1063a091a062 286 #define CAN_TID_ID11(n) ((uint32_t)(n&0x7FF))
igorsk 0:1063a091a062 287 /** CAN 11-bit Identifier */
igorsk 0:1063a091a062 288 #define CAN_TID_ID29(n) ((uint32_t)(n&0x1FFFFFFF))
igorsk 0:1063a091a062 289
igorsk 0:1063a091a062 290 /*********************************************************************//**
igorsk 0:1063a091a062 291 * Macro defines for CAN Transmit Data A Register
igorsk 0:1063a091a062 292 **********************************************************************/
igorsk 0:1063a091a062 293 /** CAN Transmit Data 1 */
igorsk 0:1063a091a062 294 #define CAN_TDA_DATA1(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 295 /** CAN Transmit Data 2 */
igorsk 0:1063a091a062 296 #define CAN_TDA_DATA2(n) ((uint32_t)((n&0xFF)<<8))
igorsk 0:1063a091a062 297 /** CAN Transmit Data 3 */
igorsk 0:1063a091a062 298 #define CAN_TDA_DATA3(n) ((uint32_t)((n&0xFF)<<16))
igorsk 0:1063a091a062 299 /** CAN Transmit Data 4 */
igorsk 0:1063a091a062 300 #define CAN_TDA_DATA4(n) ((uint32_t)((n&0xFF)<<24))
igorsk 0:1063a091a062 301
igorsk 0:1063a091a062 302 /*********************************************************************//**
igorsk 0:1063a091a062 303 * Macro defines for CAN Transmit Data B Register
igorsk 0:1063a091a062 304 **********************************************************************/
igorsk 0:1063a091a062 305 /** CAN Transmit Data 5 */
igorsk 0:1063a091a062 306 #define CAN_TDA_DATA5(n) ((uint32_t)(n&0xFF))
igorsk 0:1063a091a062 307 /** CAN Transmit Data 6 */
igorsk 0:1063a091a062 308 #define CAN_TDA_DATA6(n) ((uint32_t)((n&0xFF)<<8))
igorsk 0:1063a091a062 309 /** CAN Transmit Data 7 */
igorsk 0:1063a091a062 310 #define CAN_TDA_DATA7(n) ((uint32_t)((n&0xFF)<<16))
igorsk 0:1063a091a062 311 /** CAN Transmit Data 8 */
igorsk 0:1063a091a062 312 #define CAN_TDA_DATA8(n) ((uint32_t)((n&0xFF)<<24))
igorsk 0:1063a091a062 313
igorsk 0:1063a091a062 314 /*********************************************************************//**
igorsk 0:1063a091a062 315 * Macro defines for CAN Sleep Clear Register
igorsk 0:1063a091a062 316 **********************************************************************/
igorsk 0:1063a091a062 317 /** CAN1 Sleep mode */
igorsk 0:1063a091a062 318 #define CAN1SLEEPCLR ((uint32_t)(1<<1))
igorsk 0:1063a091a062 319 /** CAN2 Sleep Mode */
igorsk 0:1063a091a062 320 #define CAN2SLEEPCLR ((uint32_t)(1<<2))
igorsk 0:1063a091a062 321
igorsk 0:1063a091a062 322 /*********************************************************************//**
igorsk 0:1063a091a062 323 * Macro defines for CAN Wake up Flags Register
igorsk 0:1063a091a062 324 **********************************************************************/
igorsk 0:1063a091a062 325 /** CAN1 Sleep mode */
igorsk 0:1063a091a062 326 #define CAN_WAKEFLAGES_CAN1WAKE ((uint32_t)(1<<1))
igorsk 0:1063a091a062 327 /** CAN2 Sleep Mode */
igorsk 0:1063a091a062 328 #define CAN_WAKEFLAGES_CAN2WAKE ((uint32_t)(1<<2))
igorsk 0:1063a091a062 329
igorsk 0:1063a091a062 330 /*********************************************************************//**
igorsk 0:1063a091a062 331 * Macro defines for Central transmit Status Register
igorsk 0:1063a091a062 332 **********************************************************************/
igorsk 0:1063a091a062 333 /** CAN Transmit 1 */
igorsk 0:1063a091a062 334 #define CAN_TSR_TS1 ((uint32_t)(1))
igorsk 0:1063a091a062 335 /** CAN Transmit 2 */
igorsk 0:1063a091a062 336 #define CAN_TSR_TS2 ((uint32_t)(1<<1))
igorsk 0:1063a091a062 337 /** CAN Transmit Buffer Status 1 */
igorsk 0:1063a091a062 338 #define CAN_TSR_TBS1 ((uint32_t)(1<<8))
igorsk 0:1063a091a062 339 /** CAN Transmit Buffer Status 2 */
igorsk 0:1063a091a062 340 #define CAN_TSR_TBS2 ((uint32_t)(1<<9))
igorsk 0:1063a091a062 341 /** CAN Transmission Complete Status 1 */
igorsk 0:1063a091a062 342 #define CAN_TSR_TCS1 ((uint32_t)(1<<16))
igorsk 0:1063a091a062 343 /** CAN Transmission Complete Status 2 */
igorsk 0:1063a091a062 344 #define CAN_TSR_TCS2 ((uint32_t)(1<<17))
igorsk 0:1063a091a062 345
igorsk 0:1063a091a062 346 /*********************************************************************//**
igorsk 0:1063a091a062 347 * Macro defines for Central Receive Status Register
igorsk 0:1063a091a062 348 **********************************************************************/
igorsk 0:1063a091a062 349 /** CAN Receive Status 1 */
igorsk 0:1063a091a062 350 #define CAN_RSR_RS1 ((uint32_t)(1))
igorsk 0:1063a091a062 351 /** CAN Receive Status 1 */
igorsk 0:1063a091a062 352 #define CAN_RSR_RS2 ((uint32_t)(1<<1))
igorsk 0:1063a091a062 353 /** CAN Receive Buffer Status 1*/
igorsk 0:1063a091a062 354 #define CAN_RSR_RB1 ((uint32_t)(1<<8))
igorsk 0:1063a091a062 355 /** CAN Receive Buffer Status 2*/
igorsk 0:1063a091a062 356 #define CAN_RSR_RB2 ((uint32_t)(1<<9))
igorsk 0:1063a091a062 357 /** CAN Data Overrun Status 1 */
igorsk 0:1063a091a062 358 #define CAN_RSR_DOS1 ((uint32_t)(1<<16))
igorsk 0:1063a091a062 359 /** CAN Data Overrun Status 1 */
igorsk 0:1063a091a062 360 #define CAN_RSR_DOS2 ((uint32_t)(1<<17))
igorsk 0:1063a091a062 361
igorsk 0:1063a091a062 362 /*********************************************************************//**
igorsk 0:1063a091a062 363 * Macro defines for Central Miscellaneous Status Register
igorsk 0:1063a091a062 364 **********************************************************************/
igorsk 0:1063a091a062 365 /** Same CAN Error Status in CAN1GSR */
igorsk 0:1063a091a062 366 #define CAN_MSR_E1 ((uint32_t)(1))
igorsk 0:1063a091a062 367 /** Same CAN Error Status in CAN2GSR */
igorsk 0:1063a091a062 368 #define CAN_MSR_E2 ((uint32_t)(1<<1))
igorsk 0:1063a091a062 369 /** Same CAN Bus Status in CAN1GSR */
igorsk 0:1063a091a062 370 #define CAN_MSR_BS1 ((uint32_t)(1<<8))
igorsk 0:1063a091a062 371 /** Same CAN Bus Status in CAN2GSR */
igorsk 0:1063a091a062 372 #define CAN_MSR_BS2 ((uint32_t)(1<<9))
igorsk 0:1063a091a062 373
igorsk 0:1063a091a062 374 /*********************************************************************//**
igorsk 0:1063a091a062 375 * Macro defines for Acceptance Filter Mode Register
igorsk 0:1063a091a062 376 **********************************************************************/
igorsk 0:1063a091a062 377 /** CAN Acceptance Filter Off mode */
igorsk 0:1063a091a062 378 #define CAN_AFMR_AccOff ((uint32_t)(1))
igorsk 0:1063a091a062 379 /** CAN Acceptance File Bypass mode */
igorsk 0:1063a091a062 380 #define CAN_AFMR_AccBP ((uint32_t)(1<<1))
igorsk 0:1063a091a062 381 /** FullCAN Mode Enhancements */
igorsk 0:1063a091a062 382 #define CAN_AFMR_eFCAN ((uint32_t)(1<<2))
igorsk 0:1063a091a062 383
igorsk 0:1063a091a062 384 /*********************************************************************//**
igorsk 0:1063a091a062 385 * Macro defines for Standard Frame Individual Start Address Register
igorsk 0:1063a091a062 386 **********************************************************************/
igorsk 0:1063a091a062 387 /** The start address of the table of individual Standard Identifier */
igorsk 0:1063a091a062 388 #define CAN_STT_sa(n) ((uint32_t)((n&1FF)<<2))
igorsk 0:1063a091a062 389
igorsk 0:1063a091a062 390 /*********************************************************************//**
igorsk 0:1063a091a062 391 * Macro defines for Standard Frame Group Start Address Register
igorsk 0:1063a091a062 392 **********************************************************************/
igorsk 0:1063a091a062 393 /** The start address of the table of grouped Standard Identifier */
igorsk 0:1063a091a062 394 #define CAN_SFF_GRP_sa(n) ((uint32_t)((n&3FF)<<2))
igorsk 0:1063a091a062 395
igorsk 0:1063a091a062 396 /*********************************************************************//**
igorsk 0:1063a091a062 397 * Macro defines for Extended Frame Start Address Register
igorsk 0:1063a091a062 398 **********************************************************************/
igorsk 0:1063a091a062 399 /** The start address of the table of individual Extended Identifier */
igorsk 0:1063a091a062 400 #define CAN_EFF_sa(n) ((uint32_t)((n&1FF)<<2))
igorsk 0:1063a091a062 401
igorsk 0:1063a091a062 402 /*********************************************************************//**
igorsk 0:1063a091a062 403 * Macro defines for Extended Frame Group Start Address Register
igorsk 0:1063a091a062 404 **********************************************************************/
igorsk 0:1063a091a062 405 /** The start address of the table of grouped Extended Identifier */
igorsk 0:1063a091a062 406 #define CAN_Eff_GRP_sa(n) ((uint32_t)((n&3FF)<<2))
igorsk 0:1063a091a062 407
igorsk 0:1063a091a062 408 /*********************************************************************//**
igorsk 0:1063a091a062 409 * Macro defines for End Of AF Table Register
igorsk 0:1063a091a062 410 **********************************************************************/
igorsk 0:1063a091a062 411 /** The End of Table of AF LookUp Table */
igorsk 0:1063a091a062 412 #define CAN_EndofTable(n) ((uint32_t)((n&3FF)<<2))
igorsk 0:1063a091a062 413
igorsk 0:1063a091a062 414 /*********************************************************************//**
igorsk 0:1063a091a062 415 * Macro defines for LUT Error Address Register
igorsk 0:1063a091a062 416 **********************************************************************/
igorsk 0:1063a091a062 417 /** CAN Look-Up Table Error Address */
igorsk 0:1063a091a062 418 #define CAN_LUTerrAd(n) ((uint32_t)((n&1FF)<<2))
igorsk 0:1063a091a062 419
igorsk 0:1063a091a062 420 /*********************************************************************//**
igorsk 0:1063a091a062 421 * Macro defines for LUT Error Register
igorsk 0:1063a091a062 422 **********************************************************************/
igorsk 0:1063a091a062 423 /** CAN Look-Up Table Error */
igorsk 0:1063a091a062 424 #define CAN_LUTerr ((uint32_t)(1))
igorsk 0:1063a091a062 425
igorsk 0:1063a091a062 426 /*********************************************************************//**
igorsk 0:1063a091a062 427 * Macro defines for Global FullCANInterrupt Enable Register
igorsk 0:1063a091a062 428 **********************************************************************/
igorsk 0:1063a091a062 429 /** Global FullCANInterrupt Enable */
igorsk 0:1063a091a062 430 #define CAN_FCANIE ((uint32_t)(1))
igorsk 0:1063a091a062 431
igorsk 0:1063a091a062 432 /*********************************************************************//**
igorsk 0:1063a091a062 433 * Macro defines for FullCAN Interrupt and Capture Register 0
igorsk 0:1063a091a062 434 **********************************************************************/
igorsk 0:1063a091a062 435 /** FullCAN Interrupt and Capture (0-31)*/
igorsk 0:1063a091a062 436 #define CAN_FCANIC0_IntPnd(n) ((uint32_t)(1<<n))
igorsk 0:1063a091a062 437
igorsk 0:1063a091a062 438 /*********************************************************************//**
igorsk 0:1063a091a062 439 * Macro defines for FullCAN Interrupt and Capture Register 1
igorsk 0:1063a091a062 440 **********************************************************************/
igorsk 0:1063a091a062 441 /** FullCAN Interrupt and Capture (0-31)*/
igorsk 0:1063a091a062 442 #define CAN_FCANIC1_IntPnd(n) ((uint32_t)(1<<(n-32)))
igorsk 0:1063a091a062 443
igorsk 0:1063a091a062 444 /**
igorsk 0:1063a091a062 445 * @}
igorsk 0:1063a091a062 446 */
igorsk 0:1063a091a062 447
igorsk 0:1063a091a062 448 /**
igorsk 0:1063a091a062 449 * @}
igorsk 0:1063a091a062 450 */
igorsk 0:1063a091a062 451
igorsk 0:1063a091a062 452
igorsk 0:1063a091a062 453 /* Public Types --------------------------------------------------------------- */
igorsk 0:1063a091a062 454 /** @defgroup CAN_Public_Types
igorsk 0:1063a091a062 455 * @{
igorsk 0:1063a091a062 456 */
igorsk 0:1063a091a062 457
igorsk 0:1063a091a062 458 /** CAN configuration structure */
igorsk 0:1063a091a062 459 /***********************************************************************
igorsk 0:1063a091a062 460 * CAN device configuration commands (IOCTL commands and arguments)
igorsk 0:1063a091a062 461 **********************************************************************/
igorsk 0:1063a091a062 462 /**
igorsk 0:1063a091a062 463 * @brief CAN ID format definition
igorsk 0:1063a091a062 464 */
igorsk 0:1063a091a062 465 typedef enum {
igorsk 0:1063a091a062 466 STD_ID_FORMAT = 0, /**< Use standard ID format (11 bit ID) */
igorsk 0:1063a091a062 467 EXT_ID_FORMAT = 1 /**< Use extended ID format (29 bit ID) */
igorsk 0:1063a091a062 468 } CAN_ID_FORMAT_Type;
igorsk 0:1063a091a062 469
igorsk 0:1063a091a062 470 /**
igorsk 0:1063a091a062 471 * @brief AFLUT Entry type definition
igorsk 0:1063a091a062 472 */
igorsk 0:1063a091a062 473 typedef enum {
igorsk 0:1063a091a062 474 FULLCAN_ENTRY = 0,
igorsk 0:1063a091a062 475 EXPLICIT_STANDARD_ENTRY,
igorsk 0:1063a091a062 476 GROUP_STANDARD_ENTRY,
igorsk 0:1063a091a062 477 EXPLICIT_EXTEND_ENTRY,
igorsk 0:1063a091a062 478 GROUP_EXTEND_ENTRY,
igorsk 0:1063a091a062 479 } AFLUT_ENTRY_Type;
igorsk 0:1063a091a062 480
igorsk 0:1063a091a062 481 /**
igorsk 0:1063a091a062 482 * @brief Symbolic names for type of CAN message
igorsk 0:1063a091a062 483 */
igorsk 0:1063a091a062 484 typedef enum {
igorsk 0:1063a091a062 485 DATA_FRAME = 0, /**< Data frame */
igorsk 0:1063a091a062 486 REMOTE_FRAME = 1 /**< Remote frame */
igorsk 0:1063a091a062 487 } CAN_FRAME_Type;
igorsk 0:1063a091a062 488
igorsk 0:1063a091a062 489 /**
igorsk 0:1063a091a062 490 * @brief CAN Control status definition
igorsk 0:1063a091a062 491 */
igorsk 0:1063a091a062 492 typedef enum {
igorsk 0:1063a091a062 493 CANCTRL_GLOBAL_STS = 0, /**< CAN Global Status */
igorsk 0:1063a091a062 494 CANCTRL_INT_CAP, /**< CAN Interrupt and Capture */
igorsk 0:1063a091a062 495 CANCTRL_ERR_WRN, /**< CAN Error Warning Limit */
igorsk 0:1063a091a062 496 CANCTRL_STS /**< CAN Control Status */
igorsk 0:1063a091a062 497 } CAN_CTRL_STS_Type;
igorsk 0:1063a091a062 498
igorsk 0:1063a091a062 499 /**
igorsk 0:1063a091a062 500 * @brief Central CAN status type definition
igorsk 0:1063a091a062 501 */
igorsk 0:1063a091a062 502 typedef enum {
igorsk 0:1063a091a062 503 CANCR_TX_STS = 0, /**< Central CAN Tx Status */
igorsk 0:1063a091a062 504 CANCR_RX_STS, /**< Central CAN Rx Status */
igorsk 0:1063a091a062 505 CANCR_MS /**< Central CAN Miscellaneous Status */
igorsk 0:1063a091a062 506 } CAN_CR_STS_Type;
igorsk 0:1063a091a062 507
igorsk 0:1063a091a062 508 /**
igorsk 0:1063a091a062 509 * @brief CAN interrupt enable type definition
igorsk 0:1063a091a062 510 */
igorsk 0:1063a091a062 511 typedef enum {
igorsk 0:1063a091a062 512 CANINT_RIE = 0, /**< CAN Receiver Interrupt Enable */
igorsk 0:1063a091a062 513 CANINT_TIE1, /**< CAN Transmit Interrupt Enable */
igorsk 0:1063a091a062 514 CANINT_EIE, /**< CAN Error Warning Interrupt Enable */
igorsk 0:1063a091a062 515 CANINT_DOIE, /**< CAN Data Overrun Interrupt Enable */
igorsk 0:1063a091a062 516 CANINT_WUIE, /**< CAN Wake-Up Interrupt Enable */
igorsk 0:1063a091a062 517 CANINT_EPIE, /**< CAN Error Passive Interrupt Enable */
igorsk 0:1063a091a062 518 CANINT_ALIE, /**< CAN Arbitration Lost Interrupt Enable */
igorsk 0:1063a091a062 519 CANINT_BEIE, /**< CAN Bus Error Inter rupt Enable */
igorsk 0:1063a091a062 520 CANINT_IDIE, /**< CAN ID Ready Interrupt Enable */
igorsk 0:1063a091a062 521 CANINT_TIE2, /**< CAN Transmit Interrupt Enable for Buffer2 */
igorsk 0:1063a091a062 522 CANINT_TIE3, /**< CAN Transmit Interrupt Enable for Buffer3 */
igorsk 0:1063a091a062 523 CANINT_FCE /**< FullCAN Interrupt Enable */
igorsk 0:1063a091a062 524 } CAN_INT_EN_Type;
igorsk 0:1063a091a062 525
igorsk 0:1063a091a062 526 /**
igorsk 0:1063a091a062 527 * @brief Acceptance Filter Mode type definition
igorsk 0:1063a091a062 528 */
igorsk 0:1063a091a062 529 typedef enum {
igorsk 0:1063a091a062 530 CAN_Normal = 0, /**< Normal Mode */
igorsk 0:1063a091a062 531 CAN_AccOff, /**< Acceptance Filter Off Mode */
igorsk 0:1063a091a062 532 CAN_AccBP, /**< Acceptance Fileter Bypass Mode */
igorsk 0:1063a091a062 533 CAN_eFCAN /**< FullCAN Mode Enhancement */
igorsk 0:1063a091a062 534 } CAN_AFMODE_Type;
igorsk 0:1063a091a062 535
igorsk 0:1063a091a062 536 /**
igorsk 0:1063a091a062 537 * @brief CAN Mode Type definition
igorsk 0:1063a091a062 538 */
igorsk 0:1063a091a062 539 typedef enum {
igorsk 0:1063a091a062 540 CAN_OPERATING_MODE = 0, /**< Operating Mode */
igorsk 0:1063a091a062 541 CAN_RESET_MODE, /**< Reset Mode */
igorsk 0:1063a091a062 542 CAN_LISTENONLY_MODE, /**< Listen Only Mode */
igorsk 0:1063a091a062 543 CAN_SELFTEST_MODE, /**< Seft Test Mode */
igorsk 0:1063a091a062 544 CAN_TXPRIORITY_MODE, /**< Transmit Priority Mode */
igorsk 0:1063a091a062 545 CAN_SLEEP_MODE, /**< Sleep Mode */
igorsk 0:1063a091a062 546 CAN_RXPOLARITY_MODE, /**< Receive Polarity Mode */
igorsk 0:1063a091a062 547 CAN_TEST_MODE /**< Test Mode */
igorsk 0:1063a091a062 548 } CAN_MODE_Type;
igorsk 0:1063a091a062 549
igorsk 0:1063a091a062 550 /**
igorsk 0:1063a091a062 551 * @brief Error values that functions can return
igorsk 0:1063a091a062 552 */
igorsk 0:1063a091a062 553 typedef enum {
igorsk 0:1063a091a062 554 CAN_OK = 1, /**< No error */
igorsk 0:1063a091a062 555 CAN_OBJECTS_FULL_ERROR, /**< No more rx or tx objects available */
igorsk 0:1063a091a062 556 CAN_FULL_OBJ_NOT_RCV, /**< Full CAN object not received */
igorsk 0:1063a091a062 557 CAN_NO_RECEIVE_DATA, /**< No have receive data available */
igorsk 0:1063a091a062 558 CAN_AF_ENTRY_ERROR, /**< Entry load in AFLUT is unvalid */
igorsk 0:1063a091a062 559 CAN_CONFLICT_ID_ERROR, /**< Conflict ID occur */
igorsk 0:1063a091a062 560 CAN_ENTRY_NOT_EXIT_ERROR /**< Entry remove outo AFLUT is not exit */
igorsk 0:1063a091a062 561 } CAN_ERROR;
igorsk 0:1063a091a062 562
igorsk 0:1063a091a062 563 /**
igorsk 0:1063a091a062 564 * @brief Pin Configuration structure
igorsk 0:1063a091a062 565 */
igorsk 0:1063a091a062 566 typedef struct {
igorsk 0:1063a091a062 567 uint8_t RD; /**< Serial Inputs, from CAN transceivers, should be:
igorsk 0:1063a091a062 568 ** For CAN1:
igorsk 0:1063a091a062 569 - CAN_RD1_P0_0: RD pin is on P0.0
igorsk 0:1063a091a062 570 - CAN_RD1_P0_21 : RD pin is on P0.21
igorsk 0:1063a091a062 571 ** For CAN2:
igorsk 0:1063a091a062 572 - CAN_RD2_P0_4: RD pin is on P0.4
igorsk 0:1063a091a062 573 - CAN_RD2_P2_7: RD pin is on P2.7
igorsk 0:1063a091a062 574 */
igorsk 0:1063a091a062 575 uint8_t TD; /**< Serial Outputs, To CAN transceivers, should be:
igorsk 0:1063a091a062 576 ** For CAN1:
igorsk 0:1063a091a062 577 - CAN_TD1_P0_1: TD pin is on P0.1
igorsk 0:1063a091a062 578 - CAN_TD1_P0_22: TD pin is on P0.22
igorsk 0:1063a091a062 579 ** For CAN2:
igorsk 0:1063a091a062 580 - CAN_TD2_P0_5: TD pin is on P0.5
igorsk 0:1063a091a062 581 - CAN_TD2_P2_8: TD pin is on P2.8
igorsk 0:1063a091a062 582 */
igorsk 0:1063a091a062 583 } CAN_PinCFG_Type;
igorsk 0:1063a091a062 584
igorsk 0:1063a091a062 585 /**
igorsk 0:1063a091a062 586 * @brief CAN message object structure
igorsk 0:1063a091a062 587 */
igorsk 0:1063a091a062 588 typedef struct {
igorsk 0:1063a091a062 589 uint32_t id; /**< 29 bit identifier, it depend on "format" value
igorsk 0:1063a091a062 590 - if format = STD_ID_FORMAT, id should be 11 bit identifier
igorsk 0:1063a091a062 591 - if format = EXT_ID_FORMAT, id should be 29 bit identifier
igorsk 0:1063a091a062 592 */
igorsk 0:1063a091a062 593 uint8_t dataA[4]; /**< Data field A */
igorsk 0:1063a091a062 594 uint8_t dataB[4]; /**< Data field B */
igorsk 0:1063a091a062 595 uint8_t len; /**< Length of data field in bytes, should be:
igorsk 0:1063a091a062 596 - 0000b-0111b: 0-7 bytes
igorsk 0:1063a091a062 597 - 1xxxb: 8 bytes
igorsk 0:1063a091a062 598 */
igorsk 0:1063a091a062 599 uint8_t format; /**< Identifier Format, should be:
igorsk 0:1063a091a062 600 - STD_ID_FORMAT: Standard ID - 11 bit format
igorsk 0:1063a091a062 601 - EXT_ID_FORMAT: Extended ID - 29 bit format
igorsk 0:1063a091a062 602 */
igorsk 0:1063a091a062 603 uint8_t type; /**< Remote Frame transmission, should be:
igorsk 0:1063a091a062 604 - DATA_FRAME: the number of data bytes called out by the DLC
igorsk 0:1063a091a062 605 field are send from the CANxTDA and CANxTDB registers
igorsk 0:1063a091a062 606 - REMOTE_FRAME: Remote Frame is sent
igorsk 0:1063a091a062 607 */
igorsk 0:1063a091a062 608 } CAN_MSG_Type;
igorsk 0:1063a091a062 609
igorsk 0:1063a091a062 610 /**
igorsk 0:1063a091a062 611 * @brief FullCAN Entry structure
igorsk 0:1063a091a062 612 */
igorsk 0:1063a091a062 613 typedef struct {
igorsk 0:1063a091a062 614 uint8_t controller; /**< CAN Controller, should be:
igorsk 0:1063a091a062 615 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 616 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 617 */
igorsk 0:1063a091a062 618 uint8_t disable; /**< Disable bit, should be:
igorsk 0:1063a091a062 619 - MSG_ENABLE: disable bit = 0
igorsk 0:1063a091a062 620 - MSG_DISABLE: disable bit = 1
igorsk 0:1063a091a062 621 */
igorsk 0:1063a091a062 622 uint16_t id_11; /**< Standard ID, should be 11-bit value */
igorsk 0:1063a091a062 623 } FullCAN_Entry;
igorsk 0:1063a091a062 624
igorsk 0:1063a091a062 625 /**
igorsk 0:1063a091a062 626 * @brief Standard ID Frame Format Entry structure
igorsk 0:1063a091a062 627 */
igorsk 0:1063a091a062 628 typedef struct {
igorsk 0:1063a091a062 629 uint8_t controller; /**< CAN Controller, should be:
igorsk 0:1063a091a062 630 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 631 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 632 */
igorsk 0:1063a091a062 633 uint8_t disable; /**< Disable bit, should be:
igorsk 0:1063a091a062 634 - MSG_ENABLE: disable bit = 0
igorsk 0:1063a091a062 635 - MSG_DISABLE: disable bit = 1
igorsk 0:1063a091a062 636 */
igorsk 0:1063a091a062 637 uint16_t id_11; /**< Standard ID, should be 11-bit value */
igorsk 0:1063a091a062 638 } SFF_Entry;
igorsk 0:1063a091a062 639
igorsk 0:1063a091a062 640 /**
igorsk 0:1063a091a062 641 * @brief Group of Standard ID Frame Format Entry structure
igorsk 0:1063a091a062 642 */
igorsk 0:1063a091a062 643 typedef struct {
igorsk 0:1063a091a062 644 uint8_t controller1; /**< First CAN Controller, should be:
igorsk 0:1063a091a062 645 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 646 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 647 */
igorsk 0:1063a091a062 648 uint8_t disable1; /**< First Disable bit, should be:
igorsk 0:1063a091a062 649 - MSG_ENABLE: disable bit = 0)
igorsk 0:1063a091a062 650 - MSG_DISABLE: disable bit = 1
igorsk 0:1063a091a062 651 */
igorsk 0:1063a091a062 652 uint16_t lowerID; /**< ID lower bound, should be 11-bit value */
igorsk 0:1063a091a062 653 uint8_t controller2; /**< Second CAN Controller, should be:
igorsk 0:1063a091a062 654 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 655 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 656 */
igorsk 0:1063a091a062 657 uint8_t disable2; /**< Second Disable bit, should be:
igorsk 0:1063a091a062 658 - MSG_ENABLE: disable bit = 0
igorsk 0:1063a091a062 659 - MSG_DISABLE: disable bit = 1
igorsk 0:1063a091a062 660 */
igorsk 0:1063a091a062 661 uint16_t upperID; /**< ID upper bound, should be 11-bit value and
igorsk 0:1063a091a062 662 equal or greater than lowerID
igorsk 0:1063a091a062 663 */
igorsk 0:1063a091a062 664 } SFF_GPR_Entry;
igorsk 0:1063a091a062 665
igorsk 0:1063a091a062 666 /**
igorsk 0:1063a091a062 667 * @brief Extended ID Frame Format Entry structure
igorsk 0:1063a091a062 668 */
igorsk 0:1063a091a062 669 typedef struct {
igorsk 0:1063a091a062 670 uint8_t controller; /**< CAN Controller, should be:
igorsk 0:1063a091a062 671 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 672 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 673 */
igorsk 0:1063a091a062 674 uint32_t ID_29; /**< Extend ID, shoud be 29-bit value */
igorsk 0:1063a091a062 675 } EFF_Entry;
igorsk 0:1063a091a062 676
igorsk 0:1063a091a062 677
igorsk 0:1063a091a062 678 /**
igorsk 0:1063a091a062 679 * @brief Group of Extended ID Frame Format Entry structure
igorsk 0:1063a091a062 680 */
igorsk 0:1063a091a062 681 typedef struct {
igorsk 0:1063a091a062 682 uint8_t controller1; /**< First CAN Controller, should be:
igorsk 0:1063a091a062 683 - CAN1_CTRL: CAN1 Controller
igorsk 0:1063a091a062 684 - CAN2_CTRL: CAN2 Controller
igorsk 0:1063a091a062 685 */
igorsk 0:1063a091a062 686 uint8_t controller2; /**< Second Disable bit, should be:
igorsk 0:1063a091a062 687 - MSG_ENABLE: disable bit = 0(default)
igorsk 0:1063a091a062 688 - MSG_DISABLE: disable bit = 1
igorsk 0:1063a091a062 689 */
igorsk 0:1063a091a062 690 uint32_t lowerEID; /**< Extended ID lower bound, should be 29-bit value */
igorsk 0:1063a091a062 691 uint32_t upperEID; /**< Extended ID upper bound, should be 29-bit value */
igorsk 0:1063a091a062 692 } EFF_GPR_Entry;
igorsk 0:1063a091a062 693
igorsk 0:1063a091a062 694
igorsk 0:1063a091a062 695 /**
igorsk 0:1063a091a062 696 * @brief Acceptance Filter Section Table structure
igorsk 0:1063a091a062 697 */
igorsk 0:1063a091a062 698 typedef struct {
igorsk 0:1063a091a062 699 FullCAN_Entry* FullCAN_Sec; /**< The pointer point to FullCAN_Entry */
igorsk 0:1063a091a062 700 uint8_t FC_NumEntry; /**< FullCAN Entry Number */
igorsk 0:1063a091a062 701 SFF_Entry* SFF_Sec; /**< The pointer point to SFF_Entry */
igorsk 0:1063a091a062 702 uint8_t SFF_NumEntry; /**< Standard ID Entry Number */
igorsk 0:1063a091a062 703 SFF_GPR_Entry* SFF_GPR_Sec; /**< The pointer point to SFF_GPR_Entry */
igorsk 0:1063a091a062 704 uint8_t SFF_GPR_NumEntry; /**< Group Standard ID Entry Number */
igorsk 0:1063a091a062 705 EFF_Entry* EFF_Sec; /**< The pointer point to EFF_Entry */
igorsk 0:1063a091a062 706 uint8_t EFF_NumEntry; /**< Extended ID Entry Number */
igorsk 0:1063a091a062 707 EFF_GPR_Entry* EFF_GPR_Sec; /**< The pointer point to EFF_GPR_Entry */
igorsk 0:1063a091a062 708 uint8_t EFF_GPR_NumEntry; /**< Group Extended ID Entry Number */
igorsk 0:1063a091a062 709 } AF_SectionDef;
igorsk 0:1063a091a062 710
igorsk 0:1063a091a062 711 /**
igorsk 0:1063a091a062 712 * @brief CAN call-back function type definitions
igorsk 0:1063a091a062 713 */
igorsk 0:1063a091a062 714 typedef void ( fnCANCbs_Type)();
igorsk 0:1063a091a062 715
igorsk 0:1063a091a062 716
igorsk 0:1063a091a062 717 /**
igorsk 0:1063a091a062 718 * @}
igorsk 0:1063a091a062 719 */
igorsk 0:1063a091a062 720
igorsk 0:1063a091a062 721
igorsk 0:1063a091a062 722 /* Public Macros -------------------------------------------------------------- */
igorsk 0:1063a091a062 723 /** @defgroup CAN_Public_Macros
igorsk 0:1063a091a062 724 * @{
igorsk 0:1063a091a062 725 */
igorsk 0:1063a091a062 726
igorsk 0:1063a091a062 727 /** Macro to determine if it is valid CAN peripheral */
igorsk 0:1063a091a062 728 #define PARAM_CANx(x) ((((uint32_t*)x)==((uint32_t *)LPC_CAN1)) \
igorsk 0:1063a091a062 729 ||(((uint32_t*)x)==((uint32_t *)LPC_CAN2)))
igorsk 0:1063a091a062 730
igorsk 0:1063a091a062 731 #define PARAM_CANAFx(x) (((uint32_t*)x)== ((uint32_t*)LPC_CANAF))
igorsk 0:1063a091a062 732 #define PARAM_CANAFRAMx(x) (((uint32_t*)x)== (uint32_t*)LPC_CANAF_RAM)
igorsk 0:1063a091a062 733 #define PARAM_CANCRx(x) (((uint32_t*)x)==((uint32_t*)LPC_CANCR))
igorsk 0:1063a091a062 734
igorsk 0:1063a091a062 735 /** Macro to check Data to send valid */
igorsk 0:1063a091a062 736 #define PARAM_I2S_DATA(data) ((data <= 0xFFFFFFFF))
igorsk 0:1063a091a062 737 #define PRAM_I2S_FREQ(freq) ((freq>=16000)&&(freq <= 96000))
igorsk 0:1063a091a062 738
igorsk 0:1063a091a062 739 /** Macro to check Pin Selection value */
igorsk 0:1063a091a062 740 #define PARAM_RD1_PIN(n) ((n==CAN_RD1_P0_0)||(n==CAN_RD1_P0_21))
igorsk 0:1063a091a062 741 #define PARAM_TD1_PIN(n) ((n==CAN_TD1_P0_1)||(n==CAN_TD1_P0_22))
igorsk 0:1063a091a062 742 #define PARAM_RD2_PIN(n) ((n==CAN_RD2_P0_4)||(n==CAN_RD2_P2_7))
igorsk 0:1063a091a062 743 #define PARAM_TD2_PIN(n) ((n==CAN_TD2_P0_5)||(n==CAN_TD2_P2_8))
igorsk 0:1063a091a062 744
igorsk 0:1063a091a062 745 /** Macro to check Frame Identifier */
igorsk 0:1063a091a062 746 #define PARAM_ID_11(n) ((n>>11)==0) /*-- 11 bit --*/
igorsk 0:1063a091a062 747 #define PARAM_ID_29(n) ((n>>29)==0) /*-- 29 bit --*/
igorsk 0:1063a091a062 748
igorsk 0:1063a091a062 749 #define PARAM_DLC(n) ((n>>4)==0) /*-- 4 bit --*/
igorsk 0:1063a091a062 750 #define PARAM_ID_FORMAT(n) ((n==STD_ID_FORMAT)||(n==EXT_ID_FORMAT))
igorsk 0:1063a091a062 751 #define PARAM_GRP_ID(x, y) ((x<=y))
igorsk 0:1063a091a062 752 #define PARAM_FRAME_TYPE(n) ((n==DATA_FRAME)||(n==REMOTE_FRAME))
igorsk 0:1063a091a062 753
igorsk 0:1063a091a062 754 /** Macro to check Control/Central Status type parameter */
igorsk 0:1063a091a062 755 #define PARAM_CTRL_STS_TYPE(n) ((n==CANCTRL_GLOBAL_STS)||(n==CANCTRL_INT_CAP) \
igorsk 0:1063a091a062 756 ||(n==CANCTRL_ERR_WRN)||(n==CANCTRL_STS))
igorsk 0:1063a091a062 757 #define PARAM_CR_STS_TYPE(n) ((n==CANCR_TX_STS)||(n==CANCR_RX_STS) \
igorsk 0:1063a091a062 758 ||(n==CANCR_MS))
igorsk 0:1063a091a062 759 /** Macro to check AF Mode type parameter */
igorsk 0:1063a091a062 760 #define PARAM_AFMODE_TYPE(n) ((n==CAN_Normal)||(n==CAN_AccOff) \
igorsk 0:1063a091a062 761 ||(n==CAN_AccBP)||(n==CAN_eFCAN))
igorsk 0:1063a091a062 762 /** Macro to check Operation Mode */
igorsk 0:1063a091a062 763 #define PARAM_MODE_TYPE(n) ((n==CAN_OPERATING_MODE)||(n==CAN_RESET_MODE) \
igorsk 0:1063a091a062 764 ||(n==CAN_LISTENONLY_MODE)||(n==CAN_SELFTEST_MODE) \
igorsk 0:1063a091a062 765 ||(n==CAN_TXPRIORITY_MODE)||(n==CAN_SLEEP_MODE) \
igorsk 0:1063a091a062 766 ||(n==CAN_RXPOLARITY_MODE)||(n==CAN_TEST_MODE))
igorsk 0:1063a091a062 767
igorsk 0:1063a091a062 768 /** Macro define for struct AF_Section parameter */
igorsk 0:1063a091a062 769 #define CAN1_CTRL ((uint8_t)(0))
igorsk 0:1063a091a062 770 #define CAN2_CTRL ((uint8_t)(1))
igorsk 0:1063a091a062 771 #define PARAM_CTRL(n) ((n==CAN1_CTRL)|(n==CAN2_CTRL))
igorsk 0:1063a091a062 772
igorsk 0:1063a091a062 773 #define MSG_ENABLE ((uint8_t)(0))
igorsk 0:1063a091a062 774 #define MSG_DISABLE ((uint8_t)(1))
igorsk 0:1063a091a062 775 #define PARAM_MSG_DISABLE(n) ((n==MSG_ENABLE)|(n==MSG_DISABLE))
igorsk 0:1063a091a062 776
igorsk 0:1063a091a062 777 /**Macro to check Interrupt Type parameter */
igorsk 0:1063a091a062 778 #define PARAM_INT_EN_TYPE(n) ((n==CANINT_RIE)||(n==CANINT_TIE1) \
igorsk 0:1063a091a062 779 ||(n==CANINT_EIE)||(n==CANINT_DOIE) \
igorsk 0:1063a091a062 780 ||(n==CANINT_WUIE)||(n==CANINT_EPIE) \
igorsk 0:1063a091a062 781 ||(n==CANINT_ALIE)||(n==CANINT_BEIE) \
igorsk 0:1063a091a062 782 ||(n==CANINT_IDIE)||(n==CANINT_TIE2) \
igorsk 0:1063a091a062 783 ||(n==CANINT_TIE3)||(n==CANINT_FCE))
igorsk 0:1063a091a062 784
igorsk 0:1063a091a062 785 /** Macro to check AFLUT Entry type */
igorsk 0:1063a091a062 786 #define PARAM_AFLUT_ENTRY_TYPE(n) ((n==FULLCAN_ENTRY)||(n==EXPLICIT_STANDARD_ENTRY)\
igorsk 0:1063a091a062 787 ||(n==GROUP_STANDARD_ENTRY)||(n==EXPLICIT_EXTEND_ENTRY) \
igorsk 0:1063a091a062 788 ||(n==GROUP_EXTEND_ENTRY))
igorsk 0:1063a091a062 789 #define PARAM_POSITION(n) ((n<512))
igorsk 0:1063a091a062 790
igorsk 0:1063a091a062 791 /** CAN function pin selection defines */
igorsk 0:1063a091a062 792 #define CAN_RD1_P0_0 ((uint8_t)(0))
igorsk 0:1063a091a062 793 #define CAN_RD1_P0_21 ((uint8_t)(1))
igorsk 0:1063a091a062 794 #define CAN_TD1_P0_1 ((uint8_t)(0))
igorsk 0:1063a091a062 795 #define CAN_TD1_P0_22 ((uint8_t)(1))
igorsk 0:1063a091a062 796
igorsk 0:1063a091a062 797 #define CAN_RD2_P0_4 ((uint8_t)(0))
igorsk 0:1063a091a062 798 #define CAN_RD2_P2_7 ((uint8_t)(1))
igorsk 0:1063a091a062 799 #define CAN_TD2_P0_5 ((uint8_t)(0))
igorsk 0:1063a091a062 800 #define CAN_TD2_P2_8 ((uint8_t)(1))
igorsk 0:1063a091a062 801
igorsk 0:1063a091a062 802
igorsk 0:1063a091a062 803 /**
igorsk 0:1063a091a062 804 * @}
igorsk 0:1063a091a062 805 */
igorsk 0:1063a091a062 806
igorsk 0:1063a091a062 807
igorsk 0:1063a091a062 808 /* Public Functions ----------------------------------------------------------- */
igorsk 0:1063a091a062 809 /** @defgroup CAN_Public_Functions
igorsk 0:1063a091a062 810 * @{
igorsk 0:1063a091a062 811 */
igorsk 0:1063a091a062 812
igorsk 0:1063a091a062 813 void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate);
igorsk 0:1063a091a062 814 void CAN_DeInit(LPC_CAN_TypeDef *CANx);
igorsk 0:1063a091a062 815
igorsk 0:1063a091a062 816 Status CAN_SendMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg);
igorsk 0:1063a091a062 817 Status CAN_ReceiveMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg);
igorsk 0:1063a091a062 818 CAN_ERROR FCAN_ReadObj(LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg);
igorsk 0:1063a091a062 819
igorsk 0:1063a091a062 820 uint32_t CAN_GetCTRLStatus(LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg);
igorsk 0:1063a091a062 821 uint32_t CAN_GetCRStatus(LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg);
igorsk 0:1063a091a062 822 void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode,
igorsk 0:1063a091a062 823 FunctionalState NewState);
igorsk 0:1063a091a062 824 void CAN_SetBaudRate(LPC_CAN_TypeDef *CANx, uint32_t baudrate);
igorsk 0:1063a091a062 825
igorsk 0:1063a091a062 826 void CAN_SetAFMode(LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFmode);
igorsk 0:1063a091a062 827 CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection);
igorsk 0:1063a091a062 828 CAN_ERROR CAN_LoadFullCANEntry(LPC_CAN_TypeDef* CANx, uint16_t ID);
igorsk 0:1063a091a062 829 CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t ID,
igorsk 0:1063a091a062 830 CAN_ID_FORMAT_Type format);
igorsk 0:1063a091a062 831 CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID,
igorsk 0:1063a091a062 832 uint32_t upperID, CAN_ID_FORMAT_Type format);
igorsk 0:1063a091a062 833 CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position);
igorsk 0:1063a091a062 834
igorsk 0:1063a091a062 835 void CAN_SetupCBS(CAN_INT_EN_Type arg, fnCANCbs_Type* pnCANCbs);
igorsk 0:1063a091a062 836 void CAN_IRQCmd(LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg,
igorsk 0:1063a091a062 837 FunctionalState NewState);
igorsk 0:1063a091a062 838 void CAN_IntHandler(LPC_CAN_TypeDef* CANx);
igorsk 0:1063a091a062 839
igorsk 0:1063a091a062 840 /**
igorsk 0:1063a091a062 841 * @}
igorsk 0:1063a091a062 842 */
igorsk 0:1063a091a062 843
igorsk 0:1063a091a062 844
igorsk 0:1063a091a062 845 #ifdef __cplusplus
igorsk 0:1063a091a062 846 }
igorsk 0:1063a091a062 847 #endif
igorsk 0:1063a091a062 848
igorsk 0:1063a091a062 849 #endif /* LPC17XX_CAN_H_ */
igorsk 0:1063a091a062 850
igorsk 0:1063a091a062 851 /**
igorsk 0:1063a091a062 852 * @}
igorsk 0:1063a091a062 853 */
igorsk 0:1063a091a062 854
igorsk 0:1063a091a062 855 /* --------------------------------- End Of File ------------------------------ */