The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
Parent:
TARGET_TB_SENSE_1/TARGET_Silicon_Labs/TARGET_EFM32/emlib/inc/em_can.h@160:5571c4ff569f
mbed library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 160:5571c4ff569f 1 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 2 * @file em_can.h
Anna Bridge 160:5571c4ff569f 3 * @brief Controller Area Network API
Anna Bridge 160:5571c4ff569f 4 * @version 5.3.3
Anna Bridge 160:5571c4ff569f 5 *******************************************************************************
Anna Bridge 160:5571c4ff569f 6 * # License
Anna Bridge 160:5571c4ff569f 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
Anna Bridge 160:5571c4ff569f 8 *******************************************************************************
Anna Bridge 160:5571c4ff569f 9 *
Anna Bridge 160:5571c4ff569f 10 * Permission is granted to anyone to use this software for any purpose,
Anna Bridge 160:5571c4ff569f 11 * including commercial applications, and to alter it and redistribute it
Anna Bridge 160:5571c4ff569f 12 * freely, subject to the following restrictions:
Anna Bridge 160:5571c4ff569f 13 *
Anna Bridge 160:5571c4ff569f 14 * 1. The origin of this software must not be misrepresented; you must not
Anna Bridge 160:5571c4ff569f 15 * claim that you wrote the original software.
Anna Bridge 160:5571c4ff569f 16 * 2. Altered source versions must be plainly marked as such, and must not be
Anna Bridge 160:5571c4ff569f 17 * misrepresented as being the original software.
Anna Bridge 160:5571c4ff569f 18 * 3. This notice may not be removed or altered from any source distribution.
Anna Bridge 160:5571c4ff569f 19 *
Anna Bridge 160:5571c4ff569f 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
Anna Bridge 160:5571c4ff569f 21 * obligation to support this Software. Silicon Labs is providing the
Anna Bridge 160:5571c4ff569f 22 * Software "AS IS", with no express or implied warranties of any kind,
Anna Bridge 160:5571c4ff569f 23 * including, but not limited to, any implied warranties of merchantability
Anna Bridge 160:5571c4ff569f 24 * or fitness for any particular purpose or warranties against infringement
Anna Bridge 160:5571c4ff569f 25 * of any proprietary rights of a third party.
Anna Bridge 160:5571c4ff569f 26 *
Anna Bridge 160:5571c4ff569f 27 * Silicon Labs will not be liable for any consequential, incidental, or
Anna Bridge 160:5571c4ff569f 28 * special damages, or any other relief, or for any claim by any third party,
Anna Bridge 160:5571c4ff569f 29 * arising from your use of this Software.
Anna Bridge 160:5571c4ff569f 30 *
Anna Bridge 160:5571c4ff569f 31 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 32
Anna Bridge 160:5571c4ff569f 33 #ifndef EM_CAN_H
Anna Bridge 160:5571c4ff569f 34 #define EM_CAN_H
Anna Bridge 160:5571c4ff569f 35
Anna Bridge 160:5571c4ff569f 36 #include "em_bus.h"
Anna Bridge 160:5571c4ff569f 37 #include "em_device.h"
Anna Bridge 160:5571c4ff569f 38 #include <stdbool.h>
Anna Bridge 160:5571c4ff569f 39
Anna Bridge 160:5571c4ff569f 40 #if defined(CAN_COUNT) && (CAN_COUNT > 0)
Anna Bridge 160:5571c4ff569f 41
Anna Bridge 160:5571c4ff569f 42 #ifdef __cplusplus
Anna Bridge 160:5571c4ff569f 43 extern "C" {
Anna Bridge 160:5571c4ff569f 44 #endif
Anna Bridge 160:5571c4ff569f 45
Anna Bridge 160:5571c4ff569f 46 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 47 * @addtogroup emlib
Anna Bridge 160:5571c4ff569f 48 * @{
Anna Bridge 160:5571c4ff569f 49 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 50
Anna Bridge 160:5571c4ff569f 51 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 52 * @addtogroup CAN
Anna Bridge 160:5571c4ff569f 53 * @{
Anna Bridge 160:5571c4ff569f 54 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 55
Anna Bridge 160:5571c4ff569f 56 /*******************************************************************************
Anna Bridge 160:5571c4ff569f 57 ******************************* DEFINES ***********************************
Anna Bridge 160:5571c4ff569f 58 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 59
Anna Bridge 160:5571c4ff569f 60 /*******************************************************************************
Anna Bridge 160:5571c4ff569f 61 ******************************** ENUMS ************************************
Anna Bridge 160:5571c4ff569f 62 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 63
Anna Bridge 160:5571c4ff569f 64 /** CAN Status codes */
Anna Bridge 160:5571c4ff569f 65 typedef enum {
Anna Bridge 160:5571c4ff569f 66 /** No error occurred during last CAN bus event. */
Anna Bridge 160:5571c4ff569f 67 canErrorNoError = CAN_STATUS_LEC_NONE,
Anna Bridge 160:5571c4ff569f 68
Anna Bridge 160:5571c4ff569f 69 /**
Anna Bridge 160:5571c4ff569f 70 * More than 5 equal bits in a sequence have occurred in a part of a received
Anna Bridge 160:5571c4ff569f 71 * message where this is not allowed.
Anna Bridge 160:5571c4ff569f 72 */
Anna Bridge 160:5571c4ff569f 73 canErrorStuff = CAN_STATUS_LEC_STUFF,
Anna Bridge 160:5571c4ff569f 74
Anna Bridge 160:5571c4ff569f 75 /** A fixed format part of a received frame has the wrong format. */
Anna Bridge 160:5571c4ff569f 76 canErrorForm = CAN_STATUS_LEC_FORM,
Anna Bridge 160:5571c4ff569f 77
Anna Bridge 160:5571c4ff569f 78 /** The message this CAN Core transmitted was not acknowledged by another node. */
Anna Bridge 160:5571c4ff569f 79 canErrorAck = CAN_STATUS_LEC_ACK,
Anna Bridge 160:5571c4ff569f 80
Anna Bridge 160:5571c4ff569f 81 /** Wrong monitored bus value : dominant when the module wanted to send a recessive. */
Anna Bridge 160:5571c4ff569f 82 canErrorBit1 = CAN_STATUS_LEC_BIT1,
Anna Bridge 160:5571c4ff569f 83
Anna Bridge 160:5571c4ff569f 84 /** Wrong monitored bus value : recessive when the module intended to send a dominant. */
Anna Bridge 160:5571c4ff569f 85 canErrorBit0 = CAN_STATUS_LEC_BIT0,
Anna Bridge 160:5571c4ff569f 86
Anna Bridge 160:5571c4ff569f 87 /** CRC check sum incorrect. */
Anna Bridge 160:5571c4ff569f 88 canErrorCrc = CAN_STATUS_LEC_CRC,
Anna Bridge 160:5571c4ff569f 89
Anna Bridge 160:5571c4ff569f 90 /** Unused. No new error since the cpu wrote this value */
Anna Bridge 160:5571c4ff569f 91 canErrorUnused = CAN_STATUS_LEC_UNUSED
Anna Bridge 160:5571c4ff569f 92 } CAN_ErrorCode_TypeDef;
Anna Bridge 160:5571c4ff569f 93
Anna Bridge 160:5571c4ff569f 94 /** CAN peripheral mode */
Anna Bridge 160:5571c4ff569f 95 typedef enum {
Anna Bridge 160:5571c4ff569f 96 /** CAN peripheral in Normal mode : ready to send and receive messages */
Anna Bridge 160:5571c4ff569f 97 canModeNormal,
Anna Bridge 160:5571c4ff569f 98
Anna Bridge 160:5571c4ff569f 99 /** CAN peripheral in Basic mode : no use of the RAM */
Anna Bridge 160:5571c4ff569f 100 canModeBasic,
Anna Bridge 160:5571c4ff569f 101
Anna Bridge 160:5571c4ff569f 102 /**
Anna Bridge 160:5571c4ff569f 103 * CAN peripheral in Loopback mode : input from the CAN bus is disregarded
Anna Bridge 160:5571c4ff569f 104 * and comes from TX instead
Anna Bridge 160:5571c4ff569f 105 */
Anna Bridge 160:5571c4ff569f 106 canModeLoopBack,
Anna Bridge 160:5571c4ff569f 107
Anna Bridge 160:5571c4ff569f 108 /**
Anna Bridge 160:5571c4ff569f 109 * CAN peripheral in SilentLoopback mode : input from the CAN bus is
Anna Bridge 160:5571c4ff569f 110 * disregarded and comes from TX instead ; no output on the CAN bus
Anna Bridge 160:5571c4ff569f 111 */
Anna Bridge 160:5571c4ff569f 112 canModeSilentLoopBack,
Anna Bridge 160:5571c4ff569f 113
Anna Bridge 160:5571c4ff569f 114 /** CAN peripheral in Silent mode : no output on the CAN bus. If required to
Anna Bridge 160:5571c4ff569f 115 * send a dominant bit, it's rerouted internally so that the CAN module
Anna Bridge 160:5571c4ff569f 116 * monitors it but the CAN bus stays recessive.
Anna Bridge 160:5571c4ff569f 117 */
Anna Bridge 160:5571c4ff569f 118 canModeSilent
Anna Bridge 160:5571c4ff569f 119 } CAN_Mode_TypeDef;
Anna Bridge 160:5571c4ff569f 120
Anna Bridge 160:5571c4ff569f 121 /*******************************************************************************
Anna Bridge 160:5571c4ff569f 122 ******************************* STRUCTS ***********************************
Anna Bridge 160:5571c4ff569f 123 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 124
Anna Bridge 160:5571c4ff569f 125 /** CAN Message Object TypeDef structure. LSBs is used */
Anna Bridge 160:5571c4ff569f 126 typedef struct {
Anna Bridge 160:5571c4ff569f 127 /** Message number of this Message Object, [1 - 32] */
Anna Bridge 160:5571c4ff569f 128 uint8_t msgNum;
Anna Bridge 160:5571c4ff569f 129
Anna Bridge 160:5571c4ff569f 130 /** Id extended if true, standard if false */
Anna Bridge 160:5571c4ff569f 131 bool extended;
Anna Bridge 160:5571c4ff569f 132
Anna Bridge 160:5571c4ff569f 133 /**
Anna Bridge 160:5571c4ff569f 134 * Id of the message, with 11 bits (standard) or 28 bits (extended).
Anna Bridge 160:5571c4ff569f 135 * LSBs are used for both of them
Anna Bridge 160:5571c4ff569f 136 */
Anna Bridge 160:5571c4ff569f 137 uint32_t id;
Anna Bridge 160:5571c4ff569f 138
Anna Bridge 160:5571c4ff569f 139 /** Data Length Code [0 - 8] */
Anna Bridge 160:5571c4ff569f 140 uint8_t dlc;
Anna Bridge 160:5571c4ff569f 141
Anna Bridge 160:5571c4ff569f 142 /** Pointer to the data, [0 - 8] bytes */
Anna Bridge 160:5571c4ff569f 143 uint8_t data[8];
Anna Bridge 160:5571c4ff569f 144
Anna Bridge 160:5571c4ff569f 145 /** Mask for id filtering */
Anna Bridge 160:5571c4ff569f 146 uint32_t mask;
Anna Bridge 160:5571c4ff569f 147
Anna Bridge 160:5571c4ff569f 148 /** Enable the use of 'extended' value for filtering */
Anna Bridge 160:5571c4ff569f 149 bool extendedMask;
Anna Bridge 160:5571c4ff569f 150
Anna Bridge 160:5571c4ff569f 151 /** Enable the use of 'direction' value for filtering */
Anna Bridge 160:5571c4ff569f 152 bool directionMask;
Anna Bridge 160:5571c4ff569f 153 } CAN_MessageObject_TypeDef;
Anna Bridge 160:5571c4ff569f 154
Anna Bridge 160:5571c4ff569f 155 /** CAN initialization structure. */
Anna Bridge 160:5571c4ff569f 156 typedef struct {
Anna Bridge 160:5571c4ff569f 157 /** true to set the CAN Device in normal mode after init */
Anna Bridge 160:5571c4ff569f 158 bool enable;
Anna Bridge 160:5571c4ff569f 159
Anna Bridge 160:5571c4ff569f 160 /** True to reset messages during initialization */
Anna Bridge 160:5571c4ff569f 161 bool resetMessages;
Anna Bridge 160:5571c4ff569f 162
Anna Bridge 160:5571c4ff569f 163 /** Default bitrate */
Anna Bridge 160:5571c4ff569f 164 uint32_t bitrate;
Anna Bridge 160:5571c4ff569f 165
Anna Bridge 160:5571c4ff569f 166 /** Default Propagation Time Segment */
Anna Bridge 160:5571c4ff569f 167 uint8_t propagationTimeSegment;
Anna Bridge 160:5571c4ff569f 168
Anna Bridge 160:5571c4ff569f 169 /** Default Phase Buffer Segment 1 */
Anna Bridge 160:5571c4ff569f 170 uint8_t phaseBufferSegment1;
Anna Bridge 160:5571c4ff569f 171
Anna Bridge 160:5571c4ff569f 172 /** Default Phase Buffer Segment 2 */
Anna Bridge 160:5571c4ff569f 173 uint8_t phaseBufferSegment2;
Anna Bridge 160:5571c4ff569f 174
Anna Bridge 160:5571c4ff569f 175 /** Default Synchronisation Jump Width */
Anna Bridge 160:5571c4ff569f 176 uint8_t synchronisationJumpWidth;
Anna Bridge 160:5571c4ff569f 177 } CAN_Init_TypeDef;
Anna Bridge 160:5571c4ff569f 178
Anna Bridge 160:5571c4ff569f 179 /**
Anna Bridge 160:5571c4ff569f 180 * Default initialization of CAN_Init_TypeDef. The total duration of a bit with
Anna Bridge 160:5571c4ff569f 181 * these default parameters is 10 tq (time quantum : tq = brp/fsys, brp being
Anna Bridge 160:5571c4ff569f 182 * the baudrate prescaler and being set according to the wanted bitrate, fsys
Anna Bridge 160:5571c4ff569f 183 * beeing the CAN Device frequency).
Anna Bridge 160:5571c4ff569f 184 */
Anna Bridge 160:5571c4ff569f 185 #define CAN_INIT_DEFAULT \
Anna Bridge 160:5571c4ff569f 186 { \
Anna Bridge 160:5571c4ff569f 187 true, /** Set the CAN Device in normal mode after init */ \
Anna Bridge 160:5571c4ff569f 188 true, /** Reset messages during initialization */ \
Anna Bridge 160:5571c4ff569f 189 100000, /** Set bitrate to 100 000 */ \
Anna Bridge 160:5571c4ff569f 190 1, /** Set the Propagation Time Segment to 1 */ \
Anna Bridge 160:5571c4ff569f 191 4, /** Set the Phase Buffer Segment 1 to 4 */ \
Anna Bridge 160:5571c4ff569f 192 4, /** Set the Phase Buffer Segment 2 to 4 */ \
Anna Bridge 160:5571c4ff569f 193 1 /** Set the Synchronization Jump Width to 1 */ \
Anna Bridge 160:5571c4ff569f 194 }
Anna Bridge 160:5571c4ff569f 195
Anna Bridge 160:5571c4ff569f 196 /*******************************************************************************
Anna Bridge 160:5571c4ff569f 197 ***************************** PROTOTYPES **********************************
Anna Bridge 160:5571c4ff569f 198 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 199
Anna Bridge 160:5571c4ff569f 200 void CAN_Init(CAN_TypeDef *can, const CAN_Init_TypeDef *init);
Anna Bridge 160:5571c4ff569f 201
Anna Bridge 160:5571c4ff569f 202 uint32_t CAN_GetClockFrequency(CAN_TypeDef *can);
Anna Bridge 160:5571c4ff569f 203
Anna Bridge 160:5571c4ff569f 204 bool CAN_MessageLost(CAN_TypeDef *can, uint8_t interface, uint8_t msgNum);
Anna Bridge 160:5571c4ff569f 205
Anna Bridge 160:5571c4ff569f 206 void CAN_SetRoute(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 207 bool active,
Anna Bridge 160:5571c4ff569f 208 uint16_t pinRxLoc,
Anna Bridge 160:5571c4ff569f 209 uint16_t pinTxLoc);
Anna Bridge 160:5571c4ff569f 210
Anna Bridge 160:5571c4ff569f 211 void CAN_SetBitTiming(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 212 uint32_t bitrate,
Anna Bridge 160:5571c4ff569f 213 uint16_t propagationTimeSegment,
Anna Bridge 160:5571c4ff569f 214 uint16_t phaseBufferSegment1,
Anna Bridge 160:5571c4ff569f 215 uint16_t phaseBufferSegment2,
Anna Bridge 160:5571c4ff569f 216 uint16_t synchronisationJumpWidth);
Anna Bridge 160:5571c4ff569f 217
Anna Bridge 160:5571c4ff569f 218 void CAN_SetMode(CAN_TypeDef *can, CAN_Mode_TypeDef mode);
Anna Bridge 160:5571c4ff569f 219
Anna Bridge 160:5571c4ff569f 220 void CAN_SetIdAndFilter(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 221 uint8_t interface,
Anna Bridge 160:5571c4ff569f 222 bool useMask,
Anna Bridge 160:5571c4ff569f 223 const CAN_MessageObject_TypeDef *message,
Anna Bridge 160:5571c4ff569f 224 bool wait);
Anna Bridge 160:5571c4ff569f 225
Anna Bridge 160:5571c4ff569f 226 void CAN_ConfigureMessageObject(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 227 uint8_t interface,
Anna Bridge 160:5571c4ff569f 228 uint8_t msgNum,
Anna Bridge 160:5571c4ff569f 229 bool valid,
Anna Bridge 160:5571c4ff569f 230 bool tx,
Anna Bridge 160:5571c4ff569f 231 bool remoteTransfer,
Anna Bridge 160:5571c4ff569f 232 bool endOfBuffer,
Anna Bridge 160:5571c4ff569f 233 bool wait);
Anna Bridge 160:5571c4ff569f 234
Anna Bridge 160:5571c4ff569f 235 void CAN_SendMessage(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 236 uint8_t interface,
Anna Bridge 160:5571c4ff569f 237 const CAN_MessageObject_TypeDef *message,
Anna Bridge 160:5571c4ff569f 238 bool wait);
Anna Bridge 160:5571c4ff569f 239
Anna Bridge 160:5571c4ff569f 240 void CAN_ReadMessage(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 241 uint8_t interface,
Anna Bridge 160:5571c4ff569f 242 CAN_MessageObject_TypeDef *message);
Anna Bridge 160:5571c4ff569f 243
Anna Bridge 160:5571c4ff569f 244 void CAN_AbortSendMessage(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 245 uint8_t interface,
Anna Bridge 160:5571c4ff569f 246 uint8_t msgNum,
Anna Bridge 160:5571c4ff569f 247 bool wait);
Anna Bridge 160:5571c4ff569f 248
Anna Bridge 160:5571c4ff569f 249 void CAN_ResetMessages(CAN_TypeDef *can, uint8_t interface);
Anna Bridge 160:5571c4ff569f 250
Anna Bridge 160:5571c4ff569f 251 void CAN_Reset(CAN_TypeDef *can);
Anna Bridge 160:5571c4ff569f 252
Anna Bridge 160:5571c4ff569f 253 void CAN_WriteData(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 254 uint8_t interface,
Anna Bridge 160:5571c4ff569f 255 const CAN_MessageObject_TypeDef *message);
Anna Bridge 160:5571c4ff569f 256
Anna Bridge 160:5571c4ff569f 257 void CAN_SendRequest(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 258 uint8_t interface,
Anna Bridge 160:5571c4ff569f 259 uint8_t msgNum,
Anna Bridge 160:5571c4ff569f 260 bool wait);
Anna Bridge 160:5571c4ff569f 261
Anna Bridge 160:5571c4ff569f 262 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 263 * @brief
Anna Bridge 160:5571c4ff569f 264 * Enable the Host Controller to send messages.
Anna Bridge 160:5571c4ff569f 265 *
Anna Bridge 160:5571c4ff569f 266 * @param[in] can
Anna Bridge 160:5571c4ff569f 267 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 268 *
Anna Bridge 160:5571c4ff569f 269 * @param[in] enable
Anna Bridge 160:5571c4ff569f 270 * true to enable CAN device, false to disable it. If the CAN device is
Anna Bridge 160:5571c4ff569f 271 * enabled, it goes in normal mode (the default working mode).
Anna Bridge 160:5571c4ff569f 272 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 273 __STATIC_INLINE void CAN_Enable(CAN_TypeDef *can, bool enable)
Anna Bridge 160:5571c4ff569f 274 {
Anna Bridge 160:5571c4ff569f 275 BUS_RegBitWrite(&can->CTRL, _CAN_CTRL_INIT_SHIFT, (enable ? 0 : 1));
Anna Bridge 160:5571c4ff569f 276 }
Anna Bridge 160:5571c4ff569f 277
Anna Bridge 160:5571c4ff569f 278 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 279 * @brief
Anna Bridge 160:5571c4ff569f 280 * Gives the communication capabilities state.
Anna Bridge 160:5571c4ff569f 281 *
Anna Bridge 160:5571c4ff569f 282 * @param[in] can
Anna Bridge 160:5571c4ff569f 283 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 284 *
Anna Bridge 160:5571c4ff569f 285 * @return
Anna Bridge 160:5571c4ff569f 286 * true if the Host Controller can send messages, false otherwise.
Anna Bridge 160:5571c4ff569f 287 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 288 __STATIC_INLINE bool CAN_IsEnabled(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 289 {
Anna Bridge 160:5571c4ff569f 290 return (can->CTRL & _CAN_CTRL_INIT_MASK) == 0;
Anna Bridge 160:5571c4ff569f 291 }
Anna Bridge 160:5571c4ff569f 292
Anna Bridge 160:5571c4ff569f 293 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 294 * @brief
Anna Bridge 160:5571c4ff569f 295 * Waiting function.
Anna Bridge 160:5571c4ff569f 296 *
Anna Bridge 160:5571c4ff569f 297 * @param[in] can
Anna Bridge 160:5571c4ff569f 298 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 299 *
Anna Bridge 160:5571c4ff569f 300 * @param[in] interface
Anna Bridge 160:5571c4ff569f 301 * Indicate which Message Interface Register to use.
Anna Bridge 160:5571c4ff569f 302 *
Anna Bridge 160:5571c4ff569f 303 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 304 __STATIC_INLINE void CAN_ReadyWait(CAN_TypeDef *can,
Anna Bridge 160:5571c4ff569f 305 uint8_t interface)
Anna Bridge 160:5571c4ff569f 306 {
Anna Bridge 160:5571c4ff569f 307 while ((_CAN_MIR_CMDREQ_BUSY_MASK & can->MIR[interface].CMDREQ) != 0) {
Anna Bridge 160:5571c4ff569f 308 }
Anna Bridge 160:5571c4ff569f 309 }
Anna Bridge 160:5571c4ff569f 310
Anna Bridge 160:5571c4ff569f 311 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 312 * @brief
Anna Bridge 160:5571c4ff569f 313 * Get the last error code and clear its register.
Anna Bridge 160:5571c4ff569f 314 *
Anna Bridge 160:5571c4ff569f 315 * @param[in] can
Anna Bridge 160:5571c4ff569f 316 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 317 *
Anna Bridge 160:5571c4ff569f 318 * @return
Anna Bridge 160:5571c4ff569f 319 * return Last error code.
Anna Bridge 160:5571c4ff569f 320 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 321 __STATIC_INLINE CAN_ErrorCode_TypeDef CAN_GetLastErrorCode(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 322 {
Anna Bridge 160:5571c4ff569f 323 CAN_ErrorCode_TypeDef errorCode = (CAN_ErrorCode_TypeDef)
Anna Bridge 160:5571c4ff569f 324 (can->STATUS & _CAN_STATUS_LEC_MASK);
Anna Bridge 160:5571c4ff569f 325 can->STATUS |= ~_CAN_STATUS_LEC_MASK;
Anna Bridge 160:5571c4ff569f 326 return errorCode;
Anna Bridge 160:5571c4ff569f 327 }
Anna Bridge 160:5571c4ff569f 328
Anna Bridge 160:5571c4ff569f 329 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 330 * @brief
Anna Bridge 160:5571c4ff569f 331 * Indicates which messages objects have received new data.
Anna Bridge 160:5571c4ff569f 332 *
Anna Bridge 160:5571c4ff569f 333 * @param[in] can
Anna Bridge 160:5571c4ff569f 334 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 335 *
Anna Bridge 160:5571c4ff569f 336 * @return
Anna Bridge 160:5571c4ff569f 337 * State of MESSAGEDATA register indicating which messages objects have received
Anna Bridge 160:5571c4ff569f 338 * new data.
Anna Bridge 160:5571c4ff569f 339 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 340 __STATIC_INLINE uint32_t CAN_HasNewdata(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 341 {
Anna Bridge 160:5571c4ff569f 342 return can->MESSAGEDATA;
Anna Bridge 160:5571c4ff569f 343 }
Anna Bridge 160:5571c4ff569f 344
Anna Bridge 160:5571c4ff569f 345 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 346 * @brief
Anna Bridge 160:5571c4ff569f 347 * Clear one or more pending CAN status interrupts.
Anna Bridge 160:5571c4ff569f 348 *
Anna Bridge 160:5571c4ff569f 349 * @param[in] can
Anna Bridge 160:5571c4ff569f 350 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 351 *
Anna Bridge 160:5571c4ff569f 352 * @param[in] flags
Anna Bridge 160:5571c4ff569f 353 * Pending CAN status interrupt source(s) to clear.
Anna Bridge 160:5571c4ff569f 354 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 355 __STATIC_INLINE void CAN_StatusIntClear(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 356 {
Anna Bridge 160:5571c4ff569f 357 can->IF1IFC = flags;
Anna Bridge 160:5571c4ff569f 358 }
Anna Bridge 160:5571c4ff569f 359
Anna Bridge 160:5571c4ff569f 360 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 361 * @brief
Anna Bridge 160:5571c4ff569f 362 * Disable CAN status interrupts.
Anna Bridge 160:5571c4ff569f 363 *
Anna Bridge 160:5571c4ff569f 364 * @param[in] can
Anna Bridge 160:5571c4ff569f 365 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 366 *
Anna Bridge 160:5571c4ff569f 367 * @param[in] flags
Anna Bridge 160:5571c4ff569f 368 * CAN status interrupt source(s) to disable.
Anna Bridge 160:5571c4ff569f 369 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 370 __STATIC_INLINE void CAN_StatusIntDisable(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 371 {
Anna Bridge 160:5571c4ff569f 372 can->IF1IEN &= ~flags;
Anna Bridge 160:5571c4ff569f 373 }
Anna Bridge 160:5571c4ff569f 374
Anna Bridge 160:5571c4ff569f 375 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 376 * @brief
Anna Bridge 160:5571c4ff569f 377 * Enable CAN status interrupts.
Anna Bridge 160:5571c4ff569f 378 *
Anna Bridge 160:5571c4ff569f 379 * @param[in] can
Anna Bridge 160:5571c4ff569f 380 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 381 *
Anna Bridge 160:5571c4ff569f 382 * @param[in] flags
Anna Bridge 160:5571c4ff569f 383 * CAN status interrupt source(s) to enable.
Anna Bridge 160:5571c4ff569f 384 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 385 __STATIC_INLINE void CAN_StatusIntEnable(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 386 {
Anna Bridge 160:5571c4ff569f 387 can->IF1IEN |= flags;
Anna Bridge 160:5571c4ff569f 388 }
Anna Bridge 160:5571c4ff569f 389
Anna Bridge 160:5571c4ff569f 390 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 391 * @brief
Anna Bridge 160:5571c4ff569f 392 * Get pending CAN status interrupt flags.
Anna Bridge 160:5571c4ff569f 393 *
Anna Bridge 160:5571c4ff569f 394 * @note
Anna Bridge 160:5571c4ff569f 395 * The event bits are not cleared by the use of this function.
Anna Bridge 160:5571c4ff569f 396 *
Anna Bridge 160:5571c4ff569f 397 * @param[in] can
Anna Bridge 160:5571c4ff569f 398 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 399 *
Anna Bridge 160:5571c4ff569f 400 * @return
Anna Bridge 160:5571c4ff569f 401 * CAN interrupt source(s) pending.
Anna Bridge 160:5571c4ff569f 402 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 403 __STATIC_INLINE uint32_t CAN_StatusIntGet(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 404 {
Anna Bridge 160:5571c4ff569f 405 return can->IF1IF;
Anna Bridge 160:5571c4ff569f 406 }
Anna Bridge 160:5571c4ff569f 407
Anna Bridge 160:5571c4ff569f 408 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 409 * @brief
Anna Bridge 160:5571c4ff569f 410 * Get pending and enabled CAN status interrupt flags.
Anna Bridge 160:5571c4ff569f 411 *
Anna Bridge 160:5571c4ff569f 412 * @note
Anna Bridge 160:5571c4ff569f 413 * The event bits are not cleared by the use of this function.
Anna Bridge 160:5571c4ff569f 414 *
Anna Bridge 160:5571c4ff569f 415 * @param[in] can
Anna Bridge 160:5571c4ff569f 416 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 417 *
Anna Bridge 160:5571c4ff569f 418 * @return
Anna Bridge 160:5571c4ff569f 419 * CAN interrupt source(s) pending and enabled.
Anna Bridge 160:5571c4ff569f 420 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 421 __STATIC_INLINE uint32_t CAN_StatusIntGetEnabled(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 422 {
Anna Bridge 160:5571c4ff569f 423 uint32_t ien;
Anna Bridge 160:5571c4ff569f 424
Anna Bridge 160:5571c4ff569f 425 ien = can->IF1IEN;
Anna Bridge 160:5571c4ff569f 426 return can->IF1IF & ien;
Anna Bridge 160:5571c4ff569f 427 }
Anna Bridge 160:5571c4ff569f 428
Anna Bridge 160:5571c4ff569f 429 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 430 * @brief
Anna Bridge 160:5571c4ff569f 431 * Set one or more CAN status interrupts.
Anna Bridge 160:5571c4ff569f 432 *
Anna Bridge 160:5571c4ff569f 433 * @param[in] can
Anna Bridge 160:5571c4ff569f 434 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 435 *
Anna Bridge 160:5571c4ff569f 436 * @param[in] flags
Anna Bridge 160:5571c4ff569f 437 * CAN status interrupt source(s) to set to pending.
Anna Bridge 160:5571c4ff569f 438 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 439 __STATIC_INLINE void CAN_StatusIntSet(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 440 {
Anna Bridge 160:5571c4ff569f 441 can->IF1IFS = flags;
Anna Bridge 160:5571c4ff569f 442 }
Anna Bridge 160:5571c4ff569f 443
Anna Bridge 160:5571c4ff569f 444 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 445 * @brief
Anna Bridge 160:5571c4ff569f 446 * Get CAN status.
Anna Bridge 160:5571c4ff569f 447 *
Anna Bridge 160:5571c4ff569f 448 * @param[in] can
Anna Bridge 160:5571c4ff569f 449 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 450 *
Anna Bridge 160:5571c4ff569f 451 * @return
Anna Bridge 160:5571c4ff569f 452 * Value of CAN register STATUS.
Anna Bridge 160:5571c4ff569f 453 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 454 __STATIC_INLINE uint32_t CAN_StatusGet(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 455 {
Anna Bridge 160:5571c4ff569f 456 return can->STATUS & ~_CAN_STATUS_LEC_MASK;
Anna Bridge 160:5571c4ff569f 457 }
Anna Bridge 160:5571c4ff569f 458
Anna Bridge 160:5571c4ff569f 459 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 460 * @brief
Anna Bridge 160:5571c4ff569f 461 * Clear CAN status.
Anna Bridge 160:5571c4ff569f 462 *
Anna Bridge 160:5571c4ff569f 463 * @param[in] can
Anna Bridge 160:5571c4ff569f 464 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 465 *
Anna Bridge 160:5571c4ff569f 466 * @param[in] flags
Anna Bridge 160:5571c4ff569f 467 * CAN status bits to clear.
Anna Bridge 160:5571c4ff569f 468 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 469 __STATIC_INLINE void CAN_StatusClear(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 470 {
Anna Bridge 160:5571c4ff569f 471 can->STATUS &= ~flags;
Anna Bridge 160:5571c4ff569f 472 }
Anna Bridge 160:5571c4ff569f 473
Anna Bridge 160:5571c4ff569f 474 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 475 * @brief
Anna Bridge 160:5571c4ff569f 476 * Get the error count.
Anna Bridge 160:5571c4ff569f 477 *
Anna Bridge 160:5571c4ff569f 478 * @param[in] can
Anna Bridge 160:5571c4ff569f 479 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 480 *
Anna Bridge 160:5571c4ff569f 481 * @return
Anna Bridge 160:5571c4ff569f 482 * Error count.
Anna Bridge 160:5571c4ff569f 483 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 484 __STATIC_INLINE uint32_t CAN_GetErrorCount(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 485 {
Anna Bridge 160:5571c4ff569f 486 return can->ERRCNT;
Anna Bridge 160:5571c4ff569f 487 }
Anna Bridge 160:5571c4ff569f 488
Anna Bridge 160:5571c4ff569f 489 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 490 * @brief
Anna Bridge 160:5571c4ff569f 491 * Clear one or more pending CAN message interrupts.
Anna Bridge 160:5571c4ff569f 492 *
Anna Bridge 160:5571c4ff569f 493 * @param[in] can
Anna Bridge 160:5571c4ff569f 494 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 495 *
Anna Bridge 160:5571c4ff569f 496 * @param[in] flags
Anna Bridge 160:5571c4ff569f 497 * Pending CAN message interrupt source(s) to clear.
Anna Bridge 160:5571c4ff569f 498 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 499 __STATIC_INLINE void CAN_MessageIntClear(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 500 {
Anna Bridge 160:5571c4ff569f 501 can->IF0IFC = flags;
Anna Bridge 160:5571c4ff569f 502 }
Anna Bridge 160:5571c4ff569f 503
Anna Bridge 160:5571c4ff569f 504 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 505 * @brief
Anna Bridge 160:5571c4ff569f 506 * Disable CAN message interrupts.
Anna Bridge 160:5571c4ff569f 507 *
Anna Bridge 160:5571c4ff569f 508 * @param[in] can
Anna Bridge 160:5571c4ff569f 509 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 510 *
Anna Bridge 160:5571c4ff569f 511 * @param[in] flags
Anna Bridge 160:5571c4ff569f 512 * CAN message interrupt source(s) to disable.
Anna Bridge 160:5571c4ff569f 513 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 514 __STATIC_INLINE void CAN_MessageIntDisable(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 515 {
Anna Bridge 160:5571c4ff569f 516 can->IF0IEN &= ~flags;
Anna Bridge 160:5571c4ff569f 517 }
Anna Bridge 160:5571c4ff569f 518
Anna Bridge 160:5571c4ff569f 519 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 520 * @brief
Anna Bridge 160:5571c4ff569f 521 * Enable CAN message interrupts.
Anna Bridge 160:5571c4ff569f 522 *
Anna Bridge 160:5571c4ff569f 523 * @param[in] can
Anna Bridge 160:5571c4ff569f 524 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 525 *
Anna Bridge 160:5571c4ff569f 526 * @param[in] flags
Anna Bridge 160:5571c4ff569f 527 * CAN message interrupt source(s) to enable.
Anna Bridge 160:5571c4ff569f 528 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 529 __STATIC_INLINE void CAN_MessageIntEnable(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 530 {
Anna Bridge 160:5571c4ff569f 531 can->IF0IEN |= flags;
Anna Bridge 160:5571c4ff569f 532 }
Anna Bridge 160:5571c4ff569f 533
Anna Bridge 160:5571c4ff569f 534 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 535 * @brief
Anna Bridge 160:5571c4ff569f 536 * Get pending CAN message interrupt flags.
Anna Bridge 160:5571c4ff569f 537 *
Anna Bridge 160:5571c4ff569f 538 * @note
Anna Bridge 160:5571c4ff569f 539 * The event bits are not cleared by the use of this function.
Anna Bridge 160:5571c4ff569f 540 *
Anna Bridge 160:5571c4ff569f 541 * @param[in] can
Anna Bridge 160:5571c4ff569f 542 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 543 *
Anna Bridge 160:5571c4ff569f 544 * @return
Anna Bridge 160:5571c4ff569f 545 * CAN message interrupt source(s) pending.
Anna Bridge 160:5571c4ff569f 546 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 547 __STATIC_INLINE uint32_t CAN_MessageIntGet(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 548 {
Anna Bridge 160:5571c4ff569f 549 return can->IF0IF;
Anna Bridge 160:5571c4ff569f 550 }
Anna Bridge 160:5571c4ff569f 551
Anna Bridge 160:5571c4ff569f 552 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 553 * @brief
Anna Bridge 160:5571c4ff569f 554 * Get CAN message interrupt flags that are pending and enabled.
Anna Bridge 160:5571c4ff569f 555 *
Anna Bridge 160:5571c4ff569f 556 * @note
Anna Bridge 160:5571c4ff569f 557 * The event bits are not cleared by the use of this function.
Anna Bridge 160:5571c4ff569f 558 *
Anna Bridge 160:5571c4ff569f 559 * @param[in] can
Anna Bridge 160:5571c4ff569f 560 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 561 *
Anna Bridge 160:5571c4ff569f 562 * @return
Anna Bridge 160:5571c4ff569f 563 * CAN message interrupt source(s) pending and enabled.
Anna Bridge 160:5571c4ff569f 564 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 565 __STATIC_INLINE uint32_t CAN_MessageIntGetEnabled(CAN_TypeDef *can)
Anna Bridge 160:5571c4ff569f 566 {
Anna Bridge 160:5571c4ff569f 567 uint32_t ien;
Anna Bridge 160:5571c4ff569f 568
Anna Bridge 160:5571c4ff569f 569 ien = can->IF0IEN;
Anna Bridge 160:5571c4ff569f 570 return can->IF0IF & ien;
Anna Bridge 160:5571c4ff569f 571 }
Anna Bridge 160:5571c4ff569f 572
Anna Bridge 160:5571c4ff569f 573 /***************************************************************************//**
Anna Bridge 160:5571c4ff569f 574 * @brief
Anna Bridge 160:5571c4ff569f 575 * Set one or more CAN message interrupts.
Anna Bridge 160:5571c4ff569f 576 *
Anna Bridge 160:5571c4ff569f 577 * @param[in] can
Anna Bridge 160:5571c4ff569f 578 * Pointer to CAN peripheral register block.
Anna Bridge 160:5571c4ff569f 579 *
Anna Bridge 160:5571c4ff569f 580 * @param[in] flags
Anna Bridge 160:5571c4ff569f 581 * CAN message interrupt source(s) to set to pending.
Anna Bridge 160:5571c4ff569f 582 ******************************************************************************/
Anna Bridge 160:5571c4ff569f 583 __STATIC_INLINE void CAN_MessageIntSet(CAN_TypeDef *can, uint32_t flags)
Anna Bridge 160:5571c4ff569f 584 {
Anna Bridge 160:5571c4ff569f 585 can->IF0IFS = flags;
Anna Bridge 160:5571c4ff569f 586 }
Anna Bridge 160:5571c4ff569f 587
Anna Bridge 160:5571c4ff569f 588 /** @} (end addtogroup CAN) */
Anna Bridge 160:5571c4ff569f 589 /** @} (end addtogroup emlib) */
Anna Bridge 160:5571c4ff569f 590
Anna Bridge 160:5571c4ff569f 591 #ifdef __cplusplus
Anna Bridge 160:5571c4ff569f 592 }
Anna Bridge 160:5571c4ff569f 593 #endif
Anna Bridge 160:5571c4ff569f 594
Anna Bridge 160:5571c4ff569f 595 #endif /* defined(CAN_COUNT) && (CAN_COUNT > 0) */
Anna Bridge 160:5571c4ff569f 596 #endif /* EM_CAN_H */