Aditya Mehrotra / mbed-dev

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Committer:
saloutos
Date:
Thu Nov 26 04:08:56 2020 +0000
Revision:
0:083111ae2a11
first commit of leaned mbed dev lib

Who changed what in which revision?

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