mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed Jun 11 09:45:09 2014 +0100
Revision:
226:b062af740e40
Parent:
106:ced8cbb51063
Synchronized with git revision 42deb9ac55f9bdf9835e9c41dc757117d344ffda

Full URL: https://github.com/mbedmicro/mbed/commit/42deb9ac55f9bdf9835e9c41dc757117d344ffda/

[NUCLEO_F401RE] Remove call to Systick + bug fixes

Who changed what in which revision?

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