inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /**
NYX 0:85b3fd62ea1a 2 ******************************************************************************
NYX 0:85b3fd62ea1a 3 * @file stm32f4xx_hal_can.c
NYX 0:85b3fd62ea1a 4 * @author MCD Application Team
NYX 0:85b3fd62ea1a 5 * @version V1.7.1
NYX 0:85b3fd62ea1a 6 * @date 14-April-2017
NYX 0:85b3fd62ea1a 7 * @brief This file provides firmware functions to manage the following
NYX 0:85b3fd62ea1a 8 * functionalities of the Controller Area Network (CAN) peripheral:
NYX 0:85b3fd62ea1a 9 * + Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 10 * + IO operation functions
NYX 0:85b3fd62ea1a 11 * + Peripheral Control functions
NYX 0:85b3fd62ea1a 12 * + Peripheral State and Error functions
NYX 0:85b3fd62ea1a 13 *
NYX 0:85b3fd62ea1a 14 @verbatim
NYX 0:85b3fd62ea1a 15 ==============================================================================
NYX 0:85b3fd62ea1a 16 ##### How to use this driver #####
NYX 0:85b3fd62ea1a 17 ==============================================================================
NYX 0:85b3fd62ea1a 18 [..]
NYX 0:85b3fd62ea1a 19 (#) Enable the CAN controller interface clock using
NYX 0:85b3fd62ea1a 20 __HAL_RCC_CAN1_CLK_ENABLE() for CAN1, __HAL_RCC_CAN2_CLK_ENABLE() for CAN2
NYX 0:85b3fd62ea1a 21 and __HAL_RCC_CAN3_CLK_ENABLE() for CAN3
NYX 0:85b3fd62ea1a 22 -@- In case you are using CAN2 only, you have to enable the CAN1 clock.
NYX 0:85b3fd62ea1a 23
NYX 0:85b3fd62ea1a 24 (#) CAN pins configuration
NYX 0:85b3fd62ea1a 25 (++) Enable the clock for the CAN GPIOs using the following function:
NYX 0:85b3fd62ea1a 26 __GPIOx_CLK_ENABLE()
NYX 0:85b3fd62ea1a 27 (++) Connect and configure the involved CAN pins to AF9 using the
NYX 0:85b3fd62ea1a 28 following function HAL_GPIO_Init()
NYX 0:85b3fd62ea1a 29
NYX 0:85b3fd62ea1a 30 (#) Initialize and configure the CAN using CAN_Init() function.
NYX 0:85b3fd62ea1a 31
NYX 0:85b3fd62ea1a 32 (#) Transmit the desired CAN frame using HAL_CAN_Transmit() function.
NYX 0:85b3fd62ea1a 33
NYX 0:85b3fd62ea1a 34 (#) Or transmit the desired CAN frame using HAL_CAN_Transmit_IT() function.
NYX 0:85b3fd62ea1a 35
NYX 0:85b3fd62ea1a 36 (#) Receive a CAN frame using HAL_CAN_Receive() function.
NYX 0:85b3fd62ea1a 37
NYX 0:85b3fd62ea1a 38 (#) Or receive a CAN frame using HAL_CAN_Receive_IT() function.
NYX 0:85b3fd62ea1a 39
NYX 0:85b3fd62ea1a 40 *** Polling mode IO operation ***
NYX 0:85b3fd62ea1a 41 =================================
NYX 0:85b3fd62ea1a 42 [..]
NYX 0:85b3fd62ea1a 43 (+) Start the CAN peripheral transmission and wait the end of this operation
NYX 0:85b3fd62ea1a 44 using HAL_CAN_Transmit(), at this stage user can specify the value of timeout
NYX 0:85b3fd62ea1a 45 according to his end application
NYX 0:85b3fd62ea1a 46 (+) Start the CAN peripheral reception and wait the end of this operation
NYX 0:85b3fd62ea1a 47 using HAL_CAN_Receive(), at this stage user can specify the value of timeout
NYX 0:85b3fd62ea1a 48 according to his end application
NYX 0:85b3fd62ea1a 49
NYX 0:85b3fd62ea1a 50 *** Interrupt mode IO operation ***
NYX 0:85b3fd62ea1a 51 ===================================
NYX 0:85b3fd62ea1a 52 [..]
NYX 0:85b3fd62ea1a 53 (+) Start the CAN peripheral transmission using HAL_CAN_Transmit_IT()
NYX 0:85b3fd62ea1a 54 (+) Start the CAN peripheral reception using HAL_CAN_Receive_IT()
NYX 0:85b3fd62ea1a 55 (+) Use HAL_CAN_IRQHandler() called under the used CAN Interrupt subroutine
NYX 0:85b3fd62ea1a 56 (+) At CAN end of transmission HAL_CAN_TxCpltCallback() function is executed and user can
NYX 0:85b3fd62ea1a 57 add his own code by customization of function pointer HAL_CAN_TxCpltCallback
NYX 0:85b3fd62ea1a 58 (+) In case of CAN Error, HAL_CAN_ErrorCallback() function is executed and user can
NYX 0:85b3fd62ea1a 59 add his own code by customization of function pointer HAL_CAN_ErrorCallback
NYX 0:85b3fd62ea1a 60
NYX 0:85b3fd62ea1a 61 *** CAN HAL driver macros list ***
NYX 0:85b3fd62ea1a 62 =============================================
NYX 0:85b3fd62ea1a 63 [..]
NYX 0:85b3fd62ea1a 64 Below the list of most used macros in CAN HAL driver.
NYX 0:85b3fd62ea1a 65
NYX 0:85b3fd62ea1a 66 (+) __HAL_CAN_ENABLE_IT: Enable the specified CAN interrupts
NYX 0:85b3fd62ea1a 67 (+) __HAL_CAN_DISABLE_IT: Disable the specified CAN interrupts
NYX 0:85b3fd62ea1a 68 (+) __HAL_CAN_GET_IT_SOURCE: Check if the specified CAN interrupt source is enabled or disabled
NYX 0:85b3fd62ea1a 69 (+) __HAL_CAN_CLEAR_FLAG: Clear the CAN's pending flags
NYX 0:85b3fd62ea1a 70 (+) __HAL_CAN_GET_FLAG: Get the selected CAN's flag status
NYX 0:85b3fd62ea1a 71
NYX 0:85b3fd62ea1a 72 [..]
NYX 0:85b3fd62ea1a 73 (@) You can refer to the CAN HAL driver header file for more useful macros
NYX 0:85b3fd62ea1a 74
NYX 0:85b3fd62ea1a 75 @endverbatim
NYX 0:85b3fd62ea1a 76
NYX 0:85b3fd62ea1a 77 ******************************************************************************
NYX 0:85b3fd62ea1a 78 * @attention
NYX 0:85b3fd62ea1a 79 *
NYX 0:85b3fd62ea1a 80 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
NYX 0:85b3fd62ea1a 81 *
NYX 0:85b3fd62ea1a 82 * Redistribution and use in source and binary forms, with or without modification,
NYX 0:85b3fd62ea1a 83 * are permitted provided that the following conditions are met:
NYX 0:85b3fd62ea1a 84 * 1. Redistributions of source code must retain the above copyright notice,
NYX 0:85b3fd62ea1a 85 * this list of conditions and the following disclaimer.
NYX 0:85b3fd62ea1a 86 * 2. Redistributions in binary form must reproduce the above copyright notice,
NYX 0:85b3fd62ea1a 87 * this list of conditions and the following disclaimer in the documentation
NYX 0:85b3fd62ea1a 88 * and/or other materials provided with the distribution.
NYX 0:85b3fd62ea1a 89 * 3. Neither the name of STMicroelectronics nor the names of its contributors
NYX 0:85b3fd62ea1a 90 * may be used to endorse or promote products derived from this software
NYX 0:85b3fd62ea1a 91 * without specific prior written permission.
NYX 0:85b3fd62ea1a 92 *
NYX 0:85b3fd62ea1a 93 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
NYX 0:85b3fd62ea1a 94 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
NYX 0:85b3fd62ea1a 95 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
NYX 0:85b3fd62ea1a 96 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
NYX 0:85b3fd62ea1a 97 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
NYX 0:85b3fd62ea1a 98 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
NYX 0:85b3fd62ea1a 99 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
NYX 0:85b3fd62ea1a 100 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
NYX 0:85b3fd62ea1a 101 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
NYX 0:85b3fd62ea1a 102 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NYX 0:85b3fd62ea1a 103 *
NYX 0:85b3fd62ea1a 104 ******************************************************************************
NYX 0:85b3fd62ea1a 105 */
NYX 0:85b3fd62ea1a 106
NYX 0:85b3fd62ea1a 107 /* Includes ------------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 108 #include "stm32f4xx_hal.h"
NYX 0:85b3fd62ea1a 109
NYX 0:85b3fd62ea1a 110 /** @addtogroup STM32F4xx_HAL_Driver
NYX 0:85b3fd62ea1a 111 * @{
NYX 0:85b3fd62ea1a 112 */
NYX 0:85b3fd62ea1a 113
NYX 0:85b3fd62ea1a 114 /** @defgroup CAN CAN
NYX 0:85b3fd62ea1a 115 * @brief CAN driver modules
NYX 0:85b3fd62ea1a 116 * @{
NYX 0:85b3fd62ea1a 117 */
NYX 0:85b3fd62ea1a 118
NYX 0:85b3fd62ea1a 119 #ifdef HAL_CAN_MODULE_ENABLED
NYX 0:85b3fd62ea1a 120
NYX 0:85b3fd62ea1a 121 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\
NYX 0:85b3fd62ea1a 122 defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\
NYX 0:85b3fd62ea1a 123 defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\
NYX 0:85b3fd62ea1a 124 defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\
NYX 0:85b3fd62ea1a 125 defined(STM32F423xx)
NYX 0:85b3fd62ea1a 126
NYX 0:85b3fd62ea1a 127 /* Private typedef -----------------------------------------------------------*/
NYX 0:85b3fd62ea1a 128 /* Private define ------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 129 /** @addtogroup CAN_Private_Constants
NYX 0:85b3fd62ea1a 130 * @{
NYX 0:85b3fd62ea1a 131 */
NYX 0:85b3fd62ea1a 132 #define CAN_TIMEOUT_VALUE 10U
NYX 0:85b3fd62ea1a 133 /**
NYX 0:85b3fd62ea1a 134 * @}
NYX 0:85b3fd62ea1a 135 */
NYX 0:85b3fd62ea1a 136 /* Private macro -------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 137 /* Private variables ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 138 /* Private function prototypes -----------------------------------------------*/
NYX 0:85b3fd62ea1a 139 /** @addtogroup CAN_Private_Functions
NYX 0:85b3fd62ea1a 140 * @{
NYX 0:85b3fd62ea1a 141 */
NYX 0:85b3fd62ea1a 142 static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber);
NYX 0:85b3fd62ea1a 143 static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan);
NYX 0:85b3fd62ea1a 144 /**
NYX 0:85b3fd62ea1a 145 * @}
NYX 0:85b3fd62ea1a 146 */
NYX 0:85b3fd62ea1a 147
NYX 0:85b3fd62ea1a 148 /* Exported functions --------------------------------------------------------*/
NYX 0:85b3fd62ea1a 149 /** @defgroup CAN_Exported_Functions CAN Exported Functions
NYX 0:85b3fd62ea1a 150 * @{
NYX 0:85b3fd62ea1a 151 */
NYX 0:85b3fd62ea1a 152
NYX 0:85b3fd62ea1a 153 /** @defgroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 154 * @brief Initialization and Configuration functions
NYX 0:85b3fd62ea1a 155 *
NYX 0:85b3fd62ea1a 156 @verbatim
NYX 0:85b3fd62ea1a 157 ==============================================================================
NYX 0:85b3fd62ea1a 158 ##### Initialization and de-initialization functions #####
NYX 0:85b3fd62ea1a 159 ==============================================================================
NYX 0:85b3fd62ea1a 160 [..] This section provides functions allowing to:
NYX 0:85b3fd62ea1a 161 (+) Initialize and configure the CAN.
NYX 0:85b3fd62ea1a 162 (+) De-initialize the CAN.
NYX 0:85b3fd62ea1a 163
NYX 0:85b3fd62ea1a 164 @endverbatim
NYX 0:85b3fd62ea1a 165 * @{
NYX 0:85b3fd62ea1a 166 */
NYX 0:85b3fd62ea1a 167
NYX 0:85b3fd62ea1a 168 /**
NYX 0:85b3fd62ea1a 169 * @brief Initializes the CAN peripheral according to the specified
NYX 0:85b3fd62ea1a 170 * parameters in the CAN_InitStruct.
NYX 0:85b3fd62ea1a 171 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 172 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 173 * @retval HAL status
NYX 0:85b3fd62ea1a 174 */
NYX 0:85b3fd62ea1a 175 HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 176 {
NYX 0:85b3fd62ea1a 177 uint32_t InitStatus = CAN_INITSTATUS_FAILED;
NYX 0:85b3fd62ea1a 178 uint32_t tickstart = 0U;
NYX 0:85b3fd62ea1a 179
NYX 0:85b3fd62ea1a 180 /* Check CAN handle */
NYX 0:85b3fd62ea1a 181 if(hcan == NULL)
NYX 0:85b3fd62ea1a 182 {
NYX 0:85b3fd62ea1a 183 return HAL_ERROR;
NYX 0:85b3fd62ea1a 184 }
NYX 0:85b3fd62ea1a 185
NYX 0:85b3fd62ea1a 186 /* Check the parameters */
NYX 0:85b3fd62ea1a 187 assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
NYX 0:85b3fd62ea1a 188 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TTCM));
NYX 0:85b3fd62ea1a 189 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ABOM));
NYX 0:85b3fd62ea1a 190 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AWUM));
NYX 0:85b3fd62ea1a 191 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.NART));
NYX 0:85b3fd62ea1a 192 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.RFLM));
NYX 0:85b3fd62ea1a 193 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TXFP));
NYX 0:85b3fd62ea1a 194 assert_param(IS_CAN_MODE(hcan->Init.Mode));
NYX 0:85b3fd62ea1a 195 assert_param(IS_CAN_SJW(hcan->Init.SJW));
NYX 0:85b3fd62ea1a 196 assert_param(IS_CAN_BS1(hcan->Init.BS1));
NYX 0:85b3fd62ea1a 197 assert_param(IS_CAN_BS2(hcan->Init.BS2));
NYX 0:85b3fd62ea1a 198 assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler));
NYX 0:85b3fd62ea1a 199
NYX 0:85b3fd62ea1a 200
NYX 0:85b3fd62ea1a 201 if(hcan->State == HAL_CAN_STATE_RESET)
NYX 0:85b3fd62ea1a 202 {
NYX 0:85b3fd62ea1a 203 /* Allocate lock resource and initialize it */
NYX 0:85b3fd62ea1a 204 hcan->Lock = HAL_UNLOCKED;
NYX 0:85b3fd62ea1a 205 /* Init the low level hardware */
NYX 0:85b3fd62ea1a 206 HAL_CAN_MspInit(hcan);
NYX 0:85b3fd62ea1a 207 }
NYX 0:85b3fd62ea1a 208
NYX 0:85b3fd62ea1a 209 /* Initialize the CAN state*/
NYX 0:85b3fd62ea1a 210 hcan->State = HAL_CAN_STATE_BUSY;
NYX 0:85b3fd62ea1a 211
NYX 0:85b3fd62ea1a 212 /* Exit from sleep mode */
NYX 0:85b3fd62ea1a 213 hcan->Instance->MCR &= (~(uint32_t)CAN_MCR_SLEEP);
NYX 0:85b3fd62ea1a 214
NYX 0:85b3fd62ea1a 215 /* Request initialisation */
NYX 0:85b3fd62ea1a 216 hcan->Instance->MCR |= CAN_MCR_INRQ ;
NYX 0:85b3fd62ea1a 217
NYX 0:85b3fd62ea1a 218 /* Get tick */
NYX 0:85b3fd62ea1a 219 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 220
NYX 0:85b3fd62ea1a 221 /* Wait the acknowledge */
NYX 0:85b3fd62ea1a 222 while((hcan->Instance->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
NYX 0:85b3fd62ea1a 223 {
NYX 0:85b3fd62ea1a 224 if((HAL_GetTick() - tickstart ) > CAN_TIMEOUT_VALUE)
NYX 0:85b3fd62ea1a 225 {
NYX 0:85b3fd62ea1a 226 hcan->State= HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 227 /* Process unlocked */
NYX 0:85b3fd62ea1a 228 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 229 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 230 }
NYX 0:85b3fd62ea1a 231 }
NYX 0:85b3fd62ea1a 232
NYX 0:85b3fd62ea1a 233 /* Check acknowledge */
NYX 0:85b3fd62ea1a 234 if ((hcan->Instance->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
NYX 0:85b3fd62ea1a 235 {
NYX 0:85b3fd62ea1a 236 /* Set the time triggered communication mode */
NYX 0:85b3fd62ea1a 237 if (hcan->Init.TTCM == ENABLE)
NYX 0:85b3fd62ea1a 238 {
NYX 0:85b3fd62ea1a 239 hcan->Instance->MCR |= CAN_MCR_TTCM;
NYX 0:85b3fd62ea1a 240 }
NYX 0:85b3fd62ea1a 241 else
NYX 0:85b3fd62ea1a 242 {
NYX 0:85b3fd62ea1a 243 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_TTCM;
NYX 0:85b3fd62ea1a 244 }
NYX 0:85b3fd62ea1a 245
NYX 0:85b3fd62ea1a 246 /* Set the automatic bus-off management */
NYX 0:85b3fd62ea1a 247 if (hcan->Init.ABOM == ENABLE)
NYX 0:85b3fd62ea1a 248 {
NYX 0:85b3fd62ea1a 249 hcan->Instance->MCR |= CAN_MCR_ABOM;
NYX 0:85b3fd62ea1a 250 }
NYX 0:85b3fd62ea1a 251 else
NYX 0:85b3fd62ea1a 252 {
NYX 0:85b3fd62ea1a 253 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_ABOM;
NYX 0:85b3fd62ea1a 254 }
NYX 0:85b3fd62ea1a 255
NYX 0:85b3fd62ea1a 256 /* Set the automatic wake-up mode */
NYX 0:85b3fd62ea1a 257 if (hcan->Init.AWUM == ENABLE)
NYX 0:85b3fd62ea1a 258 {
NYX 0:85b3fd62ea1a 259 hcan->Instance->MCR |= CAN_MCR_AWUM;
NYX 0:85b3fd62ea1a 260 }
NYX 0:85b3fd62ea1a 261 else
NYX 0:85b3fd62ea1a 262 {
NYX 0:85b3fd62ea1a 263 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_AWUM;
NYX 0:85b3fd62ea1a 264 }
NYX 0:85b3fd62ea1a 265
NYX 0:85b3fd62ea1a 266 /* Set the no automatic retransmission */
NYX 0:85b3fd62ea1a 267 if (hcan->Init.NART == ENABLE)
NYX 0:85b3fd62ea1a 268 {
NYX 0:85b3fd62ea1a 269 hcan->Instance->MCR |= CAN_MCR_NART;
NYX 0:85b3fd62ea1a 270 }
NYX 0:85b3fd62ea1a 271 else
NYX 0:85b3fd62ea1a 272 {
NYX 0:85b3fd62ea1a 273 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_NART;
NYX 0:85b3fd62ea1a 274 }
NYX 0:85b3fd62ea1a 275
NYX 0:85b3fd62ea1a 276 /* Set the receive FIFO locked mode */
NYX 0:85b3fd62ea1a 277 if (hcan->Init.RFLM == ENABLE)
NYX 0:85b3fd62ea1a 278 {
NYX 0:85b3fd62ea1a 279 hcan->Instance->MCR |= CAN_MCR_RFLM;
NYX 0:85b3fd62ea1a 280 }
NYX 0:85b3fd62ea1a 281 else
NYX 0:85b3fd62ea1a 282 {
NYX 0:85b3fd62ea1a 283 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_RFLM;
NYX 0:85b3fd62ea1a 284 }
NYX 0:85b3fd62ea1a 285
NYX 0:85b3fd62ea1a 286 /* Set the transmit FIFO priority */
NYX 0:85b3fd62ea1a 287 if (hcan->Init.TXFP == ENABLE)
NYX 0:85b3fd62ea1a 288 {
NYX 0:85b3fd62ea1a 289 hcan->Instance->MCR |= CAN_MCR_TXFP;
NYX 0:85b3fd62ea1a 290 }
NYX 0:85b3fd62ea1a 291 else
NYX 0:85b3fd62ea1a 292 {
NYX 0:85b3fd62ea1a 293 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_TXFP;
NYX 0:85b3fd62ea1a 294 }
NYX 0:85b3fd62ea1a 295
NYX 0:85b3fd62ea1a 296 /* Set the bit timing register */
NYX 0:85b3fd62ea1a 297 hcan->Instance->BTR = (uint32_t)((uint32_t)hcan->Init.Mode) | \
NYX 0:85b3fd62ea1a 298 ((uint32_t)hcan->Init.SJW) | \
NYX 0:85b3fd62ea1a 299 ((uint32_t)hcan->Init.BS1) | \
NYX 0:85b3fd62ea1a 300 ((uint32_t)hcan->Init.BS2) | \
NYX 0:85b3fd62ea1a 301 ((uint32_t)hcan->Init.Prescaler - 1U);
NYX 0:85b3fd62ea1a 302
NYX 0:85b3fd62ea1a 303 /* Request leave initialisation */
NYX 0:85b3fd62ea1a 304 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_INRQ;
NYX 0:85b3fd62ea1a 305
NYX 0:85b3fd62ea1a 306 /* Get tick */
NYX 0:85b3fd62ea1a 307 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 308
NYX 0:85b3fd62ea1a 309 /* Wait the acknowledge */
NYX 0:85b3fd62ea1a 310 while((hcan->Instance->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
NYX 0:85b3fd62ea1a 311 {
NYX 0:85b3fd62ea1a 312 if((HAL_GetTick() - tickstart ) > CAN_TIMEOUT_VALUE)
NYX 0:85b3fd62ea1a 313 {
NYX 0:85b3fd62ea1a 314 hcan->State= HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 315 /* Process unlocked */
NYX 0:85b3fd62ea1a 316 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 317 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 318 }
NYX 0:85b3fd62ea1a 319 }
NYX 0:85b3fd62ea1a 320
NYX 0:85b3fd62ea1a 321 /* Check acknowledged */
NYX 0:85b3fd62ea1a 322 if ((hcan->Instance->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
NYX 0:85b3fd62ea1a 323 {
NYX 0:85b3fd62ea1a 324 InitStatus = CAN_INITSTATUS_SUCCESS;
NYX 0:85b3fd62ea1a 325 }
NYX 0:85b3fd62ea1a 326 }
NYX 0:85b3fd62ea1a 327
NYX 0:85b3fd62ea1a 328 if(InitStatus == CAN_INITSTATUS_SUCCESS)
NYX 0:85b3fd62ea1a 329 {
NYX 0:85b3fd62ea1a 330 /* Set CAN error code to none */
NYX 0:85b3fd62ea1a 331 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
NYX 0:85b3fd62ea1a 332
NYX 0:85b3fd62ea1a 333 /* Initialize the CAN state */
NYX 0:85b3fd62ea1a 334 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 335
NYX 0:85b3fd62ea1a 336 /* Return function status */
NYX 0:85b3fd62ea1a 337 return HAL_OK;
NYX 0:85b3fd62ea1a 338 }
NYX 0:85b3fd62ea1a 339 else
NYX 0:85b3fd62ea1a 340 {
NYX 0:85b3fd62ea1a 341 /* Initialize the CAN state */
NYX 0:85b3fd62ea1a 342 hcan->State = HAL_CAN_STATE_ERROR;
NYX 0:85b3fd62ea1a 343
NYX 0:85b3fd62ea1a 344 /* Return function status */
NYX 0:85b3fd62ea1a 345 return HAL_ERROR;
NYX 0:85b3fd62ea1a 346 }
NYX 0:85b3fd62ea1a 347 }
NYX 0:85b3fd62ea1a 348
NYX 0:85b3fd62ea1a 349 /**
NYX 0:85b3fd62ea1a 350 * @brief Configures the CAN reception filter according to the specified
NYX 0:85b3fd62ea1a 351 * parameters in the CAN_FilterInitStruct.
NYX 0:85b3fd62ea1a 352 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 353 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 354 * @param sFilterConfig: pointer to a CAN_FilterConfTypeDef structure that
NYX 0:85b3fd62ea1a 355 * contains the filter configuration information.
NYX 0:85b3fd62ea1a 356 * @retval None
NYX 0:85b3fd62ea1a 357 */
NYX 0:85b3fd62ea1a 358 HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig)
NYX 0:85b3fd62ea1a 359 {
NYX 0:85b3fd62ea1a 360 uint32_t filternbrbitpos = 0U;
NYX 0:85b3fd62ea1a 361 CAN_TypeDef *can_ip;
NYX 0:85b3fd62ea1a 362
NYX 0:85b3fd62ea1a 363 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 364 UNUSED(hcan);
NYX 0:85b3fd62ea1a 365
NYX 0:85b3fd62ea1a 366 /* Check the parameters */
NYX 0:85b3fd62ea1a 367 assert_param(IS_CAN_FILTER_NUMBER(sFilterConfig->FilterNumber));
NYX 0:85b3fd62ea1a 368 assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode));
NYX 0:85b3fd62ea1a 369 assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale));
NYX 0:85b3fd62ea1a 370 assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment));
NYX 0:85b3fd62ea1a 371 assert_param(IS_FUNCTIONAL_STATE(sFilterConfig->FilterActivation));
NYX 0:85b3fd62ea1a 372 assert_param(IS_CAN_BANKNUMBER(sFilterConfig->BankNumber));
NYX 0:85b3fd62ea1a 373
NYX 0:85b3fd62ea1a 374 filternbrbitpos = 1U << sFilterConfig->FilterNumber;
NYX 0:85b3fd62ea1a 375 #if defined (CAN3)
NYX 0:85b3fd62ea1a 376 /* Check the CAN instance */
NYX 0:85b3fd62ea1a 377 if(hcan->Instance == CAN3)
NYX 0:85b3fd62ea1a 378 {
NYX 0:85b3fd62ea1a 379 can_ip = CAN3;
NYX 0:85b3fd62ea1a 380 }
NYX 0:85b3fd62ea1a 381 else
NYX 0:85b3fd62ea1a 382 {
NYX 0:85b3fd62ea1a 383 can_ip = CAN1;
NYX 0:85b3fd62ea1a 384 }
NYX 0:85b3fd62ea1a 385 #else
NYX 0:85b3fd62ea1a 386 can_ip = CAN1;
NYX 0:85b3fd62ea1a 387 #endif
NYX 0:85b3fd62ea1a 388
NYX 0:85b3fd62ea1a 389 /* Initialisation mode for the filter */
NYX 0:85b3fd62ea1a 390 can_ip->FMR |= (uint32_t)CAN_FMR_FINIT;
NYX 0:85b3fd62ea1a 391
NYX 0:85b3fd62ea1a 392 #if defined (CAN2)
NYX 0:85b3fd62ea1a 393 /* Select the start slave bank */
NYX 0:85b3fd62ea1a 394 can_ip->FMR &= ~((uint32_t)CAN_FMR_CAN2SB);
NYX 0:85b3fd62ea1a 395 can_ip->FMR |= (uint32_t)(sFilterConfig->BankNumber << 8U);
NYX 0:85b3fd62ea1a 396 #endif
NYX 0:85b3fd62ea1a 397
NYX 0:85b3fd62ea1a 398 /* Filter Deactivation */
NYX 0:85b3fd62ea1a 399 can_ip->FA1R &= ~(uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 400
NYX 0:85b3fd62ea1a 401 /* Filter Scale */
NYX 0:85b3fd62ea1a 402 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT)
NYX 0:85b3fd62ea1a 403 {
NYX 0:85b3fd62ea1a 404 /* 16-bit scale for the filter */
NYX 0:85b3fd62ea1a 405 can_ip->FS1R &= ~(uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 406
NYX 0:85b3fd62ea1a 407 /* First 16-bit identifier and First 16-bit mask */
NYX 0:85b3fd62ea1a 408 /* Or First 16-bit identifier and Second 16-bit identifier */
NYX 0:85b3fd62ea1a 409 can_ip->sFilterRegister[sFilterConfig->FilterNumber].FR1 =
NYX 0:85b3fd62ea1a 410 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) |
NYX 0:85b3fd62ea1a 411 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
NYX 0:85b3fd62ea1a 412
NYX 0:85b3fd62ea1a 413 /* Second 16-bit identifier and Second 16-bit mask */
NYX 0:85b3fd62ea1a 414 /* Or Third 16-bit identifier and Fourth 16-bit identifier */
NYX 0:85b3fd62ea1a 415 can_ip->sFilterRegister[sFilterConfig->FilterNumber].FR2 =
NYX 0:85b3fd62ea1a 416 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
NYX 0:85b3fd62ea1a 417 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh);
NYX 0:85b3fd62ea1a 418 }
NYX 0:85b3fd62ea1a 419
NYX 0:85b3fd62ea1a 420 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT)
NYX 0:85b3fd62ea1a 421 {
NYX 0:85b3fd62ea1a 422 /* 32-bit scale for the filter */
NYX 0:85b3fd62ea1a 423 can_ip->FS1R |= filternbrbitpos;
NYX 0:85b3fd62ea1a 424
NYX 0:85b3fd62ea1a 425 /* 32-bit identifier or First 32-bit identifier */
NYX 0:85b3fd62ea1a 426 can_ip->sFilterRegister[sFilterConfig->FilterNumber].FR1 =
NYX 0:85b3fd62ea1a 427 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) |
NYX 0:85b3fd62ea1a 428 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
NYX 0:85b3fd62ea1a 429 /* 32-bit mask or Second 32-bit identifier */
NYX 0:85b3fd62ea1a 430 can_ip->sFilterRegister[sFilterConfig->FilterNumber].FR2 =
NYX 0:85b3fd62ea1a 431 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
NYX 0:85b3fd62ea1a 432 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow);
NYX 0:85b3fd62ea1a 433 }
NYX 0:85b3fd62ea1a 434
NYX 0:85b3fd62ea1a 435 /* Filter Mode */
NYX 0:85b3fd62ea1a 436 if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK)
NYX 0:85b3fd62ea1a 437 {
NYX 0:85b3fd62ea1a 438 /*Id/Mask mode for the filter*/
NYX 0:85b3fd62ea1a 439 can_ip->FM1R &= ~(uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 440 }
NYX 0:85b3fd62ea1a 441 else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */
NYX 0:85b3fd62ea1a 442 {
NYX 0:85b3fd62ea1a 443 /*Identifier list mode for the filter*/
NYX 0:85b3fd62ea1a 444 can_ip->FM1R |= (uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 445 }
NYX 0:85b3fd62ea1a 446
NYX 0:85b3fd62ea1a 447 /* Filter FIFO assignment */
NYX 0:85b3fd62ea1a 448 if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0)
NYX 0:85b3fd62ea1a 449 {
NYX 0:85b3fd62ea1a 450 /* FIFO 0 assignation for the filter */
NYX 0:85b3fd62ea1a 451 can_ip->FFA1R &= ~(uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 452 }
NYX 0:85b3fd62ea1a 453
NYX 0:85b3fd62ea1a 454 if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO1)
NYX 0:85b3fd62ea1a 455 {
NYX 0:85b3fd62ea1a 456 /* FIFO 1 assignation for the filter */
NYX 0:85b3fd62ea1a 457 can_ip->FFA1R |= (uint32_t)filternbrbitpos;
NYX 0:85b3fd62ea1a 458 }
NYX 0:85b3fd62ea1a 459
NYX 0:85b3fd62ea1a 460 /* Filter activation */
NYX 0:85b3fd62ea1a 461 if (sFilterConfig->FilterActivation == ENABLE)
NYX 0:85b3fd62ea1a 462 {
NYX 0:85b3fd62ea1a 463 can_ip->FA1R |= filternbrbitpos;
NYX 0:85b3fd62ea1a 464 }
NYX 0:85b3fd62ea1a 465
NYX 0:85b3fd62ea1a 466 /* Leave the initialisation mode for the filter */
NYX 0:85b3fd62ea1a 467 can_ip->FMR &= ~((uint32_t)CAN_FMR_FINIT);
NYX 0:85b3fd62ea1a 468
NYX 0:85b3fd62ea1a 469 /* Return function status */
NYX 0:85b3fd62ea1a 470 return HAL_OK;
NYX 0:85b3fd62ea1a 471 }
NYX 0:85b3fd62ea1a 472
NYX 0:85b3fd62ea1a 473 /**
NYX 0:85b3fd62ea1a 474 * @brief Deinitializes the CANx peripheral registers to their default reset values.
NYX 0:85b3fd62ea1a 475 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 476 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 477 * @retval HAL status
NYX 0:85b3fd62ea1a 478 */
NYX 0:85b3fd62ea1a 479 HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 480 {
NYX 0:85b3fd62ea1a 481 /* Check CAN handle */
NYX 0:85b3fd62ea1a 482 if(hcan == NULL)
NYX 0:85b3fd62ea1a 483 {
NYX 0:85b3fd62ea1a 484 return HAL_ERROR;
NYX 0:85b3fd62ea1a 485 }
NYX 0:85b3fd62ea1a 486
NYX 0:85b3fd62ea1a 487 /* Check the parameters */
NYX 0:85b3fd62ea1a 488 assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
NYX 0:85b3fd62ea1a 489
NYX 0:85b3fd62ea1a 490 /* Change CAN state */
NYX 0:85b3fd62ea1a 491 hcan->State = HAL_CAN_STATE_BUSY;
NYX 0:85b3fd62ea1a 492
NYX 0:85b3fd62ea1a 493 /* DeInit the low level hardware */
NYX 0:85b3fd62ea1a 494 HAL_CAN_MspDeInit(hcan);
NYX 0:85b3fd62ea1a 495
NYX 0:85b3fd62ea1a 496 /* Change CAN state */
NYX 0:85b3fd62ea1a 497 hcan->State = HAL_CAN_STATE_RESET;
NYX 0:85b3fd62ea1a 498
NYX 0:85b3fd62ea1a 499 /* Release Lock */
NYX 0:85b3fd62ea1a 500 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 501
NYX 0:85b3fd62ea1a 502 /* Return function status */
NYX 0:85b3fd62ea1a 503 return HAL_OK;
NYX 0:85b3fd62ea1a 504 }
NYX 0:85b3fd62ea1a 505
NYX 0:85b3fd62ea1a 506 /**
NYX 0:85b3fd62ea1a 507 * @brief Initializes the CAN MSP.
NYX 0:85b3fd62ea1a 508 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 509 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 510 * @retval None
NYX 0:85b3fd62ea1a 511 */
NYX 0:85b3fd62ea1a 512 __weak void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 513 {
NYX 0:85b3fd62ea1a 514 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 515 UNUSED(hcan);
NYX 0:85b3fd62ea1a 516 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 517 the HAL_CAN_MspInit could be implemented in the user file
NYX 0:85b3fd62ea1a 518 */
NYX 0:85b3fd62ea1a 519 }
NYX 0:85b3fd62ea1a 520
NYX 0:85b3fd62ea1a 521 /**
NYX 0:85b3fd62ea1a 522 * @brief DeInitializes the CAN MSP.
NYX 0:85b3fd62ea1a 523 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 524 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 525 * @retval None
NYX 0:85b3fd62ea1a 526 */
NYX 0:85b3fd62ea1a 527 __weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 528 {
NYX 0:85b3fd62ea1a 529 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 530 UNUSED(hcan);
NYX 0:85b3fd62ea1a 531 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 532 the HAL_CAN_MspDeInit could be implemented in the user file
NYX 0:85b3fd62ea1a 533 */
NYX 0:85b3fd62ea1a 534 }
NYX 0:85b3fd62ea1a 535
NYX 0:85b3fd62ea1a 536 /**
NYX 0:85b3fd62ea1a 537 * @}
NYX 0:85b3fd62ea1a 538 */
NYX 0:85b3fd62ea1a 539
NYX 0:85b3fd62ea1a 540 /** @defgroup CAN_Exported_Functions_Group2 IO operation functions
NYX 0:85b3fd62ea1a 541 * @brief IO operation functions
NYX 0:85b3fd62ea1a 542 *
NYX 0:85b3fd62ea1a 543 @verbatim
NYX 0:85b3fd62ea1a 544 ==============================================================================
NYX 0:85b3fd62ea1a 545 ##### IO operation functions #####
NYX 0:85b3fd62ea1a 546 ==============================================================================
NYX 0:85b3fd62ea1a 547 [..] This section provides functions allowing to:
NYX 0:85b3fd62ea1a 548 (+) Transmit a CAN frame message.
NYX 0:85b3fd62ea1a 549 (+) Receive a CAN frame message.
NYX 0:85b3fd62ea1a 550 (+) Enter CAN peripheral in sleep mode.
NYX 0:85b3fd62ea1a 551 (+) Wake up the CAN peripheral from sleep mode.
NYX 0:85b3fd62ea1a 552
NYX 0:85b3fd62ea1a 553 @endverbatim
NYX 0:85b3fd62ea1a 554 * @{
NYX 0:85b3fd62ea1a 555 */
NYX 0:85b3fd62ea1a 556
NYX 0:85b3fd62ea1a 557 /**
NYX 0:85b3fd62ea1a 558 * @brief Initiates and transmits a CAN frame message.
NYX 0:85b3fd62ea1a 559 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 560 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 561 * @param Timeout: Specify Timeout value
NYX 0:85b3fd62ea1a 562 * @retval HAL status
NYX 0:85b3fd62ea1a 563 */
NYX 0:85b3fd62ea1a 564 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)
NYX 0:85b3fd62ea1a 565 {
NYX 0:85b3fd62ea1a 566 uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
NYX 0:85b3fd62ea1a 567 uint32_t tickstart = 0U;
NYX 0:85b3fd62ea1a 568
NYX 0:85b3fd62ea1a 569 /* Check the parameters */
NYX 0:85b3fd62ea1a 570 assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
NYX 0:85b3fd62ea1a 571 assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
NYX 0:85b3fd62ea1a 572 assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
NYX 0:85b3fd62ea1a 573
NYX 0:85b3fd62ea1a 574 if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \
NYX 0:85b3fd62ea1a 575 ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \
NYX 0:85b3fd62ea1a 576 ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))
NYX 0:85b3fd62ea1a 577 {
NYX 0:85b3fd62ea1a 578 /* Process locked */
NYX 0:85b3fd62ea1a 579 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 580
NYX 0:85b3fd62ea1a 581 /* Change CAN state */
NYX 0:85b3fd62ea1a 582 switch(hcan->State)
NYX 0:85b3fd62ea1a 583 {
NYX 0:85b3fd62ea1a 584 case(HAL_CAN_STATE_BUSY_RX0):
NYX 0:85b3fd62ea1a 585 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 586 break;
NYX 0:85b3fd62ea1a 587 case(HAL_CAN_STATE_BUSY_RX1):
NYX 0:85b3fd62ea1a 588 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 589 break;
NYX 0:85b3fd62ea1a 590 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 591 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 592 break;
NYX 0:85b3fd62ea1a 593 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 594 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 595 break;
NYX 0:85b3fd62ea1a 596 }
NYX 0:85b3fd62ea1a 597
NYX 0:85b3fd62ea1a 598 /* Select one empty transmit mailbox */
NYX 0:85b3fd62ea1a 599 if ((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
NYX 0:85b3fd62ea1a 600 {
NYX 0:85b3fd62ea1a 601 transmitmailbox = CAN_TXMAILBOX_0;
NYX 0:85b3fd62ea1a 602 }
NYX 0:85b3fd62ea1a 603 else if ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
NYX 0:85b3fd62ea1a 604 {
NYX 0:85b3fd62ea1a 605 transmitmailbox = CAN_TXMAILBOX_1;
NYX 0:85b3fd62ea1a 606 }
NYX 0:85b3fd62ea1a 607 else
NYX 0:85b3fd62ea1a 608 {
NYX 0:85b3fd62ea1a 609 transmitmailbox = CAN_TXMAILBOX_2;
NYX 0:85b3fd62ea1a 610 }
NYX 0:85b3fd62ea1a 611
NYX 0:85b3fd62ea1a 612 /* Set up the Id */
NYX 0:85b3fd62ea1a 613 hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
NYX 0:85b3fd62ea1a 614 if (hcan->pTxMsg->IDE == CAN_ID_STD)
NYX 0:85b3fd62ea1a 615 {
NYX 0:85b3fd62ea1a 616 assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
NYX 0:85b3fd62ea1a 617 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21U) | \
NYX 0:85b3fd62ea1a 618 hcan->pTxMsg->RTR);
NYX 0:85b3fd62ea1a 619 }
NYX 0:85b3fd62ea1a 620 else
NYX 0:85b3fd62ea1a 621 {
NYX 0:85b3fd62ea1a 622 assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
NYX 0:85b3fd62ea1a 623 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3U) | \
NYX 0:85b3fd62ea1a 624 hcan->pTxMsg->IDE | \
NYX 0:85b3fd62ea1a 625 hcan->pTxMsg->RTR);
NYX 0:85b3fd62ea1a 626 }
NYX 0:85b3fd62ea1a 627
NYX 0:85b3fd62ea1a 628 /* Set up the DLC */
NYX 0:85b3fd62ea1a 629 hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
NYX 0:85b3fd62ea1a 630 hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U;
NYX 0:85b3fd62ea1a 631 hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
NYX 0:85b3fd62ea1a 632
NYX 0:85b3fd62ea1a 633 /* Set up the data field */
NYX 0:85b3fd62ea1a 634 hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) |
NYX 0:85b3fd62ea1a 635 ((uint32_t)hcan->pTxMsg->Data[2U] << 16U) |
NYX 0:85b3fd62ea1a 636 ((uint32_t)hcan->pTxMsg->Data[1U] << 8U) |
NYX 0:85b3fd62ea1a 637 ((uint32_t)hcan->pTxMsg->Data[0U]));
NYX 0:85b3fd62ea1a 638 hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) |
NYX 0:85b3fd62ea1a 639 ((uint32_t)hcan->pTxMsg->Data[6U] << 16U) |
NYX 0:85b3fd62ea1a 640 ((uint32_t)hcan->pTxMsg->Data[5U] << 8U) |
NYX 0:85b3fd62ea1a 641 ((uint32_t)hcan->pTxMsg->Data[4U]));
NYX 0:85b3fd62ea1a 642 /* Request transmission */
NYX 0:85b3fd62ea1a 643 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
NYX 0:85b3fd62ea1a 644
NYX 0:85b3fd62ea1a 645 /* Get tick */
NYX 0:85b3fd62ea1a 646 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 647
NYX 0:85b3fd62ea1a 648 /* Check End of transmission flag */
NYX 0:85b3fd62ea1a 649 while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
NYX 0:85b3fd62ea1a 650 {
NYX 0:85b3fd62ea1a 651 /* Check for the Timeout */
NYX 0:85b3fd62ea1a 652 if(Timeout != HAL_MAX_DELAY)
NYX 0:85b3fd62ea1a 653 {
NYX 0:85b3fd62ea1a 654 if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
NYX 0:85b3fd62ea1a 655 {
NYX 0:85b3fd62ea1a 656 hcan->State = HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 657
NYX 0:85b3fd62ea1a 658 __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);
NYX 0:85b3fd62ea1a 659
NYX 0:85b3fd62ea1a 660 /* Process unlocked */
NYX 0:85b3fd62ea1a 661 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 662 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 663 }
NYX 0:85b3fd62ea1a 664 }
NYX 0:85b3fd62ea1a 665 }
NYX 0:85b3fd62ea1a 666
NYX 0:85b3fd62ea1a 667 /* Change CAN state */
NYX 0:85b3fd62ea1a 668 switch(hcan->State)
NYX 0:85b3fd62ea1a 669 {
NYX 0:85b3fd62ea1a 670 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 671 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 672 break;
NYX 0:85b3fd62ea1a 673 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 674 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 675 break;
NYX 0:85b3fd62ea1a 676 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 677 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 678 break;
NYX 0:85b3fd62ea1a 679 default: /* HAL_CAN_STATE_BUSY_TX */
NYX 0:85b3fd62ea1a 680 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 681 break;
NYX 0:85b3fd62ea1a 682 }
NYX 0:85b3fd62ea1a 683
NYX 0:85b3fd62ea1a 684 /* Process unlocked */
NYX 0:85b3fd62ea1a 685 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 686
NYX 0:85b3fd62ea1a 687 /* Return function status */
NYX 0:85b3fd62ea1a 688 return HAL_OK;
NYX 0:85b3fd62ea1a 689 }
NYX 0:85b3fd62ea1a 690 else
NYX 0:85b3fd62ea1a 691 {
NYX 0:85b3fd62ea1a 692 /* Change CAN state */
NYX 0:85b3fd62ea1a 693 hcan->State = HAL_CAN_STATE_ERROR;
NYX 0:85b3fd62ea1a 694
NYX 0:85b3fd62ea1a 695 /* Return function status */
NYX 0:85b3fd62ea1a 696 return HAL_ERROR;
NYX 0:85b3fd62ea1a 697 }
NYX 0:85b3fd62ea1a 698 }
NYX 0:85b3fd62ea1a 699
NYX 0:85b3fd62ea1a 700 /**
NYX 0:85b3fd62ea1a 701 * @brief Initiates and transmits a CAN frame message.
NYX 0:85b3fd62ea1a 702 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 703 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 704 * @retval HAL status
NYX 0:85b3fd62ea1a 705 */
NYX 0:85b3fd62ea1a 706 HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 707 {
NYX 0:85b3fd62ea1a 708 uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
NYX 0:85b3fd62ea1a 709
NYX 0:85b3fd62ea1a 710 /* Check the parameters */
NYX 0:85b3fd62ea1a 711 assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
NYX 0:85b3fd62ea1a 712 assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
NYX 0:85b3fd62ea1a 713 assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
NYX 0:85b3fd62ea1a 714
NYX 0:85b3fd62ea1a 715 if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \
NYX 0:85b3fd62ea1a 716 ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \
NYX 0:85b3fd62ea1a 717 ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))
NYX 0:85b3fd62ea1a 718 {
NYX 0:85b3fd62ea1a 719 /* Process Locked */
NYX 0:85b3fd62ea1a 720 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 721
NYX 0:85b3fd62ea1a 722 /* Select one empty transmit mailbox */
NYX 0:85b3fd62ea1a 723 if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
NYX 0:85b3fd62ea1a 724 {
NYX 0:85b3fd62ea1a 725 transmitmailbox = CAN_TXMAILBOX_0;
NYX 0:85b3fd62ea1a 726 }
NYX 0:85b3fd62ea1a 727 else if((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
NYX 0:85b3fd62ea1a 728 {
NYX 0:85b3fd62ea1a 729 transmitmailbox = CAN_TXMAILBOX_1;
NYX 0:85b3fd62ea1a 730 }
NYX 0:85b3fd62ea1a 731 else
NYX 0:85b3fd62ea1a 732 {
NYX 0:85b3fd62ea1a 733 transmitmailbox = CAN_TXMAILBOX_2;
NYX 0:85b3fd62ea1a 734 }
NYX 0:85b3fd62ea1a 735
NYX 0:85b3fd62ea1a 736 /* Set up the Id */
NYX 0:85b3fd62ea1a 737 hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
NYX 0:85b3fd62ea1a 738 if(hcan->pTxMsg->IDE == CAN_ID_STD)
NYX 0:85b3fd62ea1a 739 {
NYX 0:85b3fd62ea1a 740 assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
NYX 0:85b3fd62ea1a 741 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21U) | \
NYX 0:85b3fd62ea1a 742 hcan->pTxMsg->RTR);
NYX 0:85b3fd62ea1a 743 }
NYX 0:85b3fd62ea1a 744 else
NYX 0:85b3fd62ea1a 745 {
NYX 0:85b3fd62ea1a 746 assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
NYX 0:85b3fd62ea1a 747 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3U) | \
NYX 0:85b3fd62ea1a 748 hcan->pTxMsg->IDE | \
NYX 0:85b3fd62ea1a 749 hcan->pTxMsg->RTR);
NYX 0:85b3fd62ea1a 750 }
NYX 0:85b3fd62ea1a 751
NYX 0:85b3fd62ea1a 752 /* Set up the DLC */
NYX 0:85b3fd62ea1a 753 hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
NYX 0:85b3fd62ea1a 754 hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U;
NYX 0:85b3fd62ea1a 755 hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
NYX 0:85b3fd62ea1a 756
NYX 0:85b3fd62ea1a 757 /* Set up the data field */
NYX 0:85b3fd62ea1a 758 hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) |
NYX 0:85b3fd62ea1a 759 ((uint32_t)hcan->pTxMsg->Data[2U] << 16U) |
NYX 0:85b3fd62ea1a 760 ((uint32_t)hcan->pTxMsg->Data[1U] << 8U) |
NYX 0:85b3fd62ea1a 761 ((uint32_t)hcan->pTxMsg->Data[0U]));
NYX 0:85b3fd62ea1a 762 hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) |
NYX 0:85b3fd62ea1a 763 ((uint32_t)hcan->pTxMsg->Data[6U] << 16U) |
NYX 0:85b3fd62ea1a 764 ((uint32_t)hcan->pTxMsg->Data[5U] << 8U) |
NYX 0:85b3fd62ea1a 765 ((uint32_t)hcan->pTxMsg->Data[4U]));
NYX 0:85b3fd62ea1a 766
NYX 0:85b3fd62ea1a 767 /* Change CAN state */
NYX 0:85b3fd62ea1a 768 switch(hcan->State)
NYX 0:85b3fd62ea1a 769 {
NYX 0:85b3fd62ea1a 770 case(HAL_CAN_STATE_BUSY_RX0):
NYX 0:85b3fd62ea1a 771 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 772 break;
NYX 0:85b3fd62ea1a 773 case(HAL_CAN_STATE_BUSY_RX1):
NYX 0:85b3fd62ea1a 774 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 775 break;
NYX 0:85b3fd62ea1a 776 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 777 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 778 break;
NYX 0:85b3fd62ea1a 779 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 780 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 781 break;
NYX 0:85b3fd62ea1a 782 }
NYX 0:85b3fd62ea1a 783
NYX 0:85b3fd62ea1a 784 /* Set CAN error code to none */
NYX 0:85b3fd62ea1a 785 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
NYX 0:85b3fd62ea1a 786
NYX 0:85b3fd62ea1a 787 /* Process Unlocked */
NYX 0:85b3fd62ea1a 788 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 789
NYX 0:85b3fd62ea1a 790 /* Request transmission */
NYX 0:85b3fd62ea1a 791 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
NYX 0:85b3fd62ea1a 792
NYX 0:85b3fd62ea1a 793 /* Enable Error warning, Error passive, Bus-off,
NYX 0:85b3fd62ea1a 794 Last error and Error Interrupts */
NYX 0:85b3fd62ea1a 795 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG |
NYX 0:85b3fd62ea1a 796 CAN_IT_EPV |
NYX 0:85b3fd62ea1a 797 CAN_IT_BOF |
NYX 0:85b3fd62ea1a 798 CAN_IT_LEC |
NYX 0:85b3fd62ea1a 799 CAN_IT_ERR |
NYX 0:85b3fd62ea1a 800 CAN_IT_TME);
NYX 0:85b3fd62ea1a 801 }
NYX 0:85b3fd62ea1a 802 else
NYX 0:85b3fd62ea1a 803 {
NYX 0:85b3fd62ea1a 804 /* Change CAN state */
NYX 0:85b3fd62ea1a 805 hcan->State = HAL_CAN_STATE_ERROR;
NYX 0:85b3fd62ea1a 806
NYX 0:85b3fd62ea1a 807 /* Return function status */
NYX 0:85b3fd62ea1a 808 return HAL_ERROR;
NYX 0:85b3fd62ea1a 809 }
NYX 0:85b3fd62ea1a 810
NYX 0:85b3fd62ea1a 811 return HAL_OK;
NYX 0:85b3fd62ea1a 812 }
NYX 0:85b3fd62ea1a 813
NYX 0:85b3fd62ea1a 814 /**
NYX 0:85b3fd62ea1a 815 * @brief Receives a correct CAN frame.
NYX 0:85b3fd62ea1a 816 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 817 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 818 * @param FIFONumber: FIFO Number value
NYX 0:85b3fd62ea1a 819 * @param Timeout: Specify Timeout value
NYX 0:85b3fd62ea1a 820 * @retval HAL status
NYX 0:85b3fd62ea1a 821 */
NYX 0:85b3fd62ea1a 822 HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, uint32_t Timeout)
NYX 0:85b3fd62ea1a 823 {
NYX 0:85b3fd62ea1a 824 uint32_t tickstart = 0U;
NYX 0:85b3fd62ea1a 825 CanRxMsgTypeDef* pRxMsg = NULL;
NYX 0:85b3fd62ea1a 826
NYX 0:85b3fd62ea1a 827 /* Check the parameters */
NYX 0:85b3fd62ea1a 828 assert_param(IS_CAN_FIFO(FIFONumber));
NYX 0:85b3fd62ea1a 829
NYX 0:85b3fd62ea1a 830 /* Check if CAN state is not busy for RX FIFO0 */
NYX 0:85b3fd62ea1a 831 if ((FIFONumber == CAN_FIFO0) && ((hcan->State == HAL_CAN_STATE_BUSY_RX0) || \
NYX 0:85b3fd62ea1a 832 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0) || \
NYX 0:85b3fd62ea1a 833 (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \
NYX 0:85b3fd62ea1a 834 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
NYX 0:85b3fd62ea1a 835 {
NYX 0:85b3fd62ea1a 836 return HAL_BUSY;
NYX 0:85b3fd62ea1a 837 }
NYX 0:85b3fd62ea1a 838
NYX 0:85b3fd62ea1a 839 /* Check if CAN state is not busy for RX FIFO1 */
NYX 0:85b3fd62ea1a 840 if ((FIFONumber == CAN_FIFO1) && ((hcan->State == HAL_CAN_STATE_BUSY_RX1) || \
NYX 0:85b3fd62ea1a 841 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX1) || \
NYX 0:85b3fd62ea1a 842 (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \
NYX 0:85b3fd62ea1a 843 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
NYX 0:85b3fd62ea1a 844 {
NYX 0:85b3fd62ea1a 845 return HAL_BUSY;
NYX 0:85b3fd62ea1a 846 }
NYX 0:85b3fd62ea1a 847
NYX 0:85b3fd62ea1a 848 /* Process locked */
NYX 0:85b3fd62ea1a 849 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 850
NYX 0:85b3fd62ea1a 851 /* Change CAN state */
NYX 0:85b3fd62ea1a 852 if (FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 853 {
NYX 0:85b3fd62ea1a 854 switch(hcan->State)
NYX 0:85b3fd62ea1a 855 {
NYX 0:85b3fd62ea1a 856 case(HAL_CAN_STATE_BUSY_TX):
NYX 0:85b3fd62ea1a 857 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 858 break;
NYX 0:85b3fd62ea1a 859 case(HAL_CAN_STATE_BUSY_RX1):
NYX 0:85b3fd62ea1a 860 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 861 break;
NYX 0:85b3fd62ea1a 862 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 863 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 864 break;
NYX 0:85b3fd62ea1a 865 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 866 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 867 break;
NYX 0:85b3fd62ea1a 868 }
NYX 0:85b3fd62ea1a 869 }
NYX 0:85b3fd62ea1a 870 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 871 {
NYX 0:85b3fd62ea1a 872 switch(hcan->State)
NYX 0:85b3fd62ea1a 873 {
NYX 0:85b3fd62ea1a 874 case(HAL_CAN_STATE_BUSY_TX):
NYX 0:85b3fd62ea1a 875 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 876 break;
NYX 0:85b3fd62ea1a 877 case(HAL_CAN_STATE_BUSY_RX0):
NYX 0:85b3fd62ea1a 878 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 879 break;
NYX 0:85b3fd62ea1a 880 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 881 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 882 break;
NYX 0:85b3fd62ea1a 883 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 884 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 885 break;
NYX 0:85b3fd62ea1a 886 }
NYX 0:85b3fd62ea1a 887 }
NYX 0:85b3fd62ea1a 888
NYX 0:85b3fd62ea1a 889 /* Get tick */
NYX 0:85b3fd62ea1a 890 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 891
NYX 0:85b3fd62ea1a 892 /* Check pending message */
NYX 0:85b3fd62ea1a 893 while(__HAL_CAN_MSG_PENDING(hcan, FIFONumber) == 0U)
NYX 0:85b3fd62ea1a 894 {
NYX 0:85b3fd62ea1a 895 /* Check for the Timeout */
NYX 0:85b3fd62ea1a 896 if(Timeout != HAL_MAX_DELAY)
NYX 0:85b3fd62ea1a 897 {
NYX 0:85b3fd62ea1a 898 if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
NYX 0:85b3fd62ea1a 899 {
NYX 0:85b3fd62ea1a 900 hcan->State = HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 901 /* Process unlocked */
NYX 0:85b3fd62ea1a 902 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 903 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 904 }
NYX 0:85b3fd62ea1a 905 }
NYX 0:85b3fd62ea1a 906 }
NYX 0:85b3fd62ea1a 907
NYX 0:85b3fd62ea1a 908 /* Set RxMsg pointer */
NYX 0:85b3fd62ea1a 909 if(FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 910 {
NYX 0:85b3fd62ea1a 911 pRxMsg = hcan->pRxMsg;
NYX 0:85b3fd62ea1a 912 }
NYX 0:85b3fd62ea1a 913 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 914 {
NYX 0:85b3fd62ea1a 915 pRxMsg = hcan->pRx1Msg;
NYX 0:85b3fd62ea1a 916 }
NYX 0:85b3fd62ea1a 917
NYX 0:85b3fd62ea1a 918 /* Get the Id */
NYX 0:85b3fd62ea1a 919 pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
NYX 0:85b3fd62ea1a 920 if (pRxMsg->IDE == CAN_ID_STD)
NYX 0:85b3fd62ea1a 921 {
NYX 0:85b3fd62ea1a 922 pRxMsg->StdId = 0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U);
NYX 0:85b3fd62ea1a 923 }
NYX 0:85b3fd62ea1a 924 else
NYX 0:85b3fd62ea1a 925 {
NYX 0:85b3fd62ea1a 926 pRxMsg->ExtId = 0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U);
NYX 0:85b3fd62ea1a 927 }
NYX 0:85b3fd62ea1a 928
NYX 0:85b3fd62ea1a 929 pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
NYX 0:85b3fd62ea1a 930 /* Get the DLC */
NYX 0:85b3fd62ea1a 931 pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
NYX 0:85b3fd62ea1a 932 /* Get the FMI */
NYX 0:85b3fd62ea1a 933 pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U);
NYX 0:85b3fd62ea1a 934 /* Get the FIFONumber */
NYX 0:85b3fd62ea1a 935 pRxMsg->FIFONumber = FIFONumber;
NYX 0:85b3fd62ea1a 936 /* Get the data field */
NYX 0:85b3fd62ea1a 937 pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
NYX 0:85b3fd62ea1a 938 pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U);
NYX 0:85b3fd62ea1a 939 pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U);
NYX 0:85b3fd62ea1a 940 pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U);
NYX 0:85b3fd62ea1a 941 pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
NYX 0:85b3fd62ea1a 942 pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U);
NYX 0:85b3fd62ea1a 943 pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U);
NYX 0:85b3fd62ea1a 944 pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U);
NYX 0:85b3fd62ea1a 945
NYX 0:85b3fd62ea1a 946 /* Release the FIFO */
NYX 0:85b3fd62ea1a 947 if(FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 948 {
NYX 0:85b3fd62ea1a 949 /* Release FIFO0 */
NYX 0:85b3fd62ea1a 950 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0);
NYX 0:85b3fd62ea1a 951 }
NYX 0:85b3fd62ea1a 952 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 953 {
NYX 0:85b3fd62ea1a 954 /* Release FIFO1 */
NYX 0:85b3fd62ea1a 955 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1);
NYX 0:85b3fd62ea1a 956 }
NYX 0:85b3fd62ea1a 957
NYX 0:85b3fd62ea1a 958 /* Change CAN state */
NYX 0:85b3fd62ea1a 959 if (FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 960 {
NYX 0:85b3fd62ea1a 961 switch(hcan->State)
NYX 0:85b3fd62ea1a 962 {
NYX 0:85b3fd62ea1a 963 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 964 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 965 break;
NYX 0:85b3fd62ea1a 966 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 967 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 968 break;
NYX 0:85b3fd62ea1a 969 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 970 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 971 break;
NYX 0:85b3fd62ea1a 972 default: /* HAL_CAN_STATE_BUSY_RX0 */
NYX 0:85b3fd62ea1a 973 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 974 break;
NYX 0:85b3fd62ea1a 975 }
NYX 0:85b3fd62ea1a 976 }
NYX 0:85b3fd62ea1a 977 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 978 {
NYX 0:85b3fd62ea1a 979 switch(hcan->State)
NYX 0:85b3fd62ea1a 980 {
NYX 0:85b3fd62ea1a 981 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 982 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 983 break;
NYX 0:85b3fd62ea1a 984 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 985 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 986 break;
NYX 0:85b3fd62ea1a 987 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 988 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 989 break;
NYX 0:85b3fd62ea1a 990 default: /* HAL_CAN_STATE_BUSY_RX1 */
NYX 0:85b3fd62ea1a 991 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 992 break;
NYX 0:85b3fd62ea1a 993 }
NYX 0:85b3fd62ea1a 994 }
NYX 0:85b3fd62ea1a 995
NYX 0:85b3fd62ea1a 996 /* Process unlocked */
NYX 0:85b3fd62ea1a 997 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 998
NYX 0:85b3fd62ea1a 999 /* Return function status */
NYX 0:85b3fd62ea1a 1000 return HAL_OK;
NYX 0:85b3fd62ea1a 1001 }
NYX 0:85b3fd62ea1a 1002
NYX 0:85b3fd62ea1a 1003 /**
NYX 0:85b3fd62ea1a 1004 * @brief Receives a correct CAN frame.
NYX 0:85b3fd62ea1a 1005 * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1006 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1007 * @param FIFONumber: Specify the FIFO number
NYX 0:85b3fd62ea1a 1008 * @retval HAL status
NYX 0:85b3fd62ea1a 1009 */
NYX 0:85b3fd62ea1a 1010 HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
NYX 0:85b3fd62ea1a 1011 {
NYX 0:85b3fd62ea1a 1012 /* Check the parameters */
NYX 0:85b3fd62ea1a 1013 assert_param(IS_CAN_FIFO(FIFONumber));
NYX 0:85b3fd62ea1a 1014
NYX 0:85b3fd62ea1a 1015 /* Check if CAN state is not busy for RX FIFO0 */
NYX 0:85b3fd62ea1a 1016 if((FIFONumber == CAN_FIFO0) && ((hcan->State == HAL_CAN_STATE_BUSY_RX0) || \
NYX 0:85b3fd62ea1a 1017 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0) || \
NYX 0:85b3fd62ea1a 1018 (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \
NYX 0:85b3fd62ea1a 1019 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
NYX 0:85b3fd62ea1a 1020 {
NYX 0:85b3fd62ea1a 1021 return HAL_BUSY;
NYX 0:85b3fd62ea1a 1022 }
NYX 0:85b3fd62ea1a 1023
NYX 0:85b3fd62ea1a 1024 /* Check if CAN state is not busy for RX FIFO1 */
NYX 0:85b3fd62ea1a 1025 if((FIFONumber == CAN_FIFO1) && ((hcan->State == HAL_CAN_STATE_BUSY_RX1) || \
NYX 0:85b3fd62ea1a 1026 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX1) || \
NYX 0:85b3fd62ea1a 1027 (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \
NYX 0:85b3fd62ea1a 1028 (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
NYX 0:85b3fd62ea1a 1029 {
NYX 0:85b3fd62ea1a 1030 return HAL_BUSY;
NYX 0:85b3fd62ea1a 1031 }
NYX 0:85b3fd62ea1a 1032
NYX 0:85b3fd62ea1a 1033 /* Process locked */
NYX 0:85b3fd62ea1a 1034 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 1035
NYX 0:85b3fd62ea1a 1036 /* Change CAN state */
NYX 0:85b3fd62ea1a 1037 if(FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 1038 {
NYX 0:85b3fd62ea1a 1039 switch(hcan->State)
NYX 0:85b3fd62ea1a 1040 {
NYX 0:85b3fd62ea1a 1041 case(HAL_CAN_STATE_BUSY_TX):
NYX 0:85b3fd62ea1a 1042 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 1043 break;
NYX 0:85b3fd62ea1a 1044 case(HAL_CAN_STATE_BUSY_RX1):
NYX 0:85b3fd62ea1a 1045 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 1046 break;
NYX 0:85b3fd62ea1a 1047 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 1048 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 1049 break;
NYX 0:85b3fd62ea1a 1050 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 1051 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 1052 break;
NYX 0:85b3fd62ea1a 1053 }
NYX 0:85b3fd62ea1a 1054 }
NYX 0:85b3fd62ea1a 1055 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 1056 {
NYX 0:85b3fd62ea1a 1057 switch(hcan->State)
NYX 0:85b3fd62ea1a 1058 {
NYX 0:85b3fd62ea1a 1059 case(HAL_CAN_STATE_BUSY_TX):
NYX 0:85b3fd62ea1a 1060 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 1061 break;
NYX 0:85b3fd62ea1a 1062 case(HAL_CAN_STATE_BUSY_RX0):
NYX 0:85b3fd62ea1a 1063 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 1064 break;
NYX 0:85b3fd62ea1a 1065 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 1066 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
NYX 0:85b3fd62ea1a 1067 break;
NYX 0:85b3fd62ea1a 1068 default: /* HAL_CAN_STATE_READY */
NYX 0:85b3fd62ea1a 1069 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 1070 break;
NYX 0:85b3fd62ea1a 1071 }
NYX 0:85b3fd62ea1a 1072 }
NYX 0:85b3fd62ea1a 1073 /* Set CAN error code to none */
NYX 0:85b3fd62ea1a 1074 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
NYX 0:85b3fd62ea1a 1075
NYX 0:85b3fd62ea1a 1076 /* Enable interrupts: */
NYX 0:85b3fd62ea1a 1077 /* - Enable Error warning Interrupt */
NYX 0:85b3fd62ea1a 1078 /* - Enable Error passive Interrupt */
NYX 0:85b3fd62ea1a 1079 /* - Enable Bus-off Interrupt */
NYX 0:85b3fd62ea1a 1080 /* - Enable Last error code Interrupt */
NYX 0:85b3fd62ea1a 1081 /* - Enable Error Interrupt */
NYX 0:85b3fd62ea1a 1082 /* - Enable Transmit mailbox empty Interrupt */
NYX 0:85b3fd62ea1a 1083 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG |
NYX 0:85b3fd62ea1a 1084 CAN_IT_EPV |
NYX 0:85b3fd62ea1a 1085 CAN_IT_BOF |
NYX 0:85b3fd62ea1a 1086 CAN_IT_LEC |
NYX 0:85b3fd62ea1a 1087 CAN_IT_ERR |
NYX 0:85b3fd62ea1a 1088 CAN_IT_TME);
NYX 0:85b3fd62ea1a 1089
NYX 0:85b3fd62ea1a 1090 /* Process unlocked */
NYX 0:85b3fd62ea1a 1091 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1092
NYX 0:85b3fd62ea1a 1093 if(FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 1094 {
NYX 0:85b3fd62ea1a 1095 /* Enable FIFO 0 overrun and message pending Interrupt */
NYX 0:85b3fd62ea1a 1096 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0);
NYX 0:85b3fd62ea1a 1097 }
NYX 0:85b3fd62ea1a 1098 else
NYX 0:85b3fd62ea1a 1099 {
NYX 0:85b3fd62ea1a 1100 /* Enable FIFO 1 overrun and message pending Interrupt */
NYX 0:85b3fd62ea1a 1101 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1);
NYX 0:85b3fd62ea1a 1102 }
NYX 0:85b3fd62ea1a 1103
NYX 0:85b3fd62ea1a 1104 /* Return function status */
NYX 0:85b3fd62ea1a 1105 return HAL_OK;
NYX 0:85b3fd62ea1a 1106 }
NYX 0:85b3fd62ea1a 1107
NYX 0:85b3fd62ea1a 1108 /**
NYX 0:85b3fd62ea1a 1109 * @brief Enters the Sleep (low power) mode.
NYX 0:85b3fd62ea1a 1110 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1111 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1112 * @retval HAL status.
NYX 0:85b3fd62ea1a 1113 */
NYX 0:85b3fd62ea1a 1114 HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1115 {
NYX 0:85b3fd62ea1a 1116 uint32_t tickstart = 0U;
NYX 0:85b3fd62ea1a 1117
NYX 0:85b3fd62ea1a 1118 /* Process locked */
NYX 0:85b3fd62ea1a 1119 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 1120
NYX 0:85b3fd62ea1a 1121 /* Change CAN state */
NYX 0:85b3fd62ea1a 1122 hcan->State = HAL_CAN_STATE_BUSY;
NYX 0:85b3fd62ea1a 1123
NYX 0:85b3fd62ea1a 1124 /* Request Sleep mode */
NYX 0:85b3fd62ea1a 1125 hcan->Instance->MCR = (((hcan->Instance->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP);
NYX 0:85b3fd62ea1a 1126
NYX 0:85b3fd62ea1a 1127 /* Sleep mode status */
NYX 0:85b3fd62ea1a 1128 if ((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK)
NYX 0:85b3fd62ea1a 1129 {
NYX 0:85b3fd62ea1a 1130 /* Process unlocked */
NYX 0:85b3fd62ea1a 1131 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1132
NYX 0:85b3fd62ea1a 1133 /* Return function status */
NYX 0:85b3fd62ea1a 1134 return HAL_ERROR;
NYX 0:85b3fd62ea1a 1135 }
NYX 0:85b3fd62ea1a 1136
NYX 0:85b3fd62ea1a 1137 /* Get tick */
NYX 0:85b3fd62ea1a 1138 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 1139
NYX 0:85b3fd62ea1a 1140 /* Wait the acknowledge */
NYX 0:85b3fd62ea1a 1141 while((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK)
NYX 0:85b3fd62ea1a 1142 {
NYX 0:85b3fd62ea1a 1143 if((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
NYX 0:85b3fd62ea1a 1144 {
NYX 0:85b3fd62ea1a 1145 hcan->State = HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 1146 /* Process unlocked */
NYX 0:85b3fd62ea1a 1147 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1148 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 1149 }
NYX 0:85b3fd62ea1a 1150 }
NYX 0:85b3fd62ea1a 1151
NYX 0:85b3fd62ea1a 1152 /* Change CAN state */
NYX 0:85b3fd62ea1a 1153 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1154
NYX 0:85b3fd62ea1a 1155 /* Process unlocked */
NYX 0:85b3fd62ea1a 1156 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1157
NYX 0:85b3fd62ea1a 1158 /* Return function status */
NYX 0:85b3fd62ea1a 1159 return HAL_OK;
NYX 0:85b3fd62ea1a 1160 }
NYX 0:85b3fd62ea1a 1161
NYX 0:85b3fd62ea1a 1162 /**
NYX 0:85b3fd62ea1a 1163 * @brief Wakes up the CAN peripheral from sleep mode, after that the CAN peripheral
NYX 0:85b3fd62ea1a 1164 * is in the normal mode.
NYX 0:85b3fd62ea1a 1165 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1166 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1167 * @retval HAL status.
NYX 0:85b3fd62ea1a 1168 */
NYX 0:85b3fd62ea1a 1169 HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1170 {
NYX 0:85b3fd62ea1a 1171 uint32_t tickstart = 0U;
NYX 0:85b3fd62ea1a 1172
NYX 0:85b3fd62ea1a 1173 /* Process locked */
NYX 0:85b3fd62ea1a 1174 __HAL_LOCK(hcan);
NYX 0:85b3fd62ea1a 1175
NYX 0:85b3fd62ea1a 1176 /* Change CAN state */
NYX 0:85b3fd62ea1a 1177 hcan->State = HAL_CAN_STATE_BUSY;
NYX 0:85b3fd62ea1a 1178
NYX 0:85b3fd62ea1a 1179 /* Wake up request */
NYX 0:85b3fd62ea1a 1180 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_SLEEP;
NYX 0:85b3fd62ea1a 1181
NYX 0:85b3fd62ea1a 1182 /* Get tick */
NYX 0:85b3fd62ea1a 1183 tickstart = HAL_GetTick();
NYX 0:85b3fd62ea1a 1184
NYX 0:85b3fd62ea1a 1185 /* Sleep mode status */
NYX 0:85b3fd62ea1a 1186 while((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)
NYX 0:85b3fd62ea1a 1187 {
NYX 0:85b3fd62ea1a 1188 if((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
NYX 0:85b3fd62ea1a 1189 {
NYX 0:85b3fd62ea1a 1190 hcan->State= HAL_CAN_STATE_TIMEOUT;
NYX 0:85b3fd62ea1a 1191 /* Process unlocked */
NYX 0:85b3fd62ea1a 1192 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1193 return HAL_TIMEOUT;
NYX 0:85b3fd62ea1a 1194 }
NYX 0:85b3fd62ea1a 1195 }
NYX 0:85b3fd62ea1a 1196 if((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)
NYX 0:85b3fd62ea1a 1197 {
NYX 0:85b3fd62ea1a 1198 /* Process unlocked */
NYX 0:85b3fd62ea1a 1199 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1200
NYX 0:85b3fd62ea1a 1201 /* Return function status */
NYX 0:85b3fd62ea1a 1202 return HAL_ERROR;
NYX 0:85b3fd62ea1a 1203 }
NYX 0:85b3fd62ea1a 1204
NYX 0:85b3fd62ea1a 1205 /* Change CAN state */
NYX 0:85b3fd62ea1a 1206 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1207
NYX 0:85b3fd62ea1a 1208 /* Process unlocked */
NYX 0:85b3fd62ea1a 1209 __HAL_UNLOCK(hcan);
NYX 0:85b3fd62ea1a 1210
NYX 0:85b3fd62ea1a 1211 /* Return function status */
NYX 0:85b3fd62ea1a 1212 return HAL_OK;
NYX 0:85b3fd62ea1a 1213 }
NYX 0:85b3fd62ea1a 1214
NYX 0:85b3fd62ea1a 1215 /**
NYX 0:85b3fd62ea1a 1216 * @brief Handles CAN interrupt request
NYX 0:85b3fd62ea1a 1217 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1218 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1219 * @retval None
NYX 0:85b3fd62ea1a 1220 */
NYX 0:85b3fd62ea1a 1221 void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1222 {
NYX 0:85b3fd62ea1a 1223 uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U;
NYX 0:85b3fd62ea1a 1224 uint32_t errorcode = HAL_CAN_ERROR_NONE;
NYX 0:85b3fd62ea1a 1225
NYX 0:85b3fd62ea1a 1226 /* Check Overrun flag for FIFO0 */
NYX 0:85b3fd62ea1a 1227 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0);
NYX 0:85b3fd62ea1a 1228 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV0);
NYX 0:85b3fd62ea1a 1229 if(tmp1 && tmp2)
NYX 0:85b3fd62ea1a 1230 {
NYX 0:85b3fd62ea1a 1231 /* Set CAN error code to FOV0 error */
NYX 0:85b3fd62ea1a 1232 errorcode |= HAL_CAN_ERROR_FOV0;
NYX 0:85b3fd62ea1a 1233
NYX 0:85b3fd62ea1a 1234 /* Clear FIFO0 Overrun Flag */
NYX 0:85b3fd62ea1a 1235 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
NYX 0:85b3fd62ea1a 1236 }
NYX 0:85b3fd62ea1a 1237 /* Check Overrun flag for FIFO1 */
NYX 0:85b3fd62ea1a 1238 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1);
NYX 0:85b3fd62ea1a 1239 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV1);
NYX 0:85b3fd62ea1a 1240
NYX 0:85b3fd62ea1a 1241 if(tmp1 && tmp2)
NYX 0:85b3fd62ea1a 1242 {
NYX 0:85b3fd62ea1a 1243 /* Set CAN error code to FOV1 error */
NYX 0:85b3fd62ea1a 1244 errorcode |= HAL_CAN_ERROR_FOV1;
NYX 0:85b3fd62ea1a 1245
NYX 0:85b3fd62ea1a 1246 /* Clear FIFO1 Overrun Flag */
NYX 0:85b3fd62ea1a 1247 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
NYX 0:85b3fd62ea1a 1248 }
NYX 0:85b3fd62ea1a 1249
NYX 0:85b3fd62ea1a 1250 /* Check End of transmission flag */
NYX 0:85b3fd62ea1a 1251 if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
NYX 0:85b3fd62ea1a 1252 {
NYX 0:85b3fd62ea1a 1253 tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
NYX 0:85b3fd62ea1a 1254 tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);
NYX 0:85b3fd62ea1a 1255 tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);
NYX 0:85b3fd62ea1a 1256 if(tmp1 || tmp2 || tmp3)
NYX 0:85b3fd62ea1a 1257 {
NYX 0:85b3fd62ea1a 1258 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);
NYX 0:85b3fd62ea1a 1259 tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);
NYX 0:85b3fd62ea1a 1260 tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);
NYX 0:85b3fd62ea1a 1261 /* Check Transmit success */
NYX 0:85b3fd62ea1a 1262 if(tmp1 || tmp2 || tmp3)
NYX 0:85b3fd62ea1a 1263 {
NYX 0:85b3fd62ea1a 1264 /* Call transmit function */
NYX 0:85b3fd62ea1a 1265 CAN_Transmit_IT(hcan);
NYX 0:85b3fd62ea1a 1266 }
NYX 0:85b3fd62ea1a 1267 else /* Transmit failure */
NYX 0:85b3fd62ea1a 1268 {
NYX 0:85b3fd62ea1a 1269 /* Set CAN error code to TXFAIL error */
NYX 0:85b3fd62ea1a 1270 errorcode |= HAL_CAN_ERROR_TXFAIL;
NYX 0:85b3fd62ea1a 1271 }
NYX 0:85b3fd62ea1a 1272
NYX 0:85b3fd62ea1a 1273 /* Clear transmission status flags (RQCPx and TXOKx) */
NYX 0:85b3fd62ea1a 1274 SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \
NYX 0:85b3fd62ea1a 1275 CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);
NYX 0:85b3fd62ea1a 1276 }
NYX 0:85b3fd62ea1a 1277 }
NYX 0:85b3fd62ea1a 1278
NYX 0:85b3fd62ea1a 1279 tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0);
NYX 0:85b3fd62ea1a 1280 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0);
NYX 0:85b3fd62ea1a 1281 /* Check End of reception flag for FIFO0 */
NYX 0:85b3fd62ea1a 1282 if((tmp1 != 0U) && tmp2)
NYX 0:85b3fd62ea1a 1283 {
NYX 0:85b3fd62ea1a 1284 /* Call receive function */
NYX 0:85b3fd62ea1a 1285 CAN_Receive_IT(hcan, CAN_FIFO0);
NYX 0:85b3fd62ea1a 1286 }
NYX 0:85b3fd62ea1a 1287
NYX 0:85b3fd62ea1a 1288 tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1);
NYX 0:85b3fd62ea1a 1289 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1);
NYX 0:85b3fd62ea1a 1290 /* Check End of reception flag for FIFO1 */
NYX 0:85b3fd62ea1a 1291 if((tmp1 != 0U) && tmp2)
NYX 0:85b3fd62ea1a 1292 {
NYX 0:85b3fd62ea1a 1293 /* Call receive function */
NYX 0:85b3fd62ea1a 1294 CAN_Receive_IT(hcan, CAN_FIFO1);
NYX 0:85b3fd62ea1a 1295 }
NYX 0:85b3fd62ea1a 1296
NYX 0:85b3fd62ea1a 1297 /* Set error code in handle */
NYX 0:85b3fd62ea1a 1298 hcan->ErrorCode |= errorcode;
NYX 0:85b3fd62ea1a 1299
NYX 0:85b3fd62ea1a 1300 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EWG);
NYX 0:85b3fd62ea1a 1301 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EWG);
NYX 0:85b3fd62ea1a 1302 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
NYX 0:85b3fd62ea1a 1303 /* Check Error Warning Flag */
NYX 0:85b3fd62ea1a 1304 if(tmp1 && tmp2 && tmp3)
NYX 0:85b3fd62ea1a 1305 {
NYX 0:85b3fd62ea1a 1306 /* Set CAN error code to EWG error */
NYX 0:85b3fd62ea1a 1307 hcan->ErrorCode |= HAL_CAN_ERROR_EWG;
NYX 0:85b3fd62ea1a 1308 }
NYX 0:85b3fd62ea1a 1309
NYX 0:85b3fd62ea1a 1310 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EPV);
NYX 0:85b3fd62ea1a 1311 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EPV);
NYX 0:85b3fd62ea1a 1312 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
NYX 0:85b3fd62ea1a 1313 /* Check Error Passive Flag */
NYX 0:85b3fd62ea1a 1314 if(tmp1 && tmp2 && tmp3)
NYX 0:85b3fd62ea1a 1315 {
NYX 0:85b3fd62ea1a 1316 /* Set CAN error code to EPV error */
NYX 0:85b3fd62ea1a 1317 hcan->ErrorCode |= HAL_CAN_ERROR_EPV;
NYX 0:85b3fd62ea1a 1318 }
NYX 0:85b3fd62ea1a 1319
NYX 0:85b3fd62ea1a 1320 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_BOF);
NYX 0:85b3fd62ea1a 1321 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_BOF);
NYX 0:85b3fd62ea1a 1322 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
NYX 0:85b3fd62ea1a 1323 /* Check Bus-Off Flag */
NYX 0:85b3fd62ea1a 1324 if(tmp1 && tmp2 && tmp3)
NYX 0:85b3fd62ea1a 1325 {
NYX 0:85b3fd62ea1a 1326 /* Set CAN error code to BOF error */
NYX 0:85b3fd62ea1a 1327 hcan->ErrorCode |= HAL_CAN_ERROR_BOF;
NYX 0:85b3fd62ea1a 1328 }
NYX 0:85b3fd62ea1a 1329
NYX 0:85b3fd62ea1a 1330 tmp1 = HAL_IS_BIT_CLR(hcan->Instance->ESR, CAN_ESR_LEC);
NYX 0:85b3fd62ea1a 1331 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_LEC);
NYX 0:85b3fd62ea1a 1332 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
NYX 0:85b3fd62ea1a 1333 /* Check Last error code Flag */
NYX 0:85b3fd62ea1a 1334 if((!tmp1) && tmp2 && tmp3)
NYX 0:85b3fd62ea1a 1335 {
NYX 0:85b3fd62ea1a 1336 tmp1 = (hcan->Instance->ESR) & CAN_ESR_LEC;
NYX 0:85b3fd62ea1a 1337 switch(tmp1)
NYX 0:85b3fd62ea1a 1338 {
NYX 0:85b3fd62ea1a 1339 case(CAN_ESR_LEC_0):
NYX 0:85b3fd62ea1a 1340 /* Set CAN error code to STF error */
NYX 0:85b3fd62ea1a 1341 hcan->ErrorCode |= HAL_CAN_ERROR_STF;
NYX 0:85b3fd62ea1a 1342 break;
NYX 0:85b3fd62ea1a 1343 case(CAN_ESR_LEC_1):
NYX 0:85b3fd62ea1a 1344 /* Set CAN error code to FOR error */
NYX 0:85b3fd62ea1a 1345 hcan->ErrorCode |= HAL_CAN_ERROR_FOR;
NYX 0:85b3fd62ea1a 1346 break;
NYX 0:85b3fd62ea1a 1347 case(CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
NYX 0:85b3fd62ea1a 1348 /* Set CAN error code to ACK error */
NYX 0:85b3fd62ea1a 1349 hcan->ErrorCode |= HAL_CAN_ERROR_ACK;
NYX 0:85b3fd62ea1a 1350 break;
NYX 0:85b3fd62ea1a 1351 case(CAN_ESR_LEC_2):
NYX 0:85b3fd62ea1a 1352 /* Set CAN error code to BR error */
NYX 0:85b3fd62ea1a 1353 hcan->ErrorCode |= HAL_CAN_ERROR_BR;
NYX 0:85b3fd62ea1a 1354 break;
NYX 0:85b3fd62ea1a 1355 case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
NYX 0:85b3fd62ea1a 1356 /* Set CAN error code to BD error */
NYX 0:85b3fd62ea1a 1357 hcan->ErrorCode |= HAL_CAN_ERROR_BD;
NYX 0:85b3fd62ea1a 1358 break;
NYX 0:85b3fd62ea1a 1359 case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
NYX 0:85b3fd62ea1a 1360 /* Set CAN error code to CRC error */
NYX 0:85b3fd62ea1a 1361 hcan->ErrorCode |= HAL_CAN_ERROR_CRC;
NYX 0:85b3fd62ea1a 1362 break;
NYX 0:85b3fd62ea1a 1363 default:
NYX 0:85b3fd62ea1a 1364 break;
NYX 0:85b3fd62ea1a 1365 }
NYX 0:85b3fd62ea1a 1366
NYX 0:85b3fd62ea1a 1367 /* Clear Last error code Flag */
NYX 0:85b3fd62ea1a 1368 hcan->Instance->ESR &= ~(CAN_ESR_LEC);
NYX 0:85b3fd62ea1a 1369 }
NYX 0:85b3fd62ea1a 1370
NYX 0:85b3fd62ea1a 1371 /* Call the Error call Back in case of Errors */
NYX 0:85b3fd62ea1a 1372 if(hcan->ErrorCode != HAL_CAN_ERROR_NONE)
NYX 0:85b3fd62ea1a 1373 {
NYX 0:85b3fd62ea1a 1374 /* Clear ERRI Flag */
NYX 0:85b3fd62ea1a 1375 hcan->Instance->MSR = CAN_MSR_ERRI;
NYX 0:85b3fd62ea1a 1376 /* Set the CAN state ready to be able to start again the process */
NYX 0:85b3fd62ea1a 1377 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1378
NYX 0:85b3fd62ea1a 1379 /* Disable interrupts: */
NYX 0:85b3fd62ea1a 1380 /* - Disable Error warning Interrupt */
NYX 0:85b3fd62ea1a 1381 /* - Disable Error passive Interrupt */
NYX 0:85b3fd62ea1a 1382 /* - Disable Bus-off Interrupt */
NYX 0:85b3fd62ea1a 1383 /* - Disable Last error code Interrupt */
NYX 0:85b3fd62ea1a 1384 /* - Disable Error Interrupt */
NYX 0:85b3fd62ea1a 1385 /* - Disable FIFO 0 message pending Interrupt */
NYX 0:85b3fd62ea1a 1386 /* - Disable FIFO 0 Overrun Interrupt */
NYX 0:85b3fd62ea1a 1387 /* - Disable FIFO 1 message pending Interrupt */
NYX 0:85b3fd62ea1a 1388 /* - Disable FIFO 1 Overrun Interrupt */
NYX 0:85b3fd62ea1a 1389 /* - Disable Transmit mailbox empty Interrupt */
NYX 0:85b3fd62ea1a 1390 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
NYX 0:85b3fd62ea1a 1391 CAN_IT_EPV |
NYX 0:85b3fd62ea1a 1392 CAN_IT_BOF |
NYX 0:85b3fd62ea1a 1393 CAN_IT_LEC |
NYX 0:85b3fd62ea1a 1394 CAN_IT_ERR |
NYX 0:85b3fd62ea1a 1395 CAN_IT_FMP0|
NYX 0:85b3fd62ea1a 1396 CAN_IT_FOV0|
NYX 0:85b3fd62ea1a 1397 CAN_IT_FMP1|
NYX 0:85b3fd62ea1a 1398 CAN_IT_FOV1|
NYX 0:85b3fd62ea1a 1399 CAN_IT_TME);
NYX 0:85b3fd62ea1a 1400
NYX 0:85b3fd62ea1a 1401 /* Call Error callback function */
NYX 0:85b3fd62ea1a 1402 HAL_CAN_ErrorCallback(hcan);
NYX 0:85b3fd62ea1a 1403 }
NYX 0:85b3fd62ea1a 1404 }
NYX 0:85b3fd62ea1a 1405
NYX 0:85b3fd62ea1a 1406 /**
NYX 0:85b3fd62ea1a 1407 * @brief Transmission complete callback in non blocking mode
NYX 0:85b3fd62ea1a 1408 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1409 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1410 * @retval None
NYX 0:85b3fd62ea1a 1411 */
NYX 0:85b3fd62ea1a 1412 __weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1413 {
NYX 0:85b3fd62ea1a 1414 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 1415 UNUSED(hcan);
NYX 0:85b3fd62ea1a 1416 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 1417 the HAL_CAN_TxCpltCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 1418 */
NYX 0:85b3fd62ea1a 1419 }
NYX 0:85b3fd62ea1a 1420
NYX 0:85b3fd62ea1a 1421 /**
NYX 0:85b3fd62ea1a 1422 * @brief Transmission complete callback in non blocking mode
NYX 0:85b3fd62ea1a 1423 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1424 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1425 * @retval None
NYX 0:85b3fd62ea1a 1426 */
NYX 0:85b3fd62ea1a 1427 __weak void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1428 {
NYX 0:85b3fd62ea1a 1429 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 1430 UNUSED(hcan);
NYX 0:85b3fd62ea1a 1431 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 1432 the HAL_CAN_RxCpltCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 1433 */
NYX 0:85b3fd62ea1a 1434 }
NYX 0:85b3fd62ea1a 1435
NYX 0:85b3fd62ea1a 1436 /**
NYX 0:85b3fd62ea1a 1437 * @brief Error CAN callback.
NYX 0:85b3fd62ea1a 1438 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1439 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1440 * @retval None
NYX 0:85b3fd62ea1a 1441 */
NYX 0:85b3fd62ea1a 1442 __weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
NYX 0:85b3fd62ea1a 1443 {
NYX 0:85b3fd62ea1a 1444 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 1445 UNUSED(hcan);
NYX 0:85b3fd62ea1a 1446 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 1447 the HAL_CAN_ErrorCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 1448 */
NYX 0:85b3fd62ea1a 1449 }
NYX 0:85b3fd62ea1a 1450
NYX 0:85b3fd62ea1a 1451 /**
NYX 0:85b3fd62ea1a 1452 * @}
NYX 0:85b3fd62ea1a 1453 */
NYX 0:85b3fd62ea1a 1454
NYX 0:85b3fd62ea1a 1455 /** @defgroup CAN_Exported_Functions_Group3 Peripheral State and Error functions
NYX 0:85b3fd62ea1a 1456 * @brief CAN Peripheral State functions
NYX 0:85b3fd62ea1a 1457 *
NYX 0:85b3fd62ea1a 1458 @verbatim
NYX 0:85b3fd62ea1a 1459 ==============================================================================
NYX 0:85b3fd62ea1a 1460 ##### Peripheral State and Error functions #####
NYX 0:85b3fd62ea1a 1461 ==============================================================================
NYX 0:85b3fd62ea1a 1462 [..]
NYX 0:85b3fd62ea1a 1463 This subsection provides functions allowing to :
NYX 0:85b3fd62ea1a 1464 (+) Check the CAN state.
NYX 0:85b3fd62ea1a 1465 (+) Check CAN Errors detected during interrupt process
NYX 0:85b3fd62ea1a 1466
NYX 0:85b3fd62ea1a 1467 @endverbatim
NYX 0:85b3fd62ea1a 1468 * @{
NYX 0:85b3fd62ea1a 1469 */
NYX 0:85b3fd62ea1a 1470
NYX 0:85b3fd62ea1a 1471 /**
NYX 0:85b3fd62ea1a 1472 * @brief return the CAN state
NYX 0:85b3fd62ea1a 1473 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1474 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1475 * @retval HAL state
NYX 0:85b3fd62ea1a 1476 */
NYX 0:85b3fd62ea1a 1477 HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1478 {
NYX 0:85b3fd62ea1a 1479 /* Return CAN state */
NYX 0:85b3fd62ea1a 1480 return hcan->State;
NYX 0:85b3fd62ea1a 1481 }
NYX 0:85b3fd62ea1a 1482
NYX 0:85b3fd62ea1a 1483 /**
NYX 0:85b3fd62ea1a 1484 * @brief Return the CAN error code
NYX 0:85b3fd62ea1a 1485 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1486 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1487 * @retval CAN Error Code
NYX 0:85b3fd62ea1a 1488 */
NYX 0:85b3fd62ea1a 1489 uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan)
NYX 0:85b3fd62ea1a 1490 {
NYX 0:85b3fd62ea1a 1491 return hcan->ErrorCode;
NYX 0:85b3fd62ea1a 1492 }
NYX 0:85b3fd62ea1a 1493
NYX 0:85b3fd62ea1a 1494 /**
NYX 0:85b3fd62ea1a 1495 * @}
NYX 0:85b3fd62ea1a 1496 */
NYX 0:85b3fd62ea1a 1497 /**
NYX 0:85b3fd62ea1a 1498 * @brief Initiates and transmits a CAN frame message.
NYX 0:85b3fd62ea1a 1499 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1500 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1501 * @retval HAL status
NYX 0:85b3fd62ea1a 1502 */
NYX 0:85b3fd62ea1a 1503 static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
NYX 0:85b3fd62ea1a 1504 {
NYX 0:85b3fd62ea1a 1505 /* Disable Transmit mailbox empty Interrupt */
NYX 0:85b3fd62ea1a 1506 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_TME);
NYX 0:85b3fd62ea1a 1507
NYX 0:85b3fd62ea1a 1508 if(hcan->State == HAL_CAN_STATE_BUSY_TX)
NYX 0:85b3fd62ea1a 1509 {
NYX 0:85b3fd62ea1a 1510 /* Disable Error warning, Error passive, Bus-off, Last error code
NYX 0:85b3fd62ea1a 1511 and Error Interrupts */
NYX 0:85b3fd62ea1a 1512 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
NYX 0:85b3fd62ea1a 1513 CAN_IT_EPV |
NYX 0:85b3fd62ea1a 1514 CAN_IT_BOF |
NYX 0:85b3fd62ea1a 1515 CAN_IT_LEC |
NYX 0:85b3fd62ea1a 1516 CAN_IT_ERR );
NYX 0:85b3fd62ea1a 1517 }
NYX 0:85b3fd62ea1a 1518
NYX 0:85b3fd62ea1a 1519 /* Change CAN state */
NYX 0:85b3fd62ea1a 1520 switch(hcan->State)
NYX 0:85b3fd62ea1a 1521 {
NYX 0:85b3fd62ea1a 1522 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 1523 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 1524 break;
NYX 0:85b3fd62ea1a 1525 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 1526 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 1527 break;
NYX 0:85b3fd62ea1a 1528 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 1529 hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
NYX 0:85b3fd62ea1a 1530 break;
NYX 0:85b3fd62ea1a 1531 default: /* HAL_CAN_STATE_BUSY_TX */
NYX 0:85b3fd62ea1a 1532 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1533 break;
NYX 0:85b3fd62ea1a 1534 }
NYX 0:85b3fd62ea1a 1535
NYX 0:85b3fd62ea1a 1536 /* Transmission complete callback */
NYX 0:85b3fd62ea1a 1537 HAL_CAN_TxCpltCallback(hcan);
NYX 0:85b3fd62ea1a 1538
NYX 0:85b3fd62ea1a 1539 return HAL_OK;
NYX 0:85b3fd62ea1a 1540 }
NYX 0:85b3fd62ea1a 1541
NYX 0:85b3fd62ea1a 1542 /**
NYX 0:85b3fd62ea1a 1543 * @brief Receives a correct CAN frame.
NYX 0:85b3fd62ea1a 1544 * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains
NYX 0:85b3fd62ea1a 1545 * the configuration information for the specified CAN.
NYX 0:85b3fd62ea1a 1546 * @param FIFONumber: Specify the FIFO number
NYX 0:85b3fd62ea1a 1547 * @retval HAL status
NYX 0:85b3fd62ea1a 1548 * @retval None
NYX 0:85b3fd62ea1a 1549 */
NYX 0:85b3fd62ea1a 1550 static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
NYX 0:85b3fd62ea1a 1551 {
NYX 0:85b3fd62ea1a 1552 uint32_t tmp1 = 0U;
NYX 0:85b3fd62ea1a 1553 CanRxMsgTypeDef* pRxMsg = NULL;
NYX 0:85b3fd62ea1a 1554
NYX 0:85b3fd62ea1a 1555 /* Set RxMsg pointer */
NYX 0:85b3fd62ea1a 1556 if(FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 1557 {
NYX 0:85b3fd62ea1a 1558 pRxMsg = hcan->pRxMsg;
NYX 0:85b3fd62ea1a 1559 }
NYX 0:85b3fd62ea1a 1560 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 1561 {
NYX 0:85b3fd62ea1a 1562 pRxMsg = hcan->pRx1Msg;
NYX 0:85b3fd62ea1a 1563 }
NYX 0:85b3fd62ea1a 1564
NYX 0:85b3fd62ea1a 1565 /* Get the Id */
NYX 0:85b3fd62ea1a 1566 pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
NYX 0:85b3fd62ea1a 1567 if (pRxMsg->IDE == CAN_ID_STD)
NYX 0:85b3fd62ea1a 1568 {
NYX 0:85b3fd62ea1a 1569 pRxMsg->StdId = 0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U);
NYX 0:85b3fd62ea1a 1570 }
NYX 0:85b3fd62ea1a 1571 else
NYX 0:85b3fd62ea1a 1572 {
NYX 0:85b3fd62ea1a 1573 pRxMsg->ExtId = 0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U);
NYX 0:85b3fd62ea1a 1574 }
NYX 0:85b3fd62ea1a 1575
NYX 0:85b3fd62ea1a 1576 pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
NYX 0:85b3fd62ea1a 1577 /* Get the DLC */
NYX 0:85b3fd62ea1a 1578 pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
NYX 0:85b3fd62ea1a 1579 /* Get the FIFONumber */
NYX 0:85b3fd62ea1a 1580 pRxMsg->FIFONumber = FIFONumber;
NYX 0:85b3fd62ea1a 1581 /* Get the FMI */
NYX 0:85b3fd62ea1a 1582 pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U);
NYX 0:85b3fd62ea1a 1583 /* Get the data field */
NYX 0:85b3fd62ea1a 1584 pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
NYX 0:85b3fd62ea1a 1585 pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U);
NYX 0:85b3fd62ea1a 1586 pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U);
NYX 0:85b3fd62ea1a 1587 pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U);
NYX 0:85b3fd62ea1a 1588 pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
NYX 0:85b3fd62ea1a 1589 pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U);
NYX 0:85b3fd62ea1a 1590 pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U);
NYX 0:85b3fd62ea1a 1591 pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U);
NYX 0:85b3fd62ea1a 1592 /* Release the FIFO */
NYX 0:85b3fd62ea1a 1593 /* Release FIFO0 */
NYX 0:85b3fd62ea1a 1594 if (FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 1595 {
NYX 0:85b3fd62ea1a 1596 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0);
NYX 0:85b3fd62ea1a 1597
NYX 0:85b3fd62ea1a 1598 /* Disable FIFO 0 overrun and message pending Interrupt */
NYX 0:85b3fd62ea1a 1599 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0);
NYX 0:85b3fd62ea1a 1600 }
NYX 0:85b3fd62ea1a 1601 /* Release FIFO1 */
NYX 0:85b3fd62ea1a 1602 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 1603 {
NYX 0:85b3fd62ea1a 1604 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1);
NYX 0:85b3fd62ea1a 1605
NYX 0:85b3fd62ea1a 1606 /* Disable FIFO 1 overrun and message pending Interrupt */
NYX 0:85b3fd62ea1a 1607 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1);
NYX 0:85b3fd62ea1a 1608 }
NYX 0:85b3fd62ea1a 1609
NYX 0:85b3fd62ea1a 1610 tmp1 = hcan->State;
NYX 0:85b3fd62ea1a 1611 if((tmp1 == HAL_CAN_STATE_BUSY_RX0) || (tmp1 == HAL_CAN_STATE_BUSY_RX1))
NYX 0:85b3fd62ea1a 1612 {
NYX 0:85b3fd62ea1a 1613 /* Disable Error warning, Error passive, Bus-off, Last error code
NYX 0:85b3fd62ea1a 1614 and Error Interrupts */
NYX 0:85b3fd62ea1a 1615 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
NYX 0:85b3fd62ea1a 1616 CAN_IT_EPV |
NYX 0:85b3fd62ea1a 1617 CAN_IT_BOF |
NYX 0:85b3fd62ea1a 1618 CAN_IT_LEC |
NYX 0:85b3fd62ea1a 1619 CAN_IT_ERR);
NYX 0:85b3fd62ea1a 1620 }
NYX 0:85b3fd62ea1a 1621
NYX 0:85b3fd62ea1a 1622 /* Change CAN state */
NYX 0:85b3fd62ea1a 1623 if (FIFONumber == CAN_FIFO0)
NYX 0:85b3fd62ea1a 1624 {
NYX 0:85b3fd62ea1a 1625 switch(hcan->State)
NYX 0:85b3fd62ea1a 1626 {
NYX 0:85b3fd62ea1a 1627 case(HAL_CAN_STATE_BUSY_TX_RX0):
NYX 0:85b3fd62ea1a 1628 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 1629 break;
NYX 0:85b3fd62ea1a 1630 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 1631 hcan->State = HAL_CAN_STATE_BUSY_RX1;
NYX 0:85b3fd62ea1a 1632 break;
NYX 0:85b3fd62ea1a 1633 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 1634 hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
NYX 0:85b3fd62ea1a 1635 break;
NYX 0:85b3fd62ea1a 1636 default: /* HAL_CAN_STATE_BUSY_RX0 */
NYX 0:85b3fd62ea1a 1637 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1638 break;
NYX 0:85b3fd62ea1a 1639 }
NYX 0:85b3fd62ea1a 1640 }
NYX 0:85b3fd62ea1a 1641 else /* FIFONumber == CAN_FIFO1 */
NYX 0:85b3fd62ea1a 1642 {
NYX 0:85b3fd62ea1a 1643 switch(hcan->State)
NYX 0:85b3fd62ea1a 1644 {
NYX 0:85b3fd62ea1a 1645 case(HAL_CAN_STATE_BUSY_TX_RX1):
NYX 0:85b3fd62ea1a 1646 hcan->State = HAL_CAN_STATE_BUSY_TX;
NYX 0:85b3fd62ea1a 1647 break;
NYX 0:85b3fd62ea1a 1648 case(HAL_CAN_STATE_BUSY_RX0_RX1):
NYX 0:85b3fd62ea1a 1649 hcan->State = HAL_CAN_STATE_BUSY_RX0;
NYX 0:85b3fd62ea1a 1650 break;
NYX 0:85b3fd62ea1a 1651 case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
NYX 0:85b3fd62ea1a 1652 hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
NYX 0:85b3fd62ea1a 1653 break;
NYX 0:85b3fd62ea1a 1654 default: /* HAL_CAN_STATE_BUSY_RX1 */
NYX 0:85b3fd62ea1a 1655 hcan->State = HAL_CAN_STATE_READY;
NYX 0:85b3fd62ea1a 1656 break;
NYX 0:85b3fd62ea1a 1657 }
NYX 0:85b3fd62ea1a 1658 }
NYX 0:85b3fd62ea1a 1659
NYX 0:85b3fd62ea1a 1660 /* Receive complete callback */
NYX 0:85b3fd62ea1a 1661 HAL_CAN_RxCpltCallback(hcan);
NYX 0:85b3fd62ea1a 1662
NYX 0:85b3fd62ea1a 1663 /* Return function status */
NYX 0:85b3fd62ea1a 1664 return HAL_OK;
NYX 0:85b3fd62ea1a 1665 }
NYX 0:85b3fd62ea1a 1666
NYX 0:85b3fd62ea1a 1667 /**
NYX 0:85b3fd62ea1a 1668 * @}
NYX 0:85b3fd62ea1a 1669 */
NYX 0:85b3fd62ea1a 1670 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
NYX 0:85b3fd62ea1a 1671 STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\
NYX 0:85b3fd62ea1a 1672 STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 1673
NYX 0:85b3fd62ea1a 1674 #endif /* HAL_CAN_MODULE_ENABLED */
NYX 0:85b3fd62ea1a 1675 /**
NYX 0:85b3fd62ea1a 1676 * @}
NYX 0:85b3fd62ea1a 1677 */
NYX 0:85b3fd62ea1a 1678
NYX 0:85b3fd62ea1a 1679 /**
NYX 0:85b3fd62ea1a 1680 * @}
NYX 0:85b3fd62ea1a 1681 */
NYX 0:85b3fd62ea1a 1682
NYX 0:85b3fd62ea1a 1683 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/