philippe s. / mbed-dev

Fork of mbed-dev by mbed official

Committer:
neurofun
Date:
Tue Feb 23 21:59:35 2016 +0000
Revision:
70:b3a5af880266
Parent:
0:9b334a45a8ff
Edited DAC routines to allow for the simultaneous use of three channels from two DACs as seen on the STM32F334R8 and STM32F303K8. Edited ADC routines to allow for the simultaneous use of more than one ADC.

Who changed what in which revision?

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