mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
jaerts
Date:
Tue Dec 22 13:22:16 2015 +0000
Revision:
637:ed69428d4850
Parent:
155:8435094ec241
Add very shady LPC1768 CAN Filter implementation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 155:8435094ec241 1 /**
mbed_official 155:8435094ec241 2 ******************************************************************************
mbed_official 155:8435094ec241 3 * @file stm32f30x_can.c
mbed_official 155:8435094ec241 4 * @author MCD Application Team
mbed_official 155:8435094ec241 5 * @version V1.1.0
mbed_official 155:8435094ec241 6 * @date 27-February-2014
mbed_official 155:8435094ec241 7 * @brief This file provides firmware functions to manage the following
mbed_official 155:8435094ec241 8 * functionalities of the Controller area network (CAN) peripheral:
mbed_official 155:8435094ec241 9 * + Initialization and Configuration
mbed_official 155:8435094ec241 10 * + CAN Frames Transmission
mbed_official 155:8435094ec241 11 * + CAN Frames Reception
mbed_official 155:8435094ec241 12 * + Operation modes switch
mbed_official 155:8435094ec241 13 * + Error management
mbed_official 155:8435094ec241 14 * + Interrupts and flags
mbed_official 155:8435094ec241 15 *
mbed_official 155:8435094ec241 16 @verbatim
mbed_official 155:8435094ec241 17
mbed_official 155:8435094ec241 18 ===============================================================================
mbed_official 155:8435094ec241 19 ##### How to use this driver #####
mbed_official 155:8435094ec241 20 ===============================================================================
mbed_official 155:8435094ec241 21 [..]
mbed_official 155:8435094ec241 22 (#) Enable the CAN controller interface clock using
mbed_official 155:8435094ec241 23 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
mbed_official 155:8435094ec241 24 (#) CAN pins configuration:
mbed_official 155:8435094ec241 25 (++) Enable the clock for the CAN GPIOs using the following function:
mbed_official 155:8435094ec241 26 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOx, ENABLE);
mbed_official 155:8435094ec241 27 (++) Connect the involved CAN pins to AF9 using the following function
mbed_official 155:8435094ec241 28 GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_CANx);
mbed_official 155:8435094ec241 29 (++) Configure these CAN pins in alternate function mode by calling
mbed_official 155:8435094ec241 30 the function GPIO_Init();
mbed_official 155:8435094ec241 31 (#) Initialise and configure the CAN using CAN_Init() and
mbed_official 155:8435094ec241 32 CAN_FilterInit() functions.
mbed_official 155:8435094ec241 33 (#) Transmit the desired CAN frame using CAN_Transmit() function.
mbed_official 155:8435094ec241 34 (#) Check the transmission of a CAN frame using CAN_TransmitStatus() function.
mbed_official 155:8435094ec241 35 (#) Cancel the transmission of a CAN frame using CAN_CancelTransmit() function.
mbed_official 155:8435094ec241 36 (#) Receive a CAN frame using CAN_Recieve() function.
mbed_official 155:8435094ec241 37 (#) Release the receive FIFOs using CAN_FIFORelease() function.
mbed_official 155:8435094ec241 38 (#) Return the number of pending received frames using CAN_MessagePending() function.
mbed_official 155:8435094ec241 39 (#) To control CAN events you can use one of the following two methods:
mbed_official 155:8435094ec241 40 (++) Check on CAN flags using the CAN_GetFlagStatus() function.
mbed_official 155:8435094ec241 41 (++) Use CAN interrupts through the function CAN_ITConfig() at initialization
mbed_official 155:8435094ec241 42 phase and CAN_GetITStatus() function into interrupt routines to check
mbed_official 155:8435094ec241 43 if the event has occurred or not.
mbed_official 155:8435094ec241 44 After checking on a flag you should clear it using CAN_ClearFlag()
mbed_official 155:8435094ec241 45 function. And after checking on an interrupt event you should clear it
mbed_official 155:8435094ec241 46 using CAN_ClearITPendingBit() function.
mbed_official 155:8435094ec241 47
mbed_official 155:8435094ec241 48 @endverbatim
mbed_official 155:8435094ec241 49 *
mbed_official 155:8435094ec241 50 ******************************************************************************
mbed_official 155:8435094ec241 51 * @attention
mbed_official 155:8435094ec241 52 *
mbed_official 155:8435094ec241 53 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 155:8435094ec241 54 *
mbed_official 155:8435094ec241 55 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 155:8435094ec241 56 * are permitted provided that the following conditions are met:
mbed_official 155:8435094ec241 57 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 155:8435094ec241 58 * this list of conditions and the following disclaimer.
mbed_official 155:8435094ec241 59 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 155:8435094ec241 60 * this list of conditions and the following disclaimer in the documentation
mbed_official 155:8435094ec241 61 * and/or other materials provided with the distribution.
mbed_official 155:8435094ec241 62 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 155:8435094ec241 63 * may be used to endorse or promote products derived from this software
mbed_official 155:8435094ec241 64 * without specific prior written permission.
mbed_official 155:8435094ec241 65 *
mbed_official 155:8435094ec241 66 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 155:8435094ec241 67 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 155:8435094ec241 68 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 155:8435094ec241 69 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 155:8435094ec241 70 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 155:8435094ec241 71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 155:8435094ec241 72 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 155:8435094ec241 73 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 155:8435094ec241 74 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 155:8435094ec241 75 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 155:8435094ec241 76 *
mbed_official 155:8435094ec241 77 ******************************************************************************
mbed_official 155:8435094ec241 78 */
mbed_official 155:8435094ec241 79
mbed_official 155:8435094ec241 80 /* Includes ------------------------------------------------------------------*/
mbed_official 155:8435094ec241 81 #include "stm32f30x_can.h"
mbed_official 155:8435094ec241 82 #include "stm32f30x_rcc.h"
mbed_official 155:8435094ec241 83
mbed_official 155:8435094ec241 84 /** @addtogroup STM32F30x_StdPeriph_Driver
mbed_official 155:8435094ec241 85 * @{
mbed_official 155:8435094ec241 86 */
mbed_official 155:8435094ec241 87
mbed_official 155:8435094ec241 88 /** @defgroup CAN
mbed_official 155:8435094ec241 89 * @brief CAN driver modules
mbed_official 155:8435094ec241 90 * @{
mbed_official 155:8435094ec241 91 */
mbed_official 155:8435094ec241 92 /* Private typedef -----------------------------------------------------------*/
mbed_official 155:8435094ec241 93 /* Private define ------------------------------------------------------------*/
mbed_official 155:8435094ec241 94
mbed_official 155:8435094ec241 95 /* CAN Master Control Register bits */
mbed_official 155:8435094ec241 96 #define MCR_DBF ((uint32_t)0x00010000) /* software master reset */
mbed_official 155:8435094ec241 97
mbed_official 155:8435094ec241 98 /* CAN Mailbox Transmit Request */
mbed_official 155:8435094ec241 99 #define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */
mbed_official 155:8435094ec241 100
mbed_official 155:8435094ec241 101 /* CAN Filter Master Register bits */
mbed_official 155:8435094ec241 102 #define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */
mbed_official 155:8435094ec241 103
mbed_official 155:8435094ec241 104 /* Time out for INAK bit */
mbed_official 155:8435094ec241 105 #define INAK_TIMEOUT ((uint32_t)0x00FFFFFF)
mbed_official 155:8435094ec241 106 /* Time out for SLAK bit */
mbed_official 155:8435094ec241 107 #define SLAK_TIMEOUT ((uint32_t)0x00FFFFFF)
mbed_official 155:8435094ec241 108
mbed_official 155:8435094ec241 109 /* Flags in TSR register */
mbed_official 155:8435094ec241 110 #define CAN_FLAGS_TSR ((uint32_t)0x08000000)
mbed_official 155:8435094ec241 111 /* Flags in RF1R register */
mbed_official 155:8435094ec241 112 #define CAN_FLAGS_RF1R ((uint32_t)0x04000000)
mbed_official 155:8435094ec241 113 /* Flags in RF0R register */
mbed_official 155:8435094ec241 114 #define CAN_FLAGS_RF0R ((uint32_t)0x02000000)
mbed_official 155:8435094ec241 115 /* Flags in MSR register */
mbed_official 155:8435094ec241 116 #define CAN_FLAGS_MSR ((uint32_t)0x01000000)
mbed_official 155:8435094ec241 117 /* Flags in ESR register */
mbed_official 155:8435094ec241 118 #define CAN_FLAGS_ESR ((uint32_t)0x00F00000)
mbed_official 155:8435094ec241 119
mbed_official 155:8435094ec241 120 /* Mailboxes definition */
mbed_official 155:8435094ec241 121 #define CAN_TXMAILBOX_0 ((uint8_t)0x00)
mbed_official 155:8435094ec241 122 #define CAN_TXMAILBOX_1 ((uint8_t)0x01)
mbed_official 155:8435094ec241 123 #define CAN_TXMAILBOX_2 ((uint8_t)0x02)
mbed_official 155:8435094ec241 124
mbed_official 155:8435094ec241 125 #define CAN_MODE_MASK ((uint32_t) 0x00000003)
mbed_official 155:8435094ec241 126
mbed_official 155:8435094ec241 127 /* Private macro -------------------------------------------------------------*/
mbed_official 155:8435094ec241 128 /* Private variables ---------------------------------------------------------*/
mbed_official 155:8435094ec241 129 /* Private function prototypes -----------------------------------------------*/
mbed_official 155:8435094ec241 130 /* Private functions ---------------------------------------------------------*/
mbed_official 155:8435094ec241 131 static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit);
mbed_official 155:8435094ec241 132
mbed_official 155:8435094ec241 133 /** @defgroup CAN_Private_Functions
mbed_official 155:8435094ec241 134 * @{
mbed_official 155:8435094ec241 135 */
mbed_official 155:8435094ec241 136
mbed_official 155:8435094ec241 137 /** @defgroup CAN_Group1 Initialization and Configuration functions
mbed_official 155:8435094ec241 138 * @brief Initialization and Configuration functions
mbed_official 155:8435094ec241 139 *
mbed_official 155:8435094ec241 140 @verbatim
mbed_official 155:8435094ec241 141 ===============================================================================
mbed_official 155:8435094ec241 142 ##### Initialization and Configuration functions #####
mbed_official 155:8435094ec241 143 ===============================================================================
mbed_official 155:8435094ec241 144 [..] This section provides functions allowing to:
mbed_official 155:8435094ec241 145 (+) Initialize the CAN peripherals : Prescaler, operating mode, the maximum
mbed_official 155:8435094ec241 146 number of time quanta to perform resynchronization, the number of time
mbed_official 155:8435094ec241 147 quanta in Bit Segment 1 and 2 and many other modes.
mbed_official 155:8435094ec241 148 (+) Configure the CAN reception filter.
mbed_official 155:8435094ec241 149 (+) Select the start bank filter for slave CAN.
mbed_official 155:8435094ec241 150 (+) Enable or disable the Debug Freeze mode for CAN.
mbed_official 155:8435094ec241 151 (+) Enable or disable the CAN Time Trigger Operation communication mode.
mbed_official 155:8435094ec241 152
mbed_official 155:8435094ec241 153 @endverbatim
mbed_official 155:8435094ec241 154 * @{
mbed_official 155:8435094ec241 155 */
mbed_official 155:8435094ec241 156
mbed_official 155:8435094ec241 157 /**
mbed_official 155:8435094ec241 158 * @brief Deinitializes the CAN peripheral registers to their default reset values.
mbed_official 155:8435094ec241 159 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 160 * @retval None.
mbed_official 155:8435094ec241 161 */
mbed_official 155:8435094ec241 162 void CAN_DeInit(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 163 {
mbed_official 155:8435094ec241 164 /* Check the parameters */
mbed_official 155:8435094ec241 165 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 166
mbed_official 155:8435094ec241 167 /* Enable CAN1 reset state */
mbed_official 155:8435094ec241 168 RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE);
mbed_official 155:8435094ec241 169 /* Release CAN1 from reset state */
mbed_official 155:8435094ec241 170 RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE);
mbed_official 155:8435094ec241 171 }
mbed_official 155:8435094ec241 172
mbed_official 155:8435094ec241 173 /**
mbed_official 155:8435094ec241 174 * @brief Initializes the CAN peripheral according to the specified
mbed_official 155:8435094ec241 175 * parameters in the CAN_InitStruct.
mbed_official 155:8435094ec241 176 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 177 * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that contains
mbed_official 155:8435094ec241 178 * the configuration information for the CAN peripheral.
mbed_official 155:8435094ec241 179 * @retval Constant indicates initialization succeed which will be
mbed_official 155:8435094ec241 180 * CAN_InitStatus_Failed or CAN_InitStatus_Success.
mbed_official 155:8435094ec241 181 */
mbed_official 155:8435094ec241 182 uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
mbed_official 155:8435094ec241 183 {
mbed_official 155:8435094ec241 184 uint8_t InitStatus = CAN_InitStatus_Failed;
mbed_official 155:8435094ec241 185 __IO uint32_t wait_ack = 0x00000000;
mbed_official 155:8435094ec241 186 /* Check the parameters */
mbed_official 155:8435094ec241 187 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 188 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM));
mbed_official 155:8435094ec241 189 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM));
mbed_official 155:8435094ec241 190 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM));
mbed_official 155:8435094ec241 191 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART));
mbed_official 155:8435094ec241 192 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM));
mbed_official 155:8435094ec241 193 assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP));
mbed_official 155:8435094ec241 194 assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode));
mbed_official 155:8435094ec241 195 assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW));
mbed_official 155:8435094ec241 196 assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1));
mbed_official 155:8435094ec241 197 assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2));
mbed_official 155:8435094ec241 198 assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler));
mbed_official 155:8435094ec241 199
mbed_official 155:8435094ec241 200 /* Exit from sleep mode */
mbed_official 155:8435094ec241 201 CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP);
mbed_official 155:8435094ec241 202
mbed_official 155:8435094ec241 203 /* Request initialisation */
mbed_official 155:8435094ec241 204 CANx->MCR |= CAN_MCR_INRQ ;
mbed_official 155:8435094ec241 205
mbed_official 155:8435094ec241 206 /* Wait the acknowledge */
mbed_official 155:8435094ec241 207 while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
mbed_official 155:8435094ec241 208 {
mbed_official 155:8435094ec241 209 wait_ack++;
mbed_official 155:8435094ec241 210 }
mbed_official 155:8435094ec241 211
mbed_official 155:8435094ec241 212 /* Check acknowledge */
mbed_official 155:8435094ec241 213 if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
mbed_official 155:8435094ec241 214 {
mbed_official 155:8435094ec241 215 InitStatus = CAN_InitStatus_Failed;
mbed_official 155:8435094ec241 216 }
mbed_official 155:8435094ec241 217 else
mbed_official 155:8435094ec241 218 {
mbed_official 155:8435094ec241 219 /* Set the time triggered communication mode */
mbed_official 155:8435094ec241 220 if (CAN_InitStruct->CAN_TTCM == ENABLE)
mbed_official 155:8435094ec241 221 {
mbed_official 155:8435094ec241 222 CANx->MCR |= CAN_MCR_TTCM;
mbed_official 155:8435094ec241 223 }
mbed_official 155:8435094ec241 224 else
mbed_official 155:8435094ec241 225 {
mbed_official 155:8435094ec241 226 CANx->MCR &= ~(uint32_t)CAN_MCR_TTCM;
mbed_official 155:8435094ec241 227 }
mbed_official 155:8435094ec241 228
mbed_official 155:8435094ec241 229 /* Set the automatic bus-off management */
mbed_official 155:8435094ec241 230 if (CAN_InitStruct->CAN_ABOM == ENABLE)
mbed_official 155:8435094ec241 231 {
mbed_official 155:8435094ec241 232 CANx->MCR |= CAN_MCR_ABOM;
mbed_official 155:8435094ec241 233 }
mbed_official 155:8435094ec241 234 else
mbed_official 155:8435094ec241 235 {
mbed_official 155:8435094ec241 236 CANx->MCR &= ~(uint32_t)CAN_MCR_ABOM;
mbed_official 155:8435094ec241 237 }
mbed_official 155:8435094ec241 238
mbed_official 155:8435094ec241 239 /* Set the automatic wake-up mode */
mbed_official 155:8435094ec241 240 if (CAN_InitStruct->CAN_AWUM == ENABLE)
mbed_official 155:8435094ec241 241 {
mbed_official 155:8435094ec241 242 CANx->MCR |= CAN_MCR_AWUM;
mbed_official 155:8435094ec241 243 }
mbed_official 155:8435094ec241 244 else
mbed_official 155:8435094ec241 245 {
mbed_official 155:8435094ec241 246 CANx->MCR &= ~(uint32_t)CAN_MCR_AWUM;
mbed_official 155:8435094ec241 247 }
mbed_official 155:8435094ec241 248
mbed_official 155:8435094ec241 249 /* Set the no automatic retransmission */
mbed_official 155:8435094ec241 250 if (CAN_InitStruct->CAN_NART == ENABLE)
mbed_official 155:8435094ec241 251 {
mbed_official 155:8435094ec241 252 CANx->MCR |= CAN_MCR_NART;
mbed_official 155:8435094ec241 253 }
mbed_official 155:8435094ec241 254 else
mbed_official 155:8435094ec241 255 {
mbed_official 155:8435094ec241 256 CANx->MCR &= ~(uint32_t)CAN_MCR_NART;
mbed_official 155:8435094ec241 257 }
mbed_official 155:8435094ec241 258
mbed_official 155:8435094ec241 259 /* Set the receive FIFO locked mode */
mbed_official 155:8435094ec241 260 if (CAN_InitStruct->CAN_RFLM == ENABLE)
mbed_official 155:8435094ec241 261 {
mbed_official 155:8435094ec241 262 CANx->MCR |= CAN_MCR_RFLM;
mbed_official 155:8435094ec241 263 }
mbed_official 155:8435094ec241 264 else
mbed_official 155:8435094ec241 265 {
mbed_official 155:8435094ec241 266 CANx->MCR &= ~(uint32_t)CAN_MCR_RFLM;
mbed_official 155:8435094ec241 267 }
mbed_official 155:8435094ec241 268
mbed_official 155:8435094ec241 269 /* Set the transmit FIFO priority */
mbed_official 155:8435094ec241 270 if (CAN_InitStruct->CAN_TXFP == ENABLE)
mbed_official 155:8435094ec241 271 {
mbed_official 155:8435094ec241 272 CANx->MCR |= CAN_MCR_TXFP;
mbed_official 155:8435094ec241 273 }
mbed_official 155:8435094ec241 274 else
mbed_official 155:8435094ec241 275 {
mbed_official 155:8435094ec241 276 CANx->MCR &= ~(uint32_t)CAN_MCR_TXFP;
mbed_official 155:8435094ec241 277 }
mbed_official 155:8435094ec241 278
mbed_official 155:8435094ec241 279 /* Set the bit timing register */
mbed_official 155:8435094ec241 280 CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \
mbed_official 155:8435094ec241 281 ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \
mbed_official 155:8435094ec241 282 ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \
mbed_official 155:8435094ec241 283 ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \
mbed_official 155:8435094ec241 284 ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);
mbed_official 155:8435094ec241 285
mbed_official 155:8435094ec241 286 /* Request leave initialisation */
mbed_official 155:8435094ec241 287 CANx->MCR &= ~(uint32_t)CAN_MCR_INRQ;
mbed_official 155:8435094ec241 288
mbed_official 155:8435094ec241 289 /* Wait the acknowledge */
mbed_official 155:8435094ec241 290 wait_ack = 0;
mbed_official 155:8435094ec241 291
mbed_official 155:8435094ec241 292 while (((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
mbed_official 155:8435094ec241 293 {
mbed_official 155:8435094ec241 294 wait_ack++;
mbed_official 155:8435094ec241 295 }
mbed_official 155:8435094ec241 296
mbed_official 155:8435094ec241 297 /* ...and check acknowledged */
mbed_official 155:8435094ec241 298 if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
mbed_official 155:8435094ec241 299 {
mbed_official 155:8435094ec241 300 InitStatus = CAN_InitStatus_Failed;
mbed_official 155:8435094ec241 301 }
mbed_official 155:8435094ec241 302 else
mbed_official 155:8435094ec241 303 {
mbed_official 155:8435094ec241 304 InitStatus = CAN_InitStatus_Success ;
mbed_official 155:8435094ec241 305 }
mbed_official 155:8435094ec241 306 }
mbed_official 155:8435094ec241 307
mbed_official 155:8435094ec241 308 /* At this step, return the status of initialization */
mbed_official 155:8435094ec241 309 return InitStatus;
mbed_official 155:8435094ec241 310 }
mbed_official 155:8435094ec241 311
mbed_official 155:8435094ec241 312 /**
mbed_official 155:8435094ec241 313 * @brief Configures the CAN reception filter according to the specified
mbed_official 155:8435094ec241 314 * parameters in the CAN_FilterInitStruct.
mbed_official 155:8435094ec241 315 * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef structure that
mbed_official 155:8435094ec241 316 * contains the configuration information.
mbed_official 155:8435094ec241 317 * @retval None
mbed_official 155:8435094ec241 318 */
mbed_official 155:8435094ec241 319 void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct)
mbed_official 155:8435094ec241 320 {
mbed_official 155:8435094ec241 321 uint32_t filter_number_bit_pos = 0;
mbed_official 155:8435094ec241 322 /* Check the parameters */
mbed_official 155:8435094ec241 323 assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber));
mbed_official 155:8435094ec241 324 assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode));
mbed_official 155:8435094ec241 325 assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale));
mbed_official 155:8435094ec241 326 assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment));
mbed_official 155:8435094ec241 327 assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation));
mbed_official 155:8435094ec241 328
mbed_official 155:8435094ec241 329 filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber;
mbed_official 155:8435094ec241 330
mbed_official 155:8435094ec241 331 /* Initialisation mode for the filter */
mbed_official 155:8435094ec241 332 CAN1->FMR |= FMR_FINIT;
mbed_official 155:8435094ec241 333
mbed_official 155:8435094ec241 334 /* Filter Deactivation */
mbed_official 155:8435094ec241 335 CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 336
mbed_official 155:8435094ec241 337 /* Filter Scale */
mbed_official 155:8435094ec241 338 if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit)
mbed_official 155:8435094ec241 339 {
mbed_official 155:8435094ec241 340 /* 16-bit scale for the filter */
mbed_official 155:8435094ec241 341 CAN1->FS1R &= ~(uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 342
mbed_official 155:8435094ec241 343 /* First 16-bit identifier and First 16-bit mask */
mbed_official 155:8435094ec241 344 /* Or First 16-bit identifier and Second 16-bit identifier */
mbed_official 155:8435094ec241 345 CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 =
mbed_official 155:8435094ec241 346 ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) |
mbed_official 155:8435094ec241 347 (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow);
mbed_official 155:8435094ec241 348
mbed_official 155:8435094ec241 349 /* Second 16-bit identifier and Second 16-bit mask */
mbed_official 155:8435094ec241 350 /* Or Third 16-bit identifier and Fourth 16-bit identifier */
mbed_official 155:8435094ec241 351 CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 =
mbed_official 155:8435094ec241 352 ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) |
mbed_official 155:8435094ec241 353 (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh);
mbed_official 155:8435094ec241 354 }
mbed_official 155:8435094ec241 355
mbed_official 155:8435094ec241 356 if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit)
mbed_official 155:8435094ec241 357 {
mbed_official 155:8435094ec241 358 /* 32-bit scale for the filter */
mbed_official 155:8435094ec241 359 CAN1->FS1R |= filter_number_bit_pos;
mbed_official 155:8435094ec241 360 /* 32-bit identifier or First 32-bit identifier */
mbed_official 155:8435094ec241 361 CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 =
mbed_official 155:8435094ec241 362 ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) |
mbed_official 155:8435094ec241 363 (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow);
mbed_official 155:8435094ec241 364 /* 32-bit mask or Second 32-bit identifier */
mbed_official 155:8435094ec241 365 CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 =
mbed_official 155:8435094ec241 366 ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) |
mbed_official 155:8435094ec241 367 (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow);
mbed_official 155:8435094ec241 368 }
mbed_official 155:8435094ec241 369
mbed_official 155:8435094ec241 370 /* Filter Mode */
mbed_official 155:8435094ec241 371 if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask)
mbed_official 155:8435094ec241 372 {
mbed_official 155:8435094ec241 373 /*Id/Mask mode for the filter*/
mbed_official 155:8435094ec241 374 CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 375 }
mbed_official 155:8435094ec241 376 else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */
mbed_official 155:8435094ec241 377 {
mbed_official 155:8435094ec241 378 /*Identifier list mode for the filter*/
mbed_official 155:8435094ec241 379 CAN1->FM1R |= (uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 380 }
mbed_official 155:8435094ec241 381
mbed_official 155:8435094ec241 382 /* Filter FIFO assignment */
mbed_official 155:8435094ec241 383 if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0)
mbed_official 155:8435094ec241 384 {
mbed_official 155:8435094ec241 385 /* FIFO 0 assignation for the filter */
mbed_official 155:8435094ec241 386 CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 387 }
mbed_official 155:8435094ec241 388
mbed_official 155:8435094ec241 389 if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1)
mbed_official 155:8435094ec241 390 {
mbed_official 155:8435094ec241 391 /* FIFO 1 assignation for the filter */
mbed_official 155:8435094ec241 392 CAN1->FFA1R |= (uint32_t)filter_number_bit_pos;
mbed_official 155:8435094ec241 393 }
mbed_official 155:8435094ec241 394
mbed_official 155:8435094ec241 395 /* Filter activation */
mbed_official 155:8435094ec241 396 if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE)
mbed_official 155:8435094ec241 397 {
mbed_official 155:8435094ec241 398 CAN1->FA1R |= filter_number_bit_pos;
mbed_official 155:8435094ec241 399 }
mbed_official 155:8435094ec241 400
mbed_official 155:8435094ec241 401 /* Leave the initialisation mode for the filter */
mbed_official 155:8435094ec241 402 CAN1->FMR &= ~FMR_FINIT;
mbed_official 155:8435094ec241 403 }
mbed_official 155:8435094ec241 404
mbed_official 155:8435094ec241 405 /**
mbed_official 155:8435094ec241 406 * @brief Fills each CAN_InitStruct member with its default value.
mbed_official 155:8435094ec241 407 * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which ill be initialized.
mbed_official 155:8435094ec241 408 * @retval None
mbed_official 155:8435094ec241 409 */
mbed_official 155:8435094ec241 410 void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct)
mbed_official 155:8435094ec241 411 {
mbed_official 155:8435094ec241 412 /* Reset CAN init structure parameters values */
mbed_official 155:8435094ec241 413
mbed_official 155:8435094ec241 414 /* Initialize the time triggered communication mode */
mbed_official 155:8435094ec241 415 CAN_InitStruct->CAN_TTCM = DISABLE;
mbed_official 155:8435094ec241 416
mbed_official 155:8435094ec241 417 /* Initialize the automatic bus-off management */
mbed_official 155:8435094ec241 418 CAN_InitStruct->CAN_ABOM = DISABLE;
mbed_official 155:8435094ec241 419
mbed_official 155:8435094ec241 420 /* Initialize the automatic wake-up mode */
mbed_official 155:8435094ec241 421 CAN_InitStruct->CAN_AWUM = DISABLE;
mbed_official 155:8435094ec241 422
mbed_official 155:8435094ec241 423 /* Initialize the no automatic retransmission */
mbed_official 155:8435094ec241 424 CAN_InitStruct->CAN_NART = DISABLE;
mbed_official 155:8435094ec241 425
mbed_official 155:8435094ec241 426 /* Initialize the receive FIFO locked mode */
mbed_official 155:8435094ec241 427 CAN_InitStruct->CAN_RFLM = DISABLE;
mbed_official 155:8435094ec241 428
mbed_official 155:8435094ec241 429 /* Initialize the transmit FIFO priority */
mbed_official 155:8435094ec241 430 CAN_InitStruct->CAN_TXFP = DISABLE;
mbed_official 155:8435094ec241 431
mbed_official 155:8435094ec241 432 /* Initialize the CAN_Mode member */
mbed_official 155:8435094ec241 433 CAN_InitStruct->CAN_Mode = CAN_Mode_Normal;
mbed_official 155:8435094ec241 434
mbed_official 155:8435094ec241 435 /* Initialize the CAN_SJW member */
mbed_official 155:8435094ec241 436 CAN_InitStruct->CAN_SJW = CAN_SJW_1tq;
mbed_official 155:8435094ec241 437
mbed_official 155:8435094ec241 438 /* Initialize the CAN_BS1 member */
mbed_official 155:8435094ec241 439 CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq;
mbed_official 155:8435094ec241 440
mbed_official 155:8435094ec241 441 /* Initialize the CAN_BS2 member */
mbed_official 155:8435094ec241 442 CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq;
mbed_official 155:8435094ec241 443
mbed_official 155:8435094ec241 444 /* Initialize the CAN_Prescaler member */
mbed_official 155:8435094ec241 445 CAN_InitStruct->CAN_Prescaler = 1;
mbed_official 155:8435094ec241 446 }
mbed_official 155:8435094ec241 447
mbed_official 155:8435094ec241 448 /**
mbed_official 155:8435094ec241 449 * @brief Select the start bank filter for slave CAN.
mbed_official 155:8435094ec241 450 * @param CAN_BankNumber: Select the start slave bank filter from 1..27.
mbed_official 155:8435094ec241 451 * @retval None
mbed_official 155:8435094ec241 452 */
mbed_official 155:8435094ec241 453 void CAN_SlaveStartBank(uint8_t CAN_BankNumber)
mbed_official 155:8435094ec241 454 {
mbed_official 155:8435094ec241 455 /* Check the parameters */
mbed_official 155:8435094ec241 456 assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber));
mbed_official 155:8435094ec241 457
mbed_official 155:8435094ec241 458 /* Enter Initialisation mode for the filter */
mbed_official 155:8435094ec241 459 CAN1->FMR |= FMR_FINIT;
mbed_official 155:8435094ec241 460
mbed_official 155:8435094ec241 461 /* Select the start slave bank */
mbed_official 155:8435094ec241 462 CAN1->FMR &= (uint32_t)0xFFFFC0F1 ;
mbed_official 155:8435094ec241 463 CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8;
mbed_official 155:8435094ec241 464
mbed_official 155:8435094ec241 465 /* Leave Initialisation mode for the filter */
mbed_official 155:8435094ec241 466 CAN1->FMR &= ~FMR_FINIT;
mbed_official 155:8435094ec241 467 }
mbed_official 155:8435094ec241 468
mbed_official 155:8435094ec241 469 /**
mbed_official 155:8435094ec241 470 * @brief Enables or disables the DBG Freeze for CAN.
mbed_official 155:8435094ec241 471 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 472 * @param NewState: new state of the CAN peripheral.
mbed_official 155:8435094ec241 473 * This parameter can be: ENABLE (CAN reception/transmission is frozen
mbed_official 155:8435094ec241 474 * during debug. Reception FIFOs can still be accessed/controlled normally)
mbed_official 155:8435094ec241 475 * or DISABLE (CAN is working during debug).
mbed_official 155:8435094ec241 476 * @retval None
mbed_official 155:8435094ec241 477 */
mbed_official 155:8435094ec241 478 void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState)
mbed_official 155:8435094ec241 479 {
mbed_official 155:8435094ec241 480 /* Check the parameters */
mbed_official 155:8435094ec241 481 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 482 assert_param(IS_FUNCTIONAL_STATE(NewState));
mbed_official 155:8435094ec241 483
mbed_official 155:8435094ec241 484 if (NewState != DISABLE)
mbed_official 155:8435094ec241 485 {
mbed_official 155:8435094ec241 486 /* Enable Debug Freeze */
mbed_official 155:8435094ec241 487 CANx->MCR |= MCR_DBF;
mbed_official 155:8435094ec241 488 }
mbed_official 155:8435094ec241 489 else
mbed_official 155:8435094ec241 490 {
mbed_official 155:8435094ec241 491 /* Disable Debug Freeze */
mbed_official 155:8435094ec241 492 CANx->MCR &= ~MCR_DBF;
mbed_official 155:8435094ec241 493 }
mbed_official 155:8435094ec241 494 }
mbed_official 155:8435094ec241 495
mbed_official 155:8435094ec241 496 /**
mbed_official 155:8435094ec241 497 * @brief Enables or disables the CAN Time TriggerOperation communication mode.
mbed_official 155:8435094ec241 498 * @note DLC must be programmed as 8 in order Time Stamp (2 bytes) to be
mbed_official 155:8435094ec241 499 * sent over the CAN bus.
mbed_official 155:8435094ec241 500 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 501 * @param NewState: Mode new state. This parameter can be: ENABLE or DISABLE.
mbed_official 155:8435094ec241 502 * When enabled, Time stamp (TIME[15:0]) value is sent in the last two
mbed_official 155:8435094ec241 503 * data bytes of the 8-byte message: TIME[7:0] in data byte 6 and TIME[15:8]
mbed_official 155:8435094ec241 504 * in data byte 7.
mbed_official 155:8435094ec241 505 * @retval None
mbed_official 155:8435094ec241 506 */
mbed_official 155:8435094ec241 507 void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState)
mbed_official 155:8435094ec241 508 {
mbed_official 155:8435094ec241 509 /* Check the parameters */
mbed_official 155:8435094ec241 510 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 511 assert_param(IS_FUNCTIONAL_STATE(NewState));
mbed_official 155:8435094ec241 512 if (NewState != DISABLE)
mbed_official 155:8435094ec241 513 {
mbed_official 155:8435094ec241 514 /* Enable the TTCM mode */
mbed_official 155:8435094ec241 515 CANx->MCR |= CAN_MCR_TTCM;
mbed_official 155:8435094ec241 516
mbed_official 155:8435094ec241 517 /* Set TGT bits */
mbed_official 155:8435094ec241 518 CANx->sTxMailBox[0].TDTR |= ((uint32_t)CAN_TDT0R_TGT);
mbed_official 155:8435094ec241 519 CANx->sTxMailBox[1].TDTR |= ((uint32_t)CAN_TDT1R_TGT);
mbed_official 155:8435094ec241 520 CANx->sTxMailBox[2].TDTR |= ((uint32_t)CAN_TDT2R_TGT);
mbed_official 155:8435094ec241 521 }
mbed_official 155:8435094ec241 522 else
mbed_official 155:8435094ec241 523 {
mbed_official 155:8435094ec241 524 /* Disable the TTCM mode */
mbed_official 155:8435094ec241 525 CANx->MCR &= (uint32_t)(~(uint32_t)CAN_MCR_TTCM);
mbed_official 155:8435094ec241 526
mbed_official 155:8435094ec241 527 /* Reset TGT bits */
mbed_official 155:8435094ec241 528 CANx->sTxMailBox[0].TDTR &= ((uint32_t)~CAN_TDT0R_TGT);
mbed_official 155:8435094ec241 529 CANx->sTxMailBox[1].TDTR &= ((uint32_t)~CAN_TDT1R_TGT);
mbed_official 155:8435094ec241 530 CANx->sTxMailBox[2].TDTR &= ((uint32_t)~CAN_TDT2R_TGT);
mbed_official 155:8435094ec241 531 }
mbed_official 155:8435094ec241 532 }
mbed_official 155:8435094ec241 533 /**
mbed_official 155:8435094ec241 534 * @}
mbed_official 155:8435094ec241 535 */
mbed_official 155:8435094ec241 536
mbed_official 155:8435094ec241 537
mbed_official 155:8435094ec241 538 /** @defgroup CAN_Group2 CAN Frames Transmission functions
mbed_official 155:8435094ec241 539 * @brief CAN Frames Transmission functions
mbed_official 155:8435094ec241 540 *
mbed_official 155:8435094ec241 541 @verbatim
mbed_official 155:8435094ec241 542 ===============================================================================
mbed_official 155:8435094ec241 543 ##### CAN Frames Transmission functions #####
mbed_official 155:8435094ec241 544 ===============================================================================
mbed_official 155:8435094ec241 545 [..] This section provides functions allowing to
mbed_official 155:8435094ec241 546 (+) Initiate and transmit a CAN frame message (if there is an empty mailbox).
mbed_official 155:8435094ec241 547 (+) Check the transmission status of a CAN Frame.
mbed_official 155:8435094ec241 548 (+) Cancel a transmit request.
mbed_official 155:8435094ec241 549
mbed_official 155:8435094ec241 550 @endverbatim
mbed_official 155:8435094ec241 551 * @{
mbed_official 155:8435094ec241 552 */
mbed_official 155:8435094ec241 553
mbed_official 155:8435094ec241 554 /**
mbed_official 155:8435094ec241 555 * @brief Initiates and transmits a CAN frame message.
mbed_official 155:8435094ec241 556 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 557 * @param TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data.
mbed_official 155:8435094ec241 558 * @retval The number of the mailbox that is used for transmission or
mbed_official 155:8435094ec241 559 * CAN_TxStatus_NoMailBox if there is no empty mailbox.
mbed_official 155:8435094ec241 560 */
mbed_official 155:8435094ec241 561 uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
mbed_official 155:8435094ec241 562 {
mbed_official 155:8435094ec241 563 uint8_t transmit_mailbox = 0;
mbed_official 155:8435094ec241 564 /* Check the parameters */
mbed_official 155:8435094ec241 565 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 566 assert_param(IS_CAN_IDTYPE(TxMessage->IDE));
mbed_official 155:8435094ec241 567 assert_param(IS_CAN_RTR(TxMessage->RTR));
mbed_official 155:8435094ec241 568 assert_param(IS_CAN_DLC(TxMessage->DLC));
mbed_official 155:8435094ec241 569
mbed_official 155:8435094ec241 570 /* Select one empty transmit mailbox */
mbed_official 155:8435094ec241 571 if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
mbed_official 155:8435094ec241 572 {
mbed_official 155:8435094ec241 573 transmit_mailbox = 0;
mbed_official 155:8435094ec241 574 }
mbed_official 155:8435094ec241 575 else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
mbed_official 155:8435094ec241 576 {
mbed_official 155:8435094ec241 577 transmit_mailbox = 1;
mbed_official 155:8435094ec241 578 }
mbed_official 155:8435094ec241 579 else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
mbed_official 155:8435094ec241 580 {
mbed_official 155:8435094ec241 581 transmit_mailbox = 2;
mbed_official 155:8435094ec241 582 }
mbed_official 155:8435094ec241 583 else
mbed_official 155:8435094ec241 584 {
mbed_official 155:8435094ec241 585 transmit_mailbox = CAN_TxStatus_NoMailBox;
mbed_official 155:8435094ec241 586 }
mbed_official 155:8435094ec241 587
mbed_official 155:8435094ec241 588 if (transmit_mailbox != CAN_TxStatus_NoMailBox)
mbed_official 155:8435094ec241 589 {
mbed_official 155:8435094ec241 590 /* Set up the Id */
mbed_official 155:8435094ec241 591 CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ;
mbed_official 155:8435094ec241 592 if (TxMessage->IDE == CAN_Id_Standard)
mbed_official 155:8435094ec241 593 {
mbed_official 155:8435094ec241 594 assert_param(IS_CAN_STDID(TxMessage->StdId));
mbed_official 155:8435094ec241 595 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \
mbed_official 155:8435094ec241 596 TxMessage->RTR);
mbed_official 155:8435094ec241 597 }
mbed_official 155:8435094ec241 598 else
mbed_official 155:8435094ec241 599 {
mbed_official 155:8435094ec241 600 assert_param(IS_CAN_EXTID(TxMessage->ExtId));
mbed_official 155:8435094ec241 601 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \
mbed_official 155:8435094ec241 602 TxMessage->IDE | \
mbed_official 155:8435094ec241 603 TxMessage->RTR);
mbed_official 155:8435094ec241 604 }
mbed_official 155:8435094ec241 605
mbed_official 155:8435094ec241 606 /* Set up the DLC */
mbed_official 155:8435094ec241 607 TxMessage->DLC &= (uint8_t)0x0000000F;
mbed_official 155:8435094ec241 608 CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0;
mbed_official 155:8435094ec241 609 CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC;
mbed_official 155:8435094ec241 610
mbed_official 155:8435094ec241 611 /* Set up the data field */
mbed_official 155:8435094ec241 612 CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) |
mbed_official 155:8435094ec241 613 ((uint32_t)TxMessage->Data[2] << 16) |
mbed_official 155:8435094ec241 614 ((uint32_t)TxMessage->Data[1] << 8) |
mbed_official 155:8435094ec241 615 ((uint32_t)TxMessage->Data[0]));
mbed_official 155:8435094ec241 616 CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) |
mbed_official 155:8435094ec241 617 ((uint32_t)TxMessage->Data[6] << 16) |
mbed_official 155:8435094ec241 618 ((uint32_t)TxMessage->Data[5] << 8) |
mbed_official 155:8435094ec241 619 ((uint32_t)TxMessage->Data[4]));
mbed_official 155:8435094ec241 620 /* Request transmission */
mbed_official 155:8435094ec241 621 CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ;
mbed_official 155:8435094ec241 622 }
mbed_official 155:8435094ec241 623 return transmit_mailbox;
mbed_official 155:8435094ec241 624 }
mbed_official 155:8435094ec241 625
mbed_official 155:8435094ec241 626 /**
mbed_official 155:8435094ec241 627 * @brief Checks the transmission status of a CAN Frame.
mbed_official 155:8435094ec241 628 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 629 * @param TransmitMailbox: the number of the mailbox that is used for transmission.
mbed_official 155:8435094ec241 630 * @retval CAN_TxStatus_Ok if the CAN driver transmits the message,
mbed_official 155:8435094ec241 631 * CAN_TxStatus_Failed in an other case.
mbed_official 155:8435094ec241 632 */
mbed_official 155:8435094ec241 633 uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox)
mbed_official 155:8435094ec241 634 {
mbed_official 155:8435094ec241 635 uint32_t state = 0;
mbed_official 155:8435094ec241 636
mbed_official 155:8435094ec241 637 /* Check the parameters */
mbed_official 155:8435094ec241 638 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 639 assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox));
mbed_official 155:8435094ec241 640
mbed_official 155:8435094ec241 641 switch (TransmitMailbox)
mbed_official 155:8435094ec241 642 {
mbed_official 155:8435094ec241 643 case (CAN_TXMAILBOX_0):
mbed_official 155:8435094ec241 644 state = CANx->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
mbed_official 155:8435094ec241 645 break;
mbed_official 155:8435094ec241 646 case (CAN_TXMAILBOX_1):
mbed_official 155:8435094ec241 647 state = CANx->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
mbed_official 155:8435094ec241 648 break;
mbed_official 155:8435094ec241 649 case (CAN_TXMAILBOX_2):
mbed_official 155:8435094ec241 650 state = CANx->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
mbed_official 155:8435094ec241 651 break;
mbed_official 155:8435094ec241 652 default:
mbed_official 155:8435094ec241 653 state = CAN_TxStatus_Failed;
mbed_official 155:8435094ec241 654 break;
mbed_official 155:8435094ec241 655 }
mbed_official 155:8435094ec241 656 switch (state)
mbed_official 155:8435094ec241 657 {
mbed_official 155:8435094ec241 658 /* transmit pending */
mbed_official 155:8435094ec241 659 case (0x0): state = CAN_TxStatus_Pending;
mbed_official 155:8435094ec241 660 break;
mbed_official 155:8435094ec241 661 /* transmit failed */
mbed_official 155:8435094ec241 662 case (CAN_TSR_RQCP0 | CAN_TSR_TME0): state = CAN_TxStatus_Failed;
mbed_official 155:8435094ec241 663 break;
mbed_official 155:8435094ec241 664 case (CAN_TSR_RQCP1 | CAN_TSR_TME1): state = CAN_TxStatus_Failed;
mbed_official 155:8435094ec241 665 break;
mbed_official 155:8435094ec241 666 case (CAN_TSR_RQCP2 | CAN_TSR_TME2): state = CAN_TxStatus_Failed;
mbed_official 155:8435094ec241 667 break;
mbed_official 155:8435094ec241 668 /* transmit succeeded */
mbed_official 155:8435094ec241 669 case (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0):state = CAN_TxStatus_Ok;
mbed_official 155:8435094ec241 670 break;
mbed_official 155:8435094ec241 671 case (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1):state = CAN_TxStatus_Ok;
mbed_official 155:8435094ec241 672 break;
mbed_official 155:8435094ec241 673 case (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2):state = CAN_TxStatus_Ok;
mbed_official 155:8435094ec241 674 break;
mbed_official 155:8435094ec241 675 default: state = CAN_TxStatus_Failed;
mbed_official 155:8435094ec241 676 break;
mbed_official 155:8435094ec241 677 }
mbed_official 155:8435094ec241 678 return (uint8_t) state;
mbed_official 155:8435094ec241 679 }
mbed_official 155:8435094ec241 680
mbed_official 155:8435094ec241 681 /**
mbed_official 155:8435094ec241 682 * @brief Cancels a transmit request.
mbed_official 155:8435094ec241 683 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 684 * @param Mailbox: Mailbox number.
mbed_official 155:8435094ec241 685 * @retval None
mbed_official 155:8435094ec241 686 */
mbed_official 155:8435094ec241 687 void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox)
mbed_official 155:8435094ec241 688 {
mbed_official 155:8435094ec241 689 /* Check the parameters */
mbed_official 155:8435094ec241 690 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 691 assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox));
mbed_official 155:8435094ec241 692 /* abort transmission */
mbed_official 155:8435094ec241 693 switch (Mailbox)
mbed_official 155:8435094ec241 694 {
mbed_official 155:8435094ec241 695 case (CAN_TXMAILBOX_0): CANx->TSR |= CAN_TSR_ABRQ0;
mbed_official 155:8435094ec241 696 break;
mbed_official 155:8435094ec241 697 case (CAN_TXMAILBOX_1): CANx->TSR |= CAN_TSR_ABRQ1;
mbed_official 155:8435094ec241 698 break;
mbed_official 155:8435094ec241 699 case (CAN_TXMAILBOX_2): CANx->TSR |= CAN_TSR_ABRQ2;
mbed_official 155:8435094ec241 700 break;
mbed_official 155:8435094ec241 701 default:
mbed_official 155:8435094ec241 702 break;
mbed_official 155:8435094ec241 703 }
mbed_official 155:8435094ec241 704 }
mbed_official 155:8435094ec241 705 /**
mbed_official 155:8435094ec241 706 * @}
mbed_official 155:8435094ec241 707 */
mbed_official 155:8435094ec241 708
mbed_official 155:8435094ec241 709
mbed_official 155:8435094ec241 710 /** @defgroup CAN_Group3 CAN Frames Reception functions
mbed_official 155:8435094ec241 711 * @brief CAN Frames Reception functions
mbed_official 155:8435094ec241 712 *
mbed_official 155:8435094ec241 713 @verbatim
mbed_official 155:8435094ec241 714 ===============================================================================
mbed_official 155:8435094ec241 715 ##### CAN Frames Reception functions #####
mbed_official 155:8435094ec241 716 ===============================================================================
mbed_official 155:8435094ec241 717 [..] This section provides functions allowing to
mbed_official 155:8435094ec241 718 (+) Receive a correct CAN frame.
mbed_official 155:8435094ec241 719 (+) Release a specified receive FIFO (2 FIFOs are available).
mbed_official 155:8435094ec241 720 (+) Return the number of the pending received CAN frames.
mbed_official 155:8435094ec241 721
mbed_official 155:8435094ec241 722 @endverbatim
mbed_official 155:8435094ec241 723 * @{
mbed_official 155:8435094ec241 724 */
mbed_official 155:8435094ec241 725
mbed_official 155:8435094ec241 726 /**
mbed_official 155:8435094ec241 727 * @brief Receives a correct CAN frame.
mbed_official 155:8435094ec241 728 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 729 * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
mbed_official 155:8435094ec241 730 * @param RxMessage: pointer to a structure receive frame which contains CAN Id,
mbed_official 155:8435094ec241 731 * CAN DLC, CAN data and FMI number.
mbed_official 155:8435094ec241 732 * @retval None
mbed_official 155:8435094ec241 733 */
mbed_official 155:8435094ec241 734 void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)
mbed_official 155:8435094ec241 735 {
mbed_official 155:8435094ec241 736 /* Check the parameters */
mbed_official 155:8435094ec241 737 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 738 assert_param(IS_CAN_FIFO(FIFONumber));
mbed_official 155:8435094ec241 739 /* Get the Id */
mbed_official 155:8435094ec241 740 RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR;
mbed_official 155:8435094ec241 741 if (RxMessage->IDE == CAN_Id_Standard)
mbed_official 155:8435094ec241 742 {
mbed_official 155:8435094ec241 743 RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21);
mbed_official 155:8435094ec241 744 }
mbed_official 155:8435094ec241 745 else
mbed_official 155:8435094ec241 746 {
mbed_official 155:8435094ec241 747 RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3);
mbed_official 155:8435094ec241 748 }
mbed_official 155:8435094ec241 749
mbed_official 155:8435094ec241 750 RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR;
mbed_official 155:8435094ec241 751 /* Get the DLC */
mbed_official 155:8435094ec241 752 RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR;
mbed_official 155:8435094ec241 753 /* Get the FMI */
mbed_official 155:8435094ec241 754 RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8);
mbed_official 155:8435094ec241 755 /* Get the data field */
mbed_official 155:8435094ec241 756 RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR;
mbed_official 155:8435094ec241 757 RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8);
mbed_official 155:8435094ec241 758 RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16);
mbed_official 155:8435094ec241 759 RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24);
mbed_official 155:8435094ec241 760 RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR;
mbed_official 155:8435094ec241 761 RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8);
mbed_official 155:8435094ec241 762 RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16);
mbed_official 155:8435094ec241 763 RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24);
mbed_official 155:8435094ec241 764 /* Release the FIFO */
mbed_official 155:8435094ec241 765 /* Release FIFO0 */
mbed_official 155:8435094ec241 766 if (FIFONumber == CAN_FIFO0)
mbed_official 155:8435094ec241 767 {
mbed_official 155:8435094ec241 768 CANx->RF0R |= CAN_RF0R_RFOM0;
mbed_official 155:8435094ec241 769 }
mbed_official 155:8435094ec241 770 /* Release FIFO1 */
mbed_official 155:8435094ec241 771 else /* FIFONumber == CAN_FIFO1 */
mbed_official 155:8435094ec241 772 {
mbed_official 155:8435094ec241 773 CANx->RF1R |= CAN_RF1R_RFOM1;
mbed_official 155:8435094ec241 774 }
mbed_official 155:8435094ec241 775 }
mbed_official 155:8435094ec241 776
mbed_official 155:8435094ec241 777 /**
mbed_official 155:8435094ec241 778 * @brief Releases the specified receive FIFO.
mbed_official 155:8435094ec241 779 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 780 * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1.
mbed_official 155:8435094ec241 781 * @retval None
mbed_official 155:8435094ec241 782 */
mbed_official 155:8435094ec241 783 void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber)
mbed_official 155:8435094ec241 784 {
mbed_official 155:8435094ec241 785 /* Check the parameters */
mbed_official 155:8435094ec241 786 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 787 assert_param(IS_CAN_FIFO(FIFONumber));
mbed_official 155:8435094ec241 788 /* Release FIFO0 */
mbed_official 155:8435094ec241 789 if (FIFONumber == CAN_FIFO0)
mbed_official 155:8435094ec241 790 {
mbed_official 155:8435094ec241 791 CANx->RF0R |= CAN_RF0R_RFOM0;
mbed_official 155:8435094ec241 792 }
mbed_official 155:8435094ec241 793 /* Release FIFO1 */
mbed_official 155:8435094ec241 794 else /* FIFONumber == CAN_FIFO1 */
mbed_official 155:8435094ec241 795 {
mbed_official 155:8435094ec241 796 CANx->RF1R |= CAN_RF1R_RFOM1;
mbed_official 155:8435094ec241 797 }
mbed_official 155:8435094ec241 798 }
mbed_official 155:8435094ec241 799
mbed_official 155:8435094ec241 800 /**
mbed_official 155:8435094ec241 801 * @brief Returns the number of pending received messages.
mbed_official 155:8435094ec241 802 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 803 * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
mbed_official 155:8435094ec241 804 * @retval NbMessage : which is the number of pending message.
mbed_official 155:8435094ec241 805 */
mbed_official 155:8435094ec241 806 uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber)
mbed_official 155:8435094ec241 807 {
mbed_official 155:8435094ec241 808 uint8_t message_pending=0;
mbed_official 155:8435094ec241 809 /* Check the parameters */
mbed_official 155:8435094ec241 810 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 811 assert_param(IS_CAN_FIFO(FIFONumber));
mbed_official 155:8435094ec241 812 if (FIFONumber == CAN_FIFO0)
mbed_official 155:8435094ec241 813 {
mbed_official 155:8435094ec241 814 message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03);
mbed_official 155:8435094ec241 815 }
mbed_official 155:8435094ec241 816 else if (FIFONumber == CAN_FIFO1)
mbed_official 155:8435094ec241 817 {
mbed_official 155:8435094ec241 818 message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03);
mbed_official 155:8435094ec241 819 }
mbed_official 155:8435094ec241 820 else
mbed_official 155:8435094ec241 821 {
mbed_official 155:8435094ec241 822 message_pending = 0;
mbed_official 155:8435094ec241 823 }
mbed_official 155:8435094ec241 824 return message_pending;
mbed_official 155:8435094ec241 825 }
mbed_official 155:8435094ec241 826 /**
mbed_official 155:8435094ec241 827 * @}
mbed_official 155:8435094ec241 828 */
mbed_official 155:8435094ec241 829
mbed_official 155:8435094ec241 830
mbed_official 155:8435094ec241 831 /** @defgroup CAN_Group4 CAN Operation modes functions
mbed_official 155:8435094ec241 832 * @brief CAN Operation modes functions
mbed_official 155:8435094ec241 833 *
mbed_official 155:8435094ec241 834 @verbatim
mbed_official 155:8435094ec241 835 ===============================================================================
mbed_official 155:8435094ec241 836 ##### CAN Operation modes functions #####
mbed_official 155:8435094ec241 837 ===============================================================================
mbed_official 155:8435094ec241 838 [..] This section provides functions allowing to select the CAN Operation modes:
mbed_official 155:8435094ec241 839 (+) sleep mode.
mbed_official 155:8435094ec241 840 (+) normal mode.
mbed_official 155:8435094ec241 841 (+) initialization mode.
mbed_official 155:8435094ec241 842
mbed_official 155:8435094ec241 843 @endverbatim
mbed_official 155:8435094ec241 844 * @{
mbed_official 155:8435094ec241 845 */
mbed_official 155:8435094ec241 846
mbed_official 155:8435094ec241 847
mbed_official 155:8435094ec241 848 /**
mbed_official 155:8435094ec241 849 * @brief Selects the CAN Operation mode.
mbed_official 155:8435094ec241 850 * @param CAN_OperatingMode: CAN Operating Mode.
mbed_official 155:8435094ec241 851 * This parameter can be one of @ref CAN_OperatingMode_TypeDef enumeration.
mbed_official 155:8435094ec241 852 * @retval status of the requested mode which can be:
mbed_official 155:8435094ec241 853 * - CAN_ModeStatus_Failed: CAN failed entering the specific mode
mbed_official 155:8435094ec241 854 * - CAN_ModeStatus_Success: CAN Succeed entering the specific mode
mbed_official 155:8435094ec241 855 */
mbed_official 155:8435094ec241 856 uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode)
mbed_official 155:8435094ec241 857 {
mbed_official 155:8435094ec241 858 uint8_t status = CAN_ModeStatus_Failed;
mbed_official 155:8435094ec241 859
mbed_official 155:8435094ec241 860 /* Timeout for INAK or also for SLAK bits*/
mbed_official 155:8435094ec241 861 uint32_t timeout = INAK_TIMEOUT;
mbed_official 155:8435094ec241 862
mbed_official 155:8435094ec241 863 /* Check the parameters */
mbed_official 155:8435094ec241 864 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 865 assert_param(IS_CAN_OPERATING_MODE(CAN_OperatingMode));
mbed_official 155:8435094ec241 866
mbed_official 155:8435094ec241 867 if (CAN_OperatingMode == CAN_OperatingMode_Initialization)
mbed_official 155:8435094ec241 868 {
mbed_official 155:8435094ec241 869 /* Request initialisation */
mbed_official 155:8435094ec241 870 CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_SLEEP)) | CAN_MCR_INRQ);
mbed_official 155:8435094ec241 871
mbed_official 155:8435094ec241 872 /* Wait the acknowledge */
mbed_official 155:8435094ec241 873 while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) && (timeout != 0))
mbed_official 155:8435094ec241 874 {
mbed_official 155:8435094ec241 875 timeout--;
mbed_official 155:8435094ec241 876 }
mbed_official 155:8435094ec241 877 if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK)
mbed_official 155:8435094ec241 878 {
mbed_official 155:8435094ec241 879 status = CAN_ModeStatus_Failed;
mbed_official 155:8435094ec241 880 }
mbed_official 155:8435094ec241 881 else
mbed_official 155:8435094ec241 882 {
mbed_official 155:8435094ec241 883 status = CAN_ModeStatus_Success;
mbed_official 155:8435094ec241 884 }
mbed_official 155:8435094ec241 885 }
mbed_official 155:8435094ec241 886 else if (CAN_OperatingMode == CAN_OperatingMode_Normal)
mbed_official 155:8435094ec241 887 {
mbed_official 155:8435094ec241 888 /* Request leave initialisation and sleep mode and enter Normal mode */
mbed_official 155:8435094ec241 889 CANx->MCR &= (uint32_t)(~(CAN_MCR_SLEEP|CAN_MCR_INRQ));
mbed_official 155:8435094ec241 890
mbed_official 155:8435094ec241 891 /* Wait the acknowledge */
mbed_official 155:8435094ec241 892 while (((CANx->MSR & CAN_MODE_MASK) != 0) && (timeout!=0))
mbed_official 155:8435094ec241 893 {
mbed_official 155:8435094ec241 894 timeout--;
mbed_official 155:8435094ec241 895 }
mbed_official 155:8435094ec241 896 if ((CANx->MSR & CAN_MODE_MASK) != 0)
mbed_official 155:8435094ec241 897 {
mbed_official 155:8435094ec241 898 status = CAN_ModeStatus_Failed;
mbed_official 155:8435094ec241 899 }
mbed_official 155:8435094ec241 900 else
mbed_official 155:8435094ec241 901 {
mbed_official 155:8435094ec241 902 status = CAN_ModeStatus_Success;
mbed_official 155:8435094ec241 903 }
mbed_official 155:8435094ec241 904 }
mbed_official 155:8435094ec241 905 else if (CAN_OperatingMode == CAN_OperatingMode_Sleep)
mbed_official 155:8435094ec241 906 {
mbed_official 155:8435094ec241 907 /* Request Sleep mode */
mbed_official 155:8435094ec241 908 CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP);
mbed_official 155:8435094ec241 909
mbed_official 155:8435094ec241 910 /* Wait the acknowledge */
mbed_official 155:8435094ec241 911 while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) && (timeout!=0))
mbed_official 155:8435094ec241 912 {
mbed_official 155:8435094ec241 913 timeout--;
mbed_official 155:8435094ec241 914 }
mbed_official 155:8435094ec241 915 if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK)
mbed_official 155:8435094ec241 916 {
mbed_official 155:8435094ec241 917 status = CAN_ModeStatus_Failed;
mbed_official 155:8435094ec241 918 }
mbed_official 155:8435094ec241 919 else
mbed_official 155:8435094ec241 920 {
mbed_official 155:8435094ec241 921 status = CAN_ModeStatus_Success;
mbed_official 155:8435094ec241 922 }
mbed_official 155:8435094ec241 923 }
mbed_official 155:8435094ec241 924 else
mbed_official 155:8435094ec241 925 {
mbed_official 155:8435094ec241 926 status = CAN_ModeStatus_Failed;
mbed_official 155:8435094ec241 927 }
mbed_official 155:8435094ec241 928
mbed_official 155:8435094ec241 929 return (uint8_t) status;
mbed_official 155:8435094ec241 930 }
mbed_official 155:8435094ec241 931
mbed_official 155:8435094ec241 932 /**
mbed_official 155:8435094ec241 933 * @brief Enters the Sleep (low power) mode.
mbed_official 155:8435094ec241 934 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 935 * @retval CAN_Sleep_Ok if sleep entered, CAN_Sleep_Failed otherwise.
mbed_official 155:8435094ec241 936 */
mbed_official 155:8435094ec241 937 uint8_t CAN_Sleep(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 938 {
mbed_official 155:8435094ec241 939 uint8_t sleepstatus = CAN_Sleep_Failed;
mbed_official 155:8435094ec241 940
mbed_official 155:8435094ec241 941 /* Check the parameters */
mbed_official 155:8435094ec241 942 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 943
mbed_official 155:8435094ec241 944 /* Request Sleep mode */
mbed_official 155:8435094ec241 945 CANx->MCR = (((CANx->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP);
mbed_official 155:8435094ec241 946
mbed_official 155:8435094ec241 947 /* Sleep mode status */
mbed_official 155:8435094ec241 948 if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK)
mbed_official 155:8435094ec241 949 {
mbed_official 155:8435094ec241 950 /* Sleep mode not entered */
mbed_official 155:8435094ec241 951 sleepstatus = CAN_Sleep_Ok;
mbed_official 155:8435094ec241 952 }
mbed_official 155:8435094ec241 953 /* return sleep mode status */
mbed_official 155:8435094ec241 954 return (uint8_t)sleepstatus;
mbed_official 155:8435094ec241 955 }
mbed_official 155:8435094ec241 956
mbed_official 155:8435094ec241 957 /**
mbed_official 155:8435094ec241 958 * @brief Wakes up the CAN peripheral from sleep mode .
mbed_official 155:8435094ec241 959 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 960 * @retval CAN_WakeUp_Ok if sleep mode left, CAN_WakeUp_Failed otherwise.
mbed_official 155:8435094ec241 961 */
mbed_official 155:8435094ec241 962 uint8_t CAN_WakeUp(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 963 {
mbed_official 155:8435094ec241 964 uint32_t wait_slak = SLAK_TIMEOUT;
mbed_official 155:8435094ec241 965 uint8_t wakeupstatus = CAN_WakeUp_Failed;
mbed_official 155:8435094ec241 966
mbed_official 155:8435094ec241 967 /* Check the parameters */
mbed_official 155:8435094ec241 968 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 969
mbed_official 155:8435094ec241 970 /* Wake up request */
mbed_official 155:8435094ec241 971 CANx->MCR &= ~(uint32_t)CAN_MCR_SLEEP;
mbed_official 155:8435094ec241 972
mbed_official 155:8435094ec241 973 /* Sleep mode status */
mbed_official 155:8435094ec241 974 while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00))
mbed_official 155:8435094ec241 975 {
mbed_official 155:8435094ec241 976 wait_slak--;
mbed_official 155:8435094ec241 977 }
mbed_official 155:8435094ec241 978 if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK)
mbed_official 155:8435094ec241 979 {
mbed_official 155:8435094ec241 980 /* wake up done : Sleep mode exited */
mbed_official 155:8435094ec241 981 wakeupstatus = CAN_WakeUp_Ok;
mbed_official 155:8435094ec241 982 }
mbed_official 155:8435094ec241 983 /* return wakeup status */
mbed_official 155:8435094ec241 984 return (uint8_t)wakeupstatus;
mbed_official 155:8435094ec241 985 }
mbed_official 155:8435094ec241 986 /**
mbed_official 155:8435094ec241 987 * @}
mbed_official 155:8435094ec241 988 */
mbed_official 155:8435094ec241 989
mbed_official 155:8435094ec241 990
mbed_official 155:8435094ec241 991 /** @defgroup CAN_Group5 CAN Bus Error management functions
mbed_official 155:8435094ec241 992 * @brief CAN Bus Error management functions
mbed_official 155:8435094ec241 993 *
mbed_official 155:8435094ec241 994 @verbatim
mbed_official 155:8435094ec241 995 ===============================================================================
mbed_official 155:8435094ec241 996 ##### CAN Bus Error management functions #####
mbed_official 155:8435094ec241 997 ===============================================================================
mbed_official 155:8435094ec241 998 [..] This section provides functions allowing to
mbed_official 155:8435094ec241 999 (+) Return the CANx's last error code (LEC).
mbed_official 155:8435094ec241 1000 (+) Return the CANx Receive Error Counter (REC).
mbed_official 155:8435094ec241 1001 (+) Return the LSB of the 9-bit CANx Transmit Error Counter(TEC).
mbed_official 155:8435094ec241 1002 [..]
mbed_official 155:8435094ec241 1003 (@) If TEC is greater than 255, The CAN is in bus-off state.
mbed_official 155:8435094ec241 1004 (@) If REC or TEC are greater than 96, an Error warning flag occurs.
mbed_official 155:8435094ec241 1005 (@) If REC or TEC are greater than 127, an Error Passive Flag occurs.
mbed_official 155:8435094ec241 1006
mbed_official 155:8435094ec241 1007 @endverbatim
mbed_official 155:8435094ec241 1008 * @{
mbed_official 155:8435094ec241 1009 */
mbed_official 155:8435094ec241 1010
mbed_official 155:8435094ec241 1011 /**
mbed_official 155:8435094ec241 1012 * @brief Returns the CANx's last error code (LEC).
mbed_official 155:8435094ec241 1013 * @param CANx: where x can be 1 to select the CAN1 peripheral.
mbed_official 155:8435094ec241 1014 * @retval Error code:
mbed_official 155:8435094ec241 1015 * - CAN_ERRORCODE_NoErr: No Error
mbed_official 155:8435094ec241 1016 * - CAN_ERRORCODE_StuffErr: Stuff Error
mbed_official 155:8435094ec241 1017 * - CAN_ERRORCODE_FormErr: Form Error
mbed_official 155:8435094ec241 1018 * - CAN_ERRORCODE_ACKErr : Acknowledgment Error
mbed_official 155:8435094ec241 1019 * - CAN_ERRORCODE_BitRecessiveErr: Bit Recessive Error
mbed_official 155:8435094ec241 1020 * - CAN_ERRORCODE_BitDominantErr: Bit Dominant Error
mbed_official 155:8435094ec241 1021 * - CAN_ERRORCODE_CRCErr: CRC Error
mbed_official 155:8435094ec241 1022 * - CAN_ERRORCODE_SoftwareSetErr: Software Set Error
mbed_official 155:8435094ec241 1023 */
mbed_official 155:8435094ec241 1024 uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 1025 {
mbed_official 155:8435094ec241 1026 uint8_t errorcode=0;
mbed_official 155:8435094ec241 1027
mbed_official 155:8435094ec241 1028 /* Check the parameters */
mbed_official 155:8435094ec241 1029 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1030
mbed_official 155:8435094ec241 1031 /* Get the error code*/
mbed_official 155:8435094ec241 1032 errorcode = (((uint8_t)CANx->ESR) & (uint8_t)CAN_ESR_LEC);
mbed_official 155:8435094ec241 1033
mbed_official 155:8435094ec241 1034 /* Return the error code*/
mbed_official 155:8435094ec241 1035 return errorcode;
mbed_official 155:8435094ec241 1036 }
mbed_official 155:8435094ec241 1037
mbed_official 155:8435094ec241 1038 /**
mbed_official 155:8435094ec241 1039 * @brief Returns the CANx Receive Error Counter (REC).
mbed_official 155:8435094ec241 1040 * @note In case of an error during reception, this counter is incremented
mbed_official 155:8435094ec241 1041 * by 1 or by 8 depending on the error condition as defined by the CAN
mbed_official 155:8435094ec241 1042 * standard. After every successful reception, the counter is
mbed_official 155:8435094ec241 1043 * decremented by 1 or reset to 120 if its value was higher than 128.
mbed_official 155:8435094ec241 1044 * When the counter value exceeds 127, the CAN controller enters the
mbed_official 155:8435094ec241 1045 * error passive state.
mbed_official 155:8435094ec241 1046 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1047 * @retval CAN Receive Error Counter.
mbed_official 155:8435094ec241 1048 */
mbed_official 155:8435094ec241 1049 uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 1050 {
mbed_official 155:8435094ec241 1051 uint8_t counter=0;
mbed_official 155:8435094ec241 1052
mbed_official 155:8435094ec241 1053 /* Check the parameters */
mbed_official 155:8435094ec241 1054 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1055
mbed_official 155:8435094ec241 1056 /* Get the Receive Error Counter*/
mbed_official 155:8435094ec241 1057 counter = (uint8_t)((CANx->ESR & CAN_ESR_REC)>> 24);
mbed_official 155:8435094ec241 1058
mbed_official 155:8435094ec241 1059 /* Return the Receive Error Counter*/
mbed_official 155:8435094ec241 1060 return counter;
mbed_official 155:8435094ec241 1061 }
mbed_official 155:8435094ec241 1062
mbed_official 155:8435094ec241 1063
mbed_official 155:8435094ec241 1064 /**
mbed_official 155:8435094ec241 1065 * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC).
mbed_official 155:8435094ec241 1066 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1067 * @retval LSB of the 9-bit CAN Transmit Error Counter.
mbed_official 155:8435094ec241 1068 */
mbed_official 155:8435094ec241 1069 uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx)
mbed_official 155:8435094ec241 1070 {
mbed_official 155:8435094ec241 1071 uint8_t counter=0;
mbed_official 155:8435094ec241 1072
mbed_official 155:8435094ec241 1073 /* Check the parameters */
mbed_official 155:8435094ec241 1074 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1075
mbed_official 155:8435094ec241 1076 /* Get the LSB of the 9-bit CANx Transmit Error Counter(TEC) */
mbed_official 155:8435094ec241 1077 counter = (uint8_t)((CANx->ESR & CAN_ESR_TEC)>> 16);
mbed_official 155:8435094ec241 1078
mbed_official 155:8435094ec241 1079 /* Return the LSB of the 9-bit CANx Transmit Error Counter(TEC) */
mbed_official 155:8435094ec241 1080 return counter;
mbed_official 155:8435094ec241 1081 }
mbed_official 155:8435094ec241 1082 /**
mbed_official 155:8435094ec241 1083 * @}
mbed_official 155:8435094ec241 1084 */
mbed_official 155:8435094ec241 1085
mbed_official 155:8435094ec241 1086 /** @defgroup CAN_Group6 Interrupts and flags management functions
mbed_official 155:8435094ec241 1087 * @brief Interrupts and flags management functions
mbed_official 155:8435094ec241 1088 *
mbed_official 155:8435094ec241 1089 @verbatim
mbed_official 155:8435094ec241 1090 ===============================================================================
mbed_official 155:8435094ec241 1091 ##### Interrupts and flags management functions #####
mbed_official 155:8435094ec241 1092 ===============================================================================
mbed_official 155:8435094ec241 1093 [..] This section provides functions allowing to configure the CAN Interrupts
mbed_official 155:8435094ec241 1094 and to get the status and clear flags and Interrupts pending bits.
mbed_official 155:8435094ec241 1095 [..] The CAN provides 14 Interrupts sources and 15 Flags:
mbed_official 155:8435094ec241 1096
mbed_official 155:8435094ec241 1097 *** Flags ***
mbed_official 155:8435094ec241 1098 =============
mbed_official 155:8435094ec241 1099 [..] The 15 flags can be divided on 4 groups:
mbed_official 155:8435094ec241 1100 (+) Transmit Flags:
mbed_official 155:8435094ec241 1101 (++) CAN_FLAG_RQCP0.
mbed_official 155:8435094ec241 1102 (++) CAN_FLAG_RQCP1.
mbed_official 155:8435094ec241 1103 (++) CAN_FLAG_RQCP2: Request completed MailBoxes 0, 1 and 2 Flags
mbed_official 155:8435094ec241 1104 Set when when the last request (transmit or abort) has
mbed_official 155:8435094ec241 1105 been performed.
mbed_official 155:8435094ec241 1106 (+) Receive Flags:
mbed_official 155:8435094ec241 1107 (++) CAN_FLAG_FMP0.
mbed_official 155:8435094ec241 1108 (++) CAN_FLAG_FMP1: FIFO 0 and 1 Message Pending Flags;
mbed_official 155:8435094ec241 1109 Set to signal that messages are pending in the receive FIFO.
mbed_official 155:8435094ec241 1110 These Flags are cleared only by hardware.
mbed_official 155:8435094ec241 1111 (++) CAN_FLAG_FF0.
mbed_official 155:8435094ec241 1112 (++) CAN_FLAG_FF1: FIFO 0 and 1 Full Flags;
mbed_official 155:8435094ec241 1113 Set when three messages are stored in the selected FIFO.
mbed_official 155:8435094ec241 1114 (++) CAN_FLAG_FOV0.
mbed_official 155:8435094ec241 1115 (++) CAN_FLAG_FOV1: FIFO 0 and 1 Overrun Flags;
mbed_official 155:8435094ec241 1116 Set when a new message has been received and passed the filter
mbed_official 155:8435094ec241 1117 while the FIFO was full.
mbed_official 155:8435094ec241 1118 (+) Operating Mode Flags:
mbed_official 155:8435094ec241 1119 (++) CAN_FLAG_WKU: Wake up Flag;
mbed_official 155:8435094ec241 1120 Set to signal that a SOF bit has been detected while the CAN
mbed_official 155:8435094ec241 1121 hardware was in Sleep mode.
mbed_official 155:8435094ec241 1122 (++) CAN_FLAG_SLAK: Sleep acknowledge Flag;
mbed_official 155:8435094ec241 1123 Set to signal that the CAN has entered Sleep Mode.
mbed_official 155:8435094ec241 1124 (+) Error Flags:
mbed_official 155:8435094ec241 1125 (++) CAN_FLAG_EWG: Error Warning Flag;
mbed_official 155:8435094ec241 1126 Set when the warning limit has been reached (Receive Error Counter
mbed_official 155:8435094ec241 1127 or Transmit Error Counter greater than 96).
mbed_official 155:8435094ec241 1128 This Flag is cleared only by hardware.
mbed_official 155:8435094ec241 1129 (++) CAN_FLAG_EPV: Error Passive Flag;
mbed_official 155:8435094ec241 1130 Set when the Error Passive limit has been reached (Receive Error
mbed_official 155:8435094ec241 1131 Counter or Transmit Error Counter greater than 127).
mbed_official 155:8435094ec241 1132 This Flag is cleared only by hardware.
mbed_official 155:8435094ec241 1133 (++) CAN_FLAG_BOF: Bus-Off Flag;
mbed_official 155:8435094ec241 1134 Set when CAN enters the bus-off state. The bus-off state is
mbed_official 155:8435094ec241 1135 entered on TEC overflow, greater than 255.
mbed_official 155:8435094ec241 1136 This Flag is cleared only by hardware.
mbed_official 155:8435094ec241 1137 (++) CAN_FLAG_LEC: Last error code Flag;
mbed_official 155:8435094ec241 1138 Set If a message has been transferred (reception or transmission)
mbed_official 155:8435094ec241 1139 with error, and the error code is hold.
mbed_official 155:8435094ec241 1140
mbed_official 155:8435094ec241 1141 *** Interrupts ***
mbed_official 155:8435094ec241 1142 ==================
mbed_official 155:8435094ec241 1143 [..] The 14 interrupts can be divided on 4 groups:
mbed_official 155:8435094ec241 1144 (+) Transmit interrupt:
mbed_official 155:8435094ec241 1145 (++) CAN_IT_TME: Transmit mailbox empty Interrupt;
mbed_official 155:8435094ec241 1146 If enabled, this interrupt source is pending when no transmit
mbed_official 155:8435094ec241 1147 request are pending for Tx mailboxes.
mbed_official 155:8435094ec241 1148 (+) Receive Interrupts:
mbed_official 155:8435094ec241 1149 (++) CAN_IT_FMP0.
mbed_official 155:8435094ec241 1150 (++) CAN_IT_FMP1: FIFO 0 and FIFO1 message pending Interrupts;
mbed_official 155:8435094ec241 1151 If enabled, these interrupt sources are pending when messages
mbed_official 155:8435094ec241 1152 are pending in the receive FIFO.
mbed_official 155:8435094ec241 1153 The corresponding interrupt pending bits are cleared only by hardware.
mbed_official 155:8435094ec241 1154 (++) CAN_IT_FF0.
mbed_official 155:8435094ec241 1155 (++) CAN_IT_FF1: FIFO 0 and FIFO1 full Interrupts;
mbed_official 155:8435094ec241 1156 If enabled, these interrupt sources are pending when three messages
mbed_official 155:8435094ec241 1157 are stored in the selected FIFO.
mbed_official 155:8435094ec241 1158 (++) CAN_IT_FOV0.
mbed_official 155:8435094ec241 1159 (++) CAN_IT_FOV1: FIFO 0 and FIFO1 overrun Interrupts;
mbed_official 155:8435094ec241 1160 If enabled, these interrupt sources are pending when a new message
mbed_official 155:8435094ec241 1161 has been received and passed the filter while the FIFO was full.
mbed_official 155:8435094ec241 1162 (+) Operating Mode Interrupts:
mbed_official 155:8435094ec241 1163 (++) CAN_IT_WKU: Wake-up Interrupt;
mbed_official 155:8435094ec241 1164 If enabled, this interrupt source is pending when a SOF bit has
mbed_official 155:8435094ec241 1165 been detected while the CAN hardware was in Sleep mode.
mbed_official 155:8435094ec241 1166 (++) CAN_IT_SLK: Sleep acknowledge Interrupt:
mbed_official 155:8435094ec241 1167 If enabled, this interrupt source is pending when the CAN has
mbed_official 155:8435094ec241 1168 entered Sleep Mode.
mbed_official 155:8435094ec241 1169 (+) Error Interrupts:
mbed_official 155:8435094ec241 1170 (++) CAN_IT_EWG: Error warning Interrupt;
mbed_official 155:8435094ec241 1171 If enabled, this interrupt source is pending when the warning limit
mbed_official 155:8435094ec241 1172 has been reached (Receive Error Counter or Transmit Error Counter=96).
mbed_official 155:8435094ec241 1173 (++) CAN_IT_EPV: Error passive Interrupt;
mbed_official 155:8435094ec241 1174 If enabled, this interrupt source is pending when the Error Passive
mbed_official 155:8435094ec241 1175 limit has been reached (Receive Error Counter or Transmit Error Counter>127).
mbed_official 155:8435094ec241 1176 (++) CAN_IT_BOF: Bus-off Interrupt;
mbed_official 155:8435094ec241 1177 If enabled, this interrupt source is pending when CAN enters
mbed_official 155:8435094ec241 1178 the bus-off state. The bus-off state is entered on TEC overflow,
mbed_official 155:8435094ec241 1179 greater than 255.
mbed_official 155:8435094ec241 1180 This Flag is cleared only by hardware.
mbed_official 155:8435094ec241 1181 (++) CAN_IT_LEC: Last error code Interrupt;
mbed_official 155:8435094ec241 1182 If enabled, this interrupt source is pending when a message has
mbed_official 155:8435094ec241 1183 been transferred (reception or transmission) with error and the
mbed_official 155:8435094ec241 1184 error code is hold.
mbed_official 155:8435094ec241 1185 (++) CAN_IT_ERR: Error Interrupt;
mbed_official 155:8435094ec241 1186 If enabled, this interrupt source is pending when an error condition
mbed_official 155:8435094ec241 1187 is pending.
mbed_official 155:8435094ec241 1188 [..] Managing the CAN controller events:
mbed_official 155:8435094ec241 1189 The user should identify which mode will be used in his application to manage
mbed_official 155:8435094ec241 1190 the CAN controller events: Polling mode or Interrupt mode.
mbed_official 155:8435094ec241 1191 (+) In the Polling Mode it is advised to use the following functions:
mbed_official 155:8435094ec241 1192 (++) CAN_GetFlagStatus() : to check if flags events occur.
mbed_official 155:8435094ec241 1193 (++) CAN_ClearFlag() : to clear the flags events.
mbed_official 155:8435094ec241 1194 (+) In the Interrupt Mode it is advised to use the following functions:
mbed_official 155:8435094ec241 1195 (++) CAN_ITConfig() : to enable or disable the interrupt source.
mbed_official 155:8435094ec241 1196 (++) CAN_GetITStatus() : to check if Interrupt occurs.
mbed_official 155:8435094ec241 1197 (++) CAN_ClearITPendingBit() : to clear the Interrupt pending Bit
mbed_official 155:8435094ec241 1198 (corresponding Flag).
mbed_official 155:8435094ec241 1199 This function has no impact on CAN_IT_FMP0 and CAN_IT_FMP1 Interrupts
mbed_official 155:8435094ec241 1200 pending bits since there are cleared only by hardware.
mbed_official 155:8435094ec241 1201
mbed_official 155:8435094ec241 1202 @endverbatim
mbed_official 155:8435094ec241 1203 * @{
mbed_official 155:8435094ec241 1204 */
mbed_official 155:8435094ec241 1205 /**
mbed_official 155:8435094ec241 1206 * @brief Enables or disables the specified CANx interrupts.
mbed_official 155:8435094ec241 1207 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1208 * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled.
mbed_official 155:8435094ec241 1209 * This parameter can be:
mbed_official 155:8435094ec241 1210 * @arg CAN_IT_TME: Transmit mailbox empty Interrupt
mbed_official 155:8435094ec241 1211 * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt
mbed_official 155:8435094ec241 1212 * @arg CAN_IT_FF0: FIFO 0 full Interrupt
mbed_official 155:8435094ec241 1213 * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt
mbed_official 155:8435094ec241 1214 * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt
mbed_official 155:8435094ec241 1215 * @arg CAN_IT_FF1: FIFO 1 full Interrupt
mbed_official 155:8435094ec241 1216 * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt
mbed_official 155:8435094ec241 1217 * @arg CAN_IT_WKU: Wake-up Interrupt
mbed_official 155:8435094ec241 1218 * @arg CAN_IT_SLK: Sleep acknowledge Interrupt
mbed_official 155:8435094ec241 1219 * @arg CAN_IT_EWG: Error warning Interrupt
mbed_official 155:8435094ec241 1220 * @arg CAN_IT_EPV: Error passive Interrupt
mbed_official 155:8435094ec241 1221 * @arg CAN_IT_BOF: Bus-off Interrupt
mbed_official 155:8435094ec241 1222 * @arg CAN_IT_LEC: Last error code Interrupt
mbed_official 155:8435094ec241 1223 * @arg CAN_IT_ERR: Error Interrupt
mbed_official 155:8435094ec241 1224 * @param NewState: new state of the CAN interrupts.
mbed_official 155:8435094ec241 1225 * This parameter can be: ENABLE or DISABLE.
mbed_official 155:8435094ec241 1226 * @retval None
mbed_official 155:8435094ec241 1227 */
mbed_official 155:8435094ec241 1228 void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState)
mbed_official 155:8435094ec241 1229 {
mbed_official 155:8435094ec241 1230 /* Check the parameters */
mbed_official 155:8435094ec241 1231 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1232 assert_param(IS_CAN_IT(CAN_IT));
mbed_official 155:8435094ec241 1233 assert_param(IS_FUNCTIONAL_STATE(NewState));
mbed_official 155:8435094ec241 1234
mbed_official 155:8435094ec241 1235 if (NewState != DISABLE)
mbed_official 155:8435094ec241 1236 {
mbed_official 155:8435094ec241 1237 /* Enable the selected CANx interrupt */
mbed_official 155:8435094ec241 1238 CANx->IER |= CAN_IT;
mbed_official 155:8435094ec241 1239 }
mbed_official 155:8435094ec241 1240 else
mbed_official 155:8435094ec241 1241 {
mbed_official 155:8435094ec241 1242 /* Disable the selected CANx interrupt */
mbed_official 155:8435094ec241 1243 CANx->IER &= ~CAN_IT;
mbed_official 155:8435094ec241 1244 }
mbed_official 155:8435094ec241 1245 }
mbed_official 155:8435094ec241 1246 /**
mbed_official 155:8435094ec241 1247 * @brief Checks whether the specified CAN flag is set or not.
mbed_official 155:8435094ec241 1248 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1249 * @param CAN_FLAG: specifies the flag to check.
mbed_official 155:8435094ec241 1250 * This parameter can be one of the following values:
mbed_official 155:8435094ec241 1251 * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag
mbed_official 155:8435094ec241 1252 * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag
mbed_official 155:8435094ec241 1253 * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag
mbed_official 155:8435094ec241 1254 * @arg CAN_FLAG_FMP0: FIFO 0 Message Pending Flag
mbed_official 155:8435094ec241 1255 * @arg CAN_FLAG_FF0: FIFO 0 Full Flag
mbed_official 155:8435094ec241 1256 * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag
mbed_official 155:8435094ec241 1257 * @arg CAN_FLAG_FMP1: FIFO 1 Message Pending Flag
mbed_official 155:8435094ec241 1258 * @arg CAN_FLAG_FF1: FIFO 1 Full Flag
mbed_official 155:8435094ec241 1259 * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag
mbed_official 155:8435094ec241 1260 * @arg CAN_FLAG_WKU: Wake up Flag
mbed_official 155:8435094ec241 1261 * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag
mbed_official 155:8435094ec241 1262 * @arg CAN_FLAG_EWG: Error Warning Flag
mbed_official 155:8435094ec241 1263 * @arg CAN_FLAG_EPV: Error Passive Flag
mbed_official 155:8435094ec241 1264 * @arg CAN_FLAG_BOF: Bus-Off Flag
mbed_official 155:8435094ec241 1265 * @arg CAN_FLAG_LEC: Last error code Flag
mbed_official 155:8435094ec241 1266 * @retval The new state of CAN_FLAG (SET or RESET).
mbed_official 155:8435094ec241 1267 */
mbed_official 155:8435094ec241 1268 FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG)
mbed_official 155:8435094ec241 1269 {
mbed_official 155:8435094ec241 1270 FlagStatus bitstatus = RESET;
mbed_official 155:8435094ec241 1271
mbed_official 155:8435094ec241 1272 /* Check the parameters */
mbed_official 155:8435094ec241 1273 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1274 assert_param(IS_CAN_GET_FLAG(CAN_FLAG));
mbed_official 155:8435094ec241 1275
mbed_official 155:8435094ec241 1276
mbed_official 155:8435094ec241 1277 if((CAN_FLAG & CAN_FLAGS_ESR) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1278 {
mbed_official 155:8435094ec241 1279 /* Check the status of the specified CAN flag */
mbed_official 155:8435094ec241 1280 if ((CANx->ESR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1281 {
mbed_official 155:8435094ec241 1282 /* CAN_FLAG is set */
mbed_official 155:8435094ec241 1283 bitstatus = SET;
mbed_official 155:8435094ec241 1284 }
mbed_official 155:8435094ec241 1285 else
mbed_official 155:8435094ec241 1286 {
mbed_official 155:8435094ec241 1287 /* CAN_FLAG is reset */
mbed_official 155:8435094ec241 1288 bitstatus = RESET;
mbed_official 155:8435094ec241 1289 }
mbed_official 155:8435094ec241 1290 }
mbed_official 155:8435094ec241 1291 else if((CAN_FLAG & CAN_FLAGS_MSR) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1292 {
mbed_official 155:8435094ec241 1293 /* Check the status of the specified CAN flag */
mbed_official 155:8435094ec241 1294 if ((CANx->MSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1295 {
mbed_official 155:8435094ec241 1296 /* CAN_FLAG is set */
mbed_official 155:8435094ec241 1297 bitstatus = SET;
mbed_official 155:8435094ec241 1298 }
mbed_official 155:8435094ec241 1299 else
mbed_official 155:8435094ec241 1300 {
mbed_official 155:8435094ec241 1301 /* CAN_FLAG is reset */
mbed_official 155:8435094ec241 1302 bitstatus = RESET;
mbed_official 155:8435094ec241 1303 }
mbed_official 155:8435094ec241 1304 }
mbed_official 155:8435094ec241 1305 else if((CAN_FLAG & CAN_FLAGS_TSR) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1306 {
mbed_official 155:8435094ec241 1307 /* Check the status of the specified CAN flag */
mbed_official 155:8435094ec241 1308 if ((CANx->TSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1309 {
mbed_official 155:8435094ec241 1310 /* CAN_FLAG is set */
mbed_official 155:8435094ec241 1311 bitstatus = SET;
mbed_official 155:8435094ec241 1312 }
mbed_official 155:8435094ec241 1313 else
mbed_official 155:8435094ec241 1314 {
mbed_official 155:8435094ec241 1315 /* CAN_FLAG is reset */
mbed_official 155:8435094ec241 1316 bitstatus = RESET;
mbed_official 155:8435094ec241 1317 }
mbed_official 155:8435094ec241 1318 }
mbed_official 155:8435094ec241 1319 else if((CAN_FLAG & CAN_FLAGS_RF0R) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1320 {
mbed_official 155:8435094ec241 1321 /* Check the status of the specified CAN flag */
mbed_official 155:8435094ec241 1322 if ((CANx->RF0R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1323 {
mbed_official 155:8435094ec241 1324 /* CAN_FLAG is set */
mbed_official 155:8435094ec241 1325 bitstatus = SET;
mbed_official 155:8435094ec241 1326 }
mbed_official 155:8435094ec241 1327 else
mbed_official 155:8435094ec241 1328 {
mbed_official 155:8435094ec241 1329 /* CAN_FLAG is reset */
mbed_official 155:8435094ec241 1330 bitstatus = RESET;
mbed_official 155:8435094ec241 1331 }
mbed_official 155:8435094ec241 1332 }
mbed_official 155:8435094ec241 1333 else /* If(CAN_FLAG & CAN_FLAGS_RF1R != (uint32_t)RESET) */
mbed_official 155:8435094ec241 1334 {
mbed_official 155:8435094ec241 1335 /* Check the status of the specified CAN flag */
mbed_official 155:8435094ec241 1336 if ((uint32_t)(CANx->RF1R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1337 {
mbed_official 155:8435094ec241 1338 /* CAN_FLAG is set */
mbed_official 155:8435094ec241 1339 bitstatus = SET;
mbed_official 155:8435094ec241 1340 }
mbed_official 155:8435094ec241 1341 else
mbed_official 155:8435094ec241 1342 {
mbed_official 155:8435094ec241 1343 /* CAN_FLAG is reset */
mbed_official 155:8435094ec241 1344 bitstatus = RESET;
mbed_official 155:8435094ec241 1345 }
mbed_official 155:8435094ec241 1346 }
mbed_official 155:8435094ec241 1347 /* Return the CAN_FLAG status */
mbed_official 155:8435094ec241 1348 return bitstatus;
mbed_official 155:8435094ec241 1349 }
mbed_official 155:8435094ec241 1350
mbed_official 155:8435094ec241 1351 /**
mbed_official 155:8435094ec241 1352 * @brief Clears the CAN's pending flags.
mbed_official 155:8435094ec241 1353 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1354 * @param CAN_FLAG: specifies the flag to clear.
mbed_official 155:8435094ec241 1355 * This parameter can be one of the following values:
mbed_official 155:8435094ec241 1356 * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag
mbed_official 155:8435094ec241 1357 * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag
mbed_official 155:8435094ec241 1358 * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag
mbed_official 155:8435094ec241 1359 * @arg CAN_FLAG_FF0: FIFO 0 Full Flag
mbed_official 155:8435094ec241 1360 * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag
mbed_official 155:8435094ec241 1361 * @arg CAN_FLAG_FF1: FIFO 1 Full Flag
mbed_official 155:8435094ec241 1362 * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag
mbed_official 155:8435094ec241 1363 * @arg CAN_FLAG_WKU: Wake up Flag
mbed_official 155:8435094ec241 1364 * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag
mbed_official 155:8435094ec241 1365 * @arg CAN_FLAG_LEC: Last error code Flag
mbed_official 155:8435094ec241 1366 * @retval None
mbed_official 155:8435094ec241 1367 */
mbed_official 155:8435094ec241 1368 void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG)
mbed_official 155:8435094ec241 1369 {
mbed_official 155:8435094ec241 1370 uint32_t flagtmp=0;
mbed_official 155:8435094ec241 1371 /* Check the parameters */
mbed_official 155:8435094ec241 1372 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1373 assert_param(IS_CAN_CLEAR_FLAG(CAN_FLAG));
mbed_official 155:8435094ec241 1374
mbed_official 155:8435094ec241 1375 if (CAN_FLAG == CAN_FLAG_LEC) /* ESR register */
mbed_official 155:8435094ec241 1376 {
mbed_official 155:8435094ec241 1377 /* Clear the selected CAN flags */
mbed_official 155:8435094ec241 1378 CANx->ESR = (uint32_t)RESET;
mbed_official 155:8435094ec241 1379 }
mbed_official 155:8435094ec241 1380 else /* MSR or TSR or RF0R or RF1R */
mbed_official 155:8435094ec241 1381 {
mbed_official 155:8435094ec241 1382 flagtmp = CAN_FLAG & 0x000FFFFF;
mbed_official 155:8435094ec241 1383
mbed_official 155:8435094ec241 1384 if ((CAN_FLAG & CAN_FLAGS_RF0R)!=(uint32_t)RESET)
mbed_official 155:8435094ec241 1385 {
mbed_official 155:8435094ec241 1386 /* Receive Flags */
mbed_official 155:8435094ec241 1387 CANx->RF0R = (uint32_t)(flagtmp);
mbed_official 155:8435094ec241 1388 }
mbed_official 155:8435094ec241 1389 else if ((CAN_FLAG & CAN_FLAGS_RF1R)!=(uint32_t)RESET)
mbed_official 155:8435094ec241 1390 {
mbed_official 155:8435094ec241 1391 /* Receive Flags */
mbed_official 155:8435094ec241 1392 CANx->RF1R = (uint32_t)(flagtmp);
mbed_official 155:8435094ec241 1393 }
mbed_official 155:8435094ec241 1394 else if ((CAN_FLAG & CAN_FLAGS_TSR)!=(uint32_t)RESET)
mbed_official 155:8435094ec241 1395 {
mbed_official 155:8435094ec241 1396 /* Transmit Flags */
mbed_official 155:8435094ec241 1397 CANx->TSR = (uint32_t)(flagtmp);
mbed_official 155:8435094ec241 1398 }
mbed_official 155:8435094ec241 1399 else /* If((CAN_FLAG & CAN_FLAGS_MSR)!=(uint32_t)RESET) */
mbed_official 155:8435094ec241 1400 {
mbed_official 155:8435094ec241 1401 /* Operating mode Flags */
mbed_official 155:8435094ec241 1402 CANx->MSR = (uint32_t)(flagtmp);
mbed_official 155:8435094ec241 1403 }
mbed_official 155:8435094ec241 1404 }
mbed_official 155:8435094ec241 1405 }
mbed_official 155:8435094ec241 1406
mbed_official 155:8435094ec241 1407 /**
mbed_official 155:8435094ec241 1408 * @brief Checks whether the specified CANx interrupt has occurred or not.
mbed_official 155:8435094ec241 1409 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1410 * @param CAN_IT: specifies the CAN interrupt source to check.
mbed_official 155:8435094ec241 1411 * This parameter can be one of the following values:
mbed_official 155:8435094ec241 1412 * @arg CAN_IT_TME: Transmit mailbox empty Interrupt
mbed_official 155:8435094ec241 1413 * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt
mbed_official 155:8435094ec241 1414 * @arg CAN_IT_FF0: FIFO 0 full Interrupt
mbed_official 155:8435094ec241 1415 * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt
mbed_official 155:8435094ec241 1416 * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt
mbed_official 155:8435094ec241 1417 * @arg CAN_IT_FF1: FIFO 1 full Interrupt
mbed_official 155:8435094ec241 1418 * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt
mbed_official 155:8435094ec241 1419 * @arg CAN_IT_WKU: Wake-up Interrupt
mbed_official 155:8435094ec241 1420 * @arg CAN_IT_SLK: Sleep acknowledge Interrupt
mbed_official 155:8435094ec241 1421 * @arg CAN_IT_EWG: Error warning Interrupt
mbed_official 155:8435094ec241 1422 * @arg CAN_IT_EPV: Error passive Interrupt
mbed_official 155:8435094ec241 1423 * @arg CAN_IT_BOF: Bus-off Interrupt
mbed_official 155:8435094ec241 1424 * @arg CAN_IT_LEC: Last error code Interrupt
mbed_official 155:8435094ec241 1425 * @arg CAN_IT_ERR: Error Interrupt
mbed_official 155:8435094ec241 1426 * @retval The current state of CAN_IT (SET or RESET).
mbed_official 155:8435094ec241 1427 */
mbed_official 155:8435094ec241 1428 ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT)
mbed_official 155:8435094ec241 1429 {
mbed_official 155:8435094ec241 1430 ITStatus itstatus = RESET;
mbed_official 155:8435094ec241 1431 /* Check the parameters */
mbed_official 155:8435094ec241 1432 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1433 assert_param(IS_CAN_IT(CAN_IT));
mbed_official 155:8435094ec241 1434
mbed_official 155:8435094ec241 1435 /* check the interrupt enable bit */
mbed_official 155:8435094ec241 1436 if((CANx->IER & CAN_IT) != RESET)
mbed_official 155:8435094ec241 1437 {
mbed_official 155:8435094ec241 1438 /* in case the Interrupt is enabled, .... */
mbed_official 155:8435094ec241 1439 switch (CAN_IT)
mbed_official 155:8435094ec241 1440 {
mbed_official 155:8435094ec241 1441 case CAN_IT_TME:
mbed_official 155:8435094ec241 1442 /* Check CAN_TSR_RQCPx bits */
mbed_official 155:8435094ec241 1443 itstatus = CheckITStatus(CANx->TSR, CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2);
mbed_official 155:8435094ec241 1444 break;
mbed_official 155:8435094ec241 1445 case CAN_IT_FMP0:
mbed_official 155:8435094ec241 1446 /* Check CAN_RF0R_FMP0 bit */
mbed_official 155:8435094ec241 1447 itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FMP0);
mbed_official 155:8435094ec241 1448 break;
mbed_official 155:8435094ec241 1449 case CAN_IT_FF0:
mbed_official 155:8435094ec241 1450 /* Check CAN_RF0R_FULL0 bit */
mbed_official 155:8435094ec241 1451 itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FULL0);
mbed_official 155:8435094ec241 1452 break;
mbed_official 155:8435094ec241 1453 case CAN_IT_FOV0:
mbed_official 155:8435094ec241 1454 /* Check CAN_RF0R_FOVR0 bit */
mbed_official 155:8435094ec241 1455 itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FOVR0);
mbed_official 155:8435094ec241 1456 break;
mbed_official 155:8435094ec241 1457 case CAN_IT_FMP1:
mbed_official 155:8435094ec241 1458 /* Check CAN_RF1R_FMP1 bit */
mbed_official 155:8435094ec241 1459 itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FMP1);
mbed_official 155:8435094ec241 1460 break;
mbed_official 155:8435094ec241 1461 case CAN_IT_FF1:
mbed_official 155:8435094ec241 1462 /* Check CAN_RF1R_FULL1 bit */
mbed_official 155:8435094ec241 1463 itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FULL1);
mbed_official 155:8435094ec241 1464 break;
mbed_official 155:8435094ec241 1465 case CAN_IT_FOV1:
mbed_official 155:8435094ec241 1466 /* Check CAN_RF1R_FOVR1 bit */
mbed_official 155:8435094ec241 1467 itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FOVR1);
mbed_official 155:8435094ec241 1468 break;
mbed_official 155:8435094ec241 1469 case CAN_IT_WKU:
mbed_official 155:8435094ec241 1470 /* Check CAN_MSR_WKUI bit */
mbed_official 155:8435094ec241 1471 itstatus = CheckITStatus(CANx->MSR, CAN_MSR_WKUI);
mbed_official 155:8435094ec241 1472 break;
mbed_official 155:8435094ec241 1473 case CAN_IT_SLK:
mbed_official 155:8435094ec241 1474 /* Check CAN_MSR_SLAKI bit */
mbed_official 155:8435094ec241 1475 itstatus = CheckITStatus(CANx->MSR, CAN_MSR_SLAKI);
mbed_official 155:8435094ec241 1476 break;
mbed_official 155:8435094ec241 1477 case CAN_IT_EWG:
mbed_official 155:8435094ec241 1478 /* Check CAN_ESR_EWGF bit */
mbed_official 155:8435094ec241 1479 itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EWGF);
mbed_official 155:8435094ec241 1480 break;
mbed_official 155:8435094ec241 1481 case CAN_IT_EPV:
mbed_official 155:8435094ec241 1482 /* Check CAN_ESR_EPVF bit */
mbed_official 155:8435094ec241 1483 itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EPVF);
mbed_official 155:8435094ec241 1484 break;
mbed_official 155:8435094ec241 1485 case CAN_IT_BOF:
mbed_official 155:8435094ec241 1486 /* Check CAN_ESR_BOFF bit */
mbed_official 155:8435094ec241 1487 itstatus = CheckITStatus(CANx->ESR, CAN_ESR_BOFF);
mbed_official 155:8435094ec241 1488 break;
mbed_official 155:8435094ec241 1489 case CAN_IT_LEC:
mbed_official 155:8435094ec241 1490 /* Check CAN_ESR_LEC bit */
mbed_official 155:8435094ec241 1491 itstatus = CheckITStatus(CANx->ESR, CAN_ESR_LEC);
mbed_official 155:8435094ec241 1492 break;
mbed_official 155:8435094ec241 1493 case CAN_IT_ERR:
mbed_official 155:8435094ec241 1494 /* Check CAN_MSR_ERRI bit */
mbed_official 155:8435094ec241 1495 itstatus = CheckITStatus(CANx->MSR, CAN_MSR_ERRI);
mbed_official 155:8435094ec241 1496 break;
mbed_official 155:8435094ec241 1497 default:
mbed_official 155:8435094ec241 1498 /* in case of error, return RESET */
mbed_official 155:8435094ec241 1499 itstatus = RESET;
mbed_official 155:8435094ec241 1500 break;
mbed_official 155:8435094ec241 1501 }
mbed_official 155:8435094ec241 1502 }
mbed_official 155:8435094ec241 1503 else
mbed_official 155:8435094ec241 1504 {
mbed_official 155:8435094ec241 1505 /* in case the Interrupt is not enabled, return RESET */
mbed_official 155:8435094ec241 1506 itstatus = RESET;
mbed_official 155:8435094ec241 1507 }
mbed_official 155:8435094ec241 1508
mbed_official 155:8435094ec241 1509 /* Return the CAN_IT status */
mbed_official 155:8435094ec241 1510 return itstatus;
mbed_official 155:8435094ec241 1511 }
mbed_official 155:8435094ec241 1512
mbed_official 155:8435094ec241 1513 /**
mbed_official 155:8435094ec241 1514 * @brief Clears the CANx's interrupt pending bits.
mbed_official 155:8435094ec241 1515 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
mbed_official 155:8435094ec241 1516 * @param CAN_IT: specifies the interrupt pending bit to clear.
mbed_official 155:8435094ec241 1517 * This parameter can be one of the following values:
mbed_official 155:8435094ec241 1518 * @arg CAN_IT_TME: Transmit mailbox empty Interrupt
mbed_official 155:8435094ec241 1519 * @arg CAN_IT_FF0: FIFO 0 full Interrupt
mbed_official 155:8435094ec241 1520 * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt
mbed_official 155:8435094ec241 1521 * @arg CAN_IT_FF1: FIFO 1 full Interrupt
mbed_official 155:8435094ec241 1522 * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt
mbed_official 155:8435094ec241 1523 * @arg CAN_IT_WKU: Wake-up Interrupt
mbed_official 155:8435094ec241 1524 * @arg CAN_IT_SLK: Sleep acknowledge Interrupt
mbed_official 155:8435094ec241 1525 * @arg CAN_IT_EWG: Error warning Interrupt
mbed_official 155:8435094ec241 1526 * @arg CAN_IT_EPV: Error passive Interrupt
mbed_official 155:8435094ec241 1527 * @arg CAN_IT_BOF: Bus-off Interrupt
mbed_official 155:8435094ec241 1528 * @arg CAN_IT_LEC: Last error code Interrupt
mbed_official 155:8435094ec241 1529 * @arg CAN_IT_ERR: Error Interrupt
mbed_official 155:8435094ec241 1530 * @retval None
mbed_official 155:8435094ec241 1531 */
mbed_official 155:8435094ec241 1532 void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT)
mbed_official 155:8435094ec241 1533 {
mbed_official 155:8435094ec241 1534 /* Check the parameters */
mbed_official 155:8435094ec241 1535 assert_param(IS_CAN_ALL_PERIPH(CANx));
mbed_official 155:8435094ec241 1536 assert_param(IS_CAN_CLEAR_IT(CAN_IT));
mbed_official 155:8435094ec241 1537
mbed_official 155:8435094ec241 1538 switch (CAN_IT)
mbed_official 155:8435094ec241 1539 {
mbed_official 155:8435094ec241 1540 case CAN_IT_TME:
mbed_official 155:8435094ec241 1541 /* Clear CAN_TSR_RQCPx (rc_w1)*/
mbed_official 155:8435094ec241 1542 CANx->TSR = CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2;
mbed_official 155:8435094ec241 1543 break;
mbed_official 155:8435094ec241 1544 case CAN_IT_FF0:
mbed_official 155:8435094ec241 1545 /* Clear CAN_RF0R_FULL0 (rc_w1)*/
mbed_official 155:8435094ec241 1546 CANx->RF0R = CAN_RF0R_FULL0;
mbed_official 155:8435094ec241 1547 break;
mbed_official 155:8435094ec241 1548 case CAN_IT_FOV0:
mbed_official 155:8435094ec241 1549 /* Clear CAN_RF0R_FOVR0 (rc_w1)*/
mbed_official 155:8435094ec241 1550 CANx->RF0R = CAN_RF0R_FOVR0;
mbed_official 155:8435094ec241 1551 break;
mbed_official 155:8435094ec241 1552 case CAN_IT_FF1:
mbed_official 155:8435094ec241 1553 /* Clear CAN_RF1R_FULL1 (rc_w1)*/
mbed_official 155:8435094ec241 1554 CANx->RF1R = CAN_RF1R_FULL1;
mbed_official 155:8435094ec241 1555 break;
mbed_official 155:8435094ec241 1556 case CAN_IT_FOV1:
mbed_official 155:8435094ec241 1557 /* Clear CAN_RF1R_FOVR1 (rc_w1)*/
mbed_official 155:8435094ec241 1558 CANx->RF1R = CAN_RF1R_FOVR1;
mbed_official 155:8435094ec241 1559 break;
mbed_official 155:8435094ec241 1560 case CAN_IT_WKU:
mbed_official 155:8435094ec241 1561 /* Clear CAN_MSR_WKUI (rc_w1)*/
mbed_official 155:8435094ec241 1562 CANx->MSR = CAN_MSR_WKUI;
mbed_official 155:8435094ec241 1563 break;
mbed_official 155:8435094ec241 1564 case CAN_IT_SLK:
mbed_official 155:8435094ec241 1565 /* Clear CAN_MSR_SLAKI (rc_w1)*/
mbed_official 155:8435094ec241 1566 CANx->MSR = CAN_MSR_SLAKI;
mbed_official 155:8435094ec241 1567 break;
mbed_official 155:8435094ec241 1568 case CAN_IT_EWG:
mbed_official 155:8435094ec241 1569 /* Clear CAN_MSR_ERRI (rc_w1) */
mbed_official 155:8435094ec241 1570 CANx->MSR = CAN_MSR_ERRI;
mbed_official 155:8435094ec241 1571 /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/
mbed_official 155:8435094ec241 1572 break;
mbed_official 155:8435094ec241 1573 case CAN_IT_EPV:
mbed_official 155:8435094ec241 1574 /* Clear CAN_MSR_ERRI (rc_w1) */
mbed_official 155:8435094ec241 1575 CANx->MSR = CAN_MSR_ERRI;
mbed_official 155:8435094ec241 1576 /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/
mbed_official 155:8435094ec241 1577 break;
mbed_official 155:8435094ec241 1578 case CAN_IT_BOF:
mbed_official 155:8435094ec241 1579 /* Clear CAN_MSR_ERRI (rc_w1) */
mbed_official 155:8435094ec241 1580 CANx->MSR = CAN_MSR_ERRI;
mbed_official 155:8435094ec241 1581 /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/
mbed_official 155:8435094ec241 1582 break;
mbed_official 155:8435094ec241 1583 case CAN_IT_LEC:
mbed_official 155:8435094ec241 1584 /* Clear LEC bits */
mbed_official 155:8435094ec241 1585 CANx->ESR = RESET;
mbed_official 155:8435094ec241 1586 /* Clear CAN_MSR_ERRI (rc_w1) */
mbed_official 155:8435094ec241 1587 CANx->MSR = CAN_MSR_ERRI;
mbed_official 155:8435094ec241 1588 break;
mbed_official 155:8435094ec241 1589 case CAN_IT_ERR:
mbed_official 155:8435094ec241 1590 /*Clear LEC bits */
mbed_official 155:8435094ec241 1591 CANx->ESR = RESET;
mbed_official 155:8435094ec241 1592 /* Clear CAN_MSR_ERRI (rc_w1) */
mbed_official 155:8435094ec241 1593 CANx->MSR = CAN_MSR_ERRI;
mbed_official 155:8435094ec241 1594 /* @note BOFF, EPVF and EWGF Flags are cleared by hardware depending on the CAN Bus status*/
mbed_official 155:8435094ec241 1595 break;
mbed_official 155:8435094ec241 1596 default:
mbed_official 155:8435094ec241 1597 break;
mbed_official 155:8435094ec241 1598 }
mbed_official 155:8435094ec241 1599 }
mbed_official 155:8435094ec241 1600 /**
mbed_official 155:8435094ec241 1601 * @}
mbed_official 155:8435094ec241 1602 */
mbed_official 155:8435094ec241 1603
mbed_official 155:8435094ec241 1604 /**
mbed_official 155:8435094ec241 1605 * @brief Checks whether the CAN interrupt has occurred or not.
mbed_official 155:8435094ec241 1606 * @param CAN_Reg: specifies the CAN interrupt register to check.
mbed_official 155:8435094ec241 1607 * @param It_Bit: specifies the interrupt source bit to check.
mbed_official 155:8435094ec241 1608 * @retval The new state of the CAN Interrupt (SET or RESET).
mbed_official 155:8435094ec241 1609 */
mbed_official 155:8435094ec241 1610 static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit)
mbed_official 155:8435094ec241 1611 {
mbed_official 155:8435094ec241 1612 ITStatus pendingbitstatus = RESET;
mbed_official 155:8435094ec241 1613
mbed_official 155:8435094ec241 1614 if ((CAN_Reg & It_Bit) != (uint32_t)RESET)
mbed_official 155:8435094ec241 1615 {
mbed_official 155:8435094ec241 1616 /* CAN_IT is set */
mbed_official 155:8435094ec241 1617 pendingbitstatus = SET;
mbed_official 155:8435094ec241 1618 }
mbed_official 155:8435094ec241 1619 else
mbed_official 155:8435094ec241 1620 {
mbed_official 155:8435094ec241 1621 /* CAN_IT is reset */
mbed_official 155:8435094ec241 1622 pendingbitstatus = RESET;
mbed_official 155:8435094ec241 1623 }
mbed_official 155:8435094ec241 1624 return pendingbitstatus;
mbed_official 155:8435094ec241 1625 }
mbed_official 155:8435094ec241 1626
mbed_official 155:8435094ec241 1627 /**
mbed_official 155:8435094ec241 1628 * @}
mbed_official 155:8435094ec241 1629 */
mbed_official 155:8435094ec241 1630
mbed_official 155:8435094ec241 1631 /**
mbed_official 155:8435094ec241 1632 * @}
mbed_official 155:8435094ec241 1633 */
mbed_official 155:8435094ec241 1634
mbed_official 155:8435094ec241 1635 /**
mbed_official 155:8435094ec241 1636 * @}
mbed_official 155:8435094ec241 1637 */
mbed_official 155:8435094ec241 1638
mbed_official 155:8435094ec241 1639 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/