mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
shaoziyang
Date:
Sat Sep 13 14:25:46 2014 +0000
Revision:
323:9e901b0a5aa1
Parent:
130:1dec54e4aec3
test with CLOCK_SETUP = 0

Who changed what in which revision?

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