mbed library sources

Dependents:   bare

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

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 87:085cde657901 5 * @version V1.0.0RC2
mbed_official 87:085cde657901 6 * @date 04-February-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 87:085cde657901 462
mbed_official 87:085cde657901 463 /* Return function status */
mbed_official 87:085cde657901 464 return HAL_OK;
mbed_official 87:085cde657901 465 }
mbed_official 87:085cde657901 466
mbed_official 87:085cde657901 467 /**
mbed_official 87:085cde657901 468 * @brief Initializes the CAN MSP.
mbed_official 87:085cde657901 469 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 470 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 471 * @retval None
mbed_official 87:085cde657901 472 */
mbed_official 87:085cde657901 473 __weak void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 474 {
mbed_official 87:085cde657901 475 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 476 the HAL_CAN_MspInit could be implemented in the user file
mbed_official 87:085cde657901 477 */
mbed_official 87:085cde657901 478 }
mbed_official 87:085cde657901 479
mbed_official 87:085cde657901 480 /**
mbed_official 87:085cde657901 481 * @brief DeInitializes the CAN MSP.
mbed_official 87:085cde657901 482 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 483 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 484 * @retval None
mbed_official 87:085cde657901 485 */
mbed_official 87:085cde657901 486 __weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 487 {
mbed_official 87:085cde657901 488 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 489 the HAL_CAN_MspDeInit could be implemented in the user file
mbed_official 87:085cde657901 490 */
mbed_official 87:085cde657901 491 }
mbed_official 87:085cde657901 492
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 /** @defgroup CAN_Group2 IO operation functions
mbed_official 87:085cde657901 498 * @brief IO operation functions
mbed_official 87:085cde657901 499 *
mbed_official 87:085cde657901 500 @verbatim
mbed_official 87:085cde657901 501 ==============================================================================
mbed_official 87:085cde657901 502 ##### IO operation functions #####
mbed_official 87:085cde657901 503 ==============================================================================
mbed_official 87:085cde657901 504 [..] This section provides functions allowing to:
mbed_official 87:085cde657901 505 (+) Transmit a CAN frame message.
mbed_official 87:085cde657901 506 (+) Receive a CAN frame message.
mbed_official 87:085cde657901 507 (+) Enter CAN peripheral in sleep mode.
mbed_official 87:085cde657901 508 (+) Wake up the CAN peripheral from sleep mode.
mbed_official 87:085cde657901 509
mbed_official 87:085cde657901 510 @endverbatim
mbed_official 87:085cde657901 511 * @{
mbed_official 87:085cde657901 512 */
mbed_official 87:085cde657901 513
mbed_official 87:085cde657901 514 /**
mbed_official 87:085cde657901 515 * @brief Initiates and transmits a CAN frame message.
mbed_official 87:085cde657901 516 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 517 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 518 * @param Timeout: Specify Timeout value
mbed_official 87:085cde657901 519 * @retval HAL status
mbed_official 87:085cde657901 520 */
mbed_official 87:085cde657901 521 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)
mbed_official 87:085cde657901 522 {
mbed_official 87:085cde657901 523 uint32_t transmitmailbox = 5;
mbed_official 87:085cde657901 524
mbed_official 87:085cde657901 525 uint32_t timeout;
mbed_official 87:085cde657901 526
mbed_official 87:085cde657901 527 /* Check the parameters */
mbed_official 87:085cde657901 528 assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
mbed_official 87:085cde657901 529 assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
mbed_official 87:085cde657901 530 assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
mbed_official 87:085cde657901 531
mbed_official 87:085cde657901 532 /* Process locked */
mbed_official 87:085cde657901 533 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 534
mbed_official 87:085cde657901 535 if(hcan->State == HAL_CAN_STATE_BUSY_RX)
mbed_official 87:085cde657901 536 {
mbed_official 87:085cde657901 537 /* Change CAN state */
mbed_official 87:085cde657901 538 hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 539 }
mbed_official 87:085cde657901 540 else
mbed_official 87:085cde657901 541 {
mbed_official 87:085cde657901 542 /* Change CAN state */
mbed_official 87:085cde657901 543 hcan->State = HAL_CAN_STATE_BUSY_TX;
mbed_official 87:085cde657901 544 }
mbed_official 87:085cde657901 545
mbed_official 87:085cde657901 546 /* Select one empty transmit mailbox */
mbed_official 87:085cde657901 547 if ((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
mbed_official 87:085cde657901 548 {
mbed_official 87:085cde657901 549 transmitmailbox = 0;
mbed_official 87:085cde657901 550 }
mbed_official 87:085cde657901 551 else if ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
mbed_official 87:085cde657901 552 {
mbed_official 87:085cde657901 553 transmitmailbox = 1;
mbed_official 87:085cde657901 554 }
mbed_official 87:085cde657901 555 else if ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
mbed_official 87:085cde657901 556 {
mbed_official 87:085cde657901 557 transmitmailbox = 2;
mbed_official 87:085cde657901 558 }
mbed_official 87:085cde657901 559 else
mbed_official 87:085cde657901 560 {
mbed_official 87:085cde657901 561 transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
mbed_official 87:085cde657901 562 }
mbed_official 87:085cde657901 563
mbed_official 87:085cde657901 564 if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX)
mbed_official 87:085cde657901 565 {
mbed_official 87:085cde657901 566 /* Set up the Id */
mbed_official 87:085cde657901 567 hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
mbed_official 87:085cde657901 568 if (hcan->pTxMsg->IDE == CAN_ID_STD)
mbed_official 87:085cde657901 569 {
mbed_official 87:085cde657901 570 assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
mbed_official 87:085cde657901 571 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21) | \
mbed_official 87:085cde657901 572 hcan->pTxMsg->RTR);
mbed_official 87:085cde657901 573 }
mbed_official 87:085cde657901 574 else
mbed_official 87:085cde657901 575 {
mbed_official 87:085cde657901 576 assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
mbed_official 87:085cde657901 577 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3) | \
mbed_official 87:085cde657901 578 hcan->pTxMsg->IDE | \
mbed_official 87:085cde657901 579 hcan->pTxMsg->RTR);
mbed_official 87:085cde657901 580 }
mbed_official 87:085cde657901 581
mbed_official 87:085cde657901 582 /* Set up the DLC */
mbed_official 87:085cde657901 583 hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
mbed_official 87:085cde657901 584 hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0;
mbed_official 87:085cde657901 585 hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
mbed_official 87:085cde657901 586
mbed_official 87:085cde657901 587 /* Set up the data field */
mbed_official 87:085cde657901 588 hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3] << 24) |
mbed_official 87:085cde657901 589 ((uint32_t)hcan->pTxMsg->Data[2] << 16) |
mbed_official 87:085cde657901 590 ((uint32_t)hcan->pTxMsg->Data[1] << 8) |
mbed_official 87:085cde657901 591 ((uint32_t)hcan->pTxMsg->Data[0]));
mbed_official 87:085cde657901 592 hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7] << 24) |
mbed_official 87:085cde657901 593 ((uint32_t)hcan->pTxMsg->Data[6] << 16) |
mbed_official 87:085cde657901 594 ((uint32_t)hcan->pTxMsg->Data[5] << 8) |
mbed_official 87:085cde657901 595 ((uint32_t)hcan->pTxMsg->Data[4]));
mbed_official 87:085cde657901 596 /* Request transmission */
mbed_official 87:085cde657901 597 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
mbed_official 87:085cde657901 598
mbed_official 87:085cde657901 599 /* Get timeout */
mbed_official 87:085cde657901 600 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 601
mbed_official 87:085cde657901 602 /* Check End of transmission flag */
mbed_official 87:085cde657901 603 while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
mbed_official 87:085cde657901 604 {
mbed_official 87:085cde657901 605 /* Check for the Timeout */
mbed_official 87:085cde657901 606 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 607 {
mbed_official 87:085cde657901 608 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 609 {
mbed_official 87:085cde657901 610 hcan->State = HAL_CAN_STATE_TIMEOUT;
mbed_official 87:085cde657901 611 /* Process unlocked */
mbed_official 87:085cde657901 612 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 613 return HAL_TIMEOUT;
mbed_official 87:085cde657901 614 }
mbed_official 87:085cde657901 615 }
mbed_official 87:085cde657901 616 }
mbed_official 87:085cde657901 617 if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 618 {
mbed_official 87:085cde657901 619 /* Change CAN state */
mbed_official 87:085cde657901 620 hcan->State = HAL_CAN_STATE_BUSY_RX;
mbed_official 87:085cde657901 621
mbed_official 87:085cde657901 622 /* Process unlocked */
mbed_official 87:085cde657901 623 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 624 }
mbed_official 87:085cde657901 625 else
mbed_official 87:085cde657901 626 {
mbed_official 87:085cde657901 627 /* Change CAN state */
mbed_official 87:085cde657901 628 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 629
mbed_official 87:085cde657901 630 /* Process unlocked */
mbed_official 87:085cde657901 631 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 632 }
mbed_official 87:085cde657901 633
mbed_official 87:085cde657901 634 /* Return function status */
mbed_official 87:085cde657901 635 return HAL_OK;
mbed_official 87:085cde657901 636 }
mbed_official 87:085cde657901 637 else
mbed_official 87:085cde657901 638 {
mbed_official 87:085cde657901 639 /* Change CAN state */
mbed_official 87:085cde657901 640 hcan->State = HAL_CAN_STATE_ERROR;
mbed_official 87:085cde657901 641
mbed_official 87:085cde657901 642 /* Return function status */
mbed_official 87:085cde657901 643 return HAL_ERROR;
mbed_official 87:085cde657901 644 }
mbed_official 87:085cde657901 645 }
mbed_official 87:085cde657901 646
mbed_official 87:085cde657901 647 /**
mbed_official 87:085cde657901 648 * @brief Initiates and transmits a CAN frame message.
mbed_official 87:085cde657901 649 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 650 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 651 * @retval HAL status
mbed_official 87:085cde657901 652 */
mbed_official 87:085cde657901 653 HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 654 {
mbed_official 87:085cde657901 655 uint32_t transmitmailbox = 5;
mbed_official 87:085cde657901 656 uint32_t tmp = 0;
mbed_official 87:085cde657901 657
mbed_official 87:085cde657901 658 /* Check the parameters */
mbed_official 87:085cde657901 659 assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
mbed_official 87:085cde657901 660 assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
mbed_official 87:085cde657901 661 assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
mbed_official 87:085cde657901 662
mbed_official 87:085cde657901 663 tmp = hcan->State;
mbed_official 87:085cde657901 664 if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_RX))
mbed_official 87:085cde657901 665 {
mbed_official 87:085cde657901 666 /* Process Locked */
mbed_official 87:085cde657901 667 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 668
mbed_official 87:085cde657901 669 /* Select one empty transmit mailbox */
mbed_official 87:085cde657901 670 if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
mbed_official 87:085cde657901 671 {
mbed_official 87:085cde657901 672 transmitmailbox = 0;
mbed_official 87:085cde657901 673 }
mbed_official 87:085cde657901 674 else if((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
mbed_official 87:085cde657901 675 {
mbed_official 87:085cde657901 676 transmitmailbox = 1;
mbed_official 87:085cde657901 677 }
mbed_official 87:085cde657901 678 else if((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
mbed_official 87:085cde657901 679 {
mbed_official 87:085cde657901 680 transmitmailbox = 2;
mbed_official 87:085cde657901 681 }
mbed_official 87:085cde657901 682 else
mbed_official 87:085cde657901 683 {
mbed_official 87:085cde657901 684 transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
mbed_official 87:085cde657901 685 }
mbed_official 87:085cde657901 686
mbed_official 87:085cde657901 687 if(transmitmailbox != CAN_TXSTATUS_NOMAILBOX)
mbed_official 87:085cde657901 688 {
mbed_official 87:085cde657901 689 /* Set up the Id */
mbed_official 87:085cde657901 690 hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
mbed_official 87:085cde657901 691 if(hcan->pTxMsg->IDE == CAN_ID_STD)
mbed_official 87:085cde657901 692 {
mbed_official 87:085cde657901 693 assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
mbed_official 87:085cde657901 694 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21) | \
mbed_official 87:085cde657901 695 hcan->pTxMsg->RTR);
mbed_official 87:085cde657901 696 }
mbed_official 87:085cde657901 697 else
mbed_official 87:085cde657901 698 {
mbed_official 87:085cde657901 699 assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
mbed_official 87:085cde657901 700 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3) | \
mbed_official 87:085cde657901 701 hcan->pTxMsg->IDE | \
mbed_official 87:085cde657901 702 hcan->pTxMsg->RTR);
mbed_official 87:085cde657901 703 }
mbed_official 87:085cde657901 704
mbed_official 87:085cde657901 705 /* Set up the DLC */
mbed_official 87:085cde657901 706 hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
mbed_official 87:085cde657901 707 hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0;
mbed_official 87:085cde657901 708 hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
mbed_official 87:085cde657901 709
mbed_official 87:085cde657901 710 /* Set up the data field */
mbed_official 87:085cde657901 711 hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3] << 24) |
mbed_official 87:085cde657901 712 ((uint32_t)hcan->pTxMsg->Data[2] << 16) |
mbed_official 87:085cde657901 713 ((uint32_t)hcan->pTxMsg->Data[1] << 8) |
mbed_official 87:085cde657901 714 ((uint32_t)hcan->pTxMsg->Data[0]));
mbed_official 87:085cde657901 715 hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7] << 24) |
mbed_official 87:085cde657901 716 ((uint32_t)hcan->pTxMsg->Data[6] << 16) |
mbed_official 87:085cde657901 717 ((uint32_t)hcan->pTxMsg->Data[5] << 8) |
mbed_official 87:085cde657901 718 ((uint32_t)hcan->pTxMsg->Data[4]));
mbed_official 87:085cde657901 719
mbed_official 87:085cde657901 720 if(hcan->State == HAL_CAN_STATE_BUSY_RX)
mbed_official 87:085cde657901 721 {
mbed_official 87:085cde657901 722 /* Change CAN state */
mbed_official 87:085cde657901 723 hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 724 }
mbed_official 87:085cde657901 725 else
mbed_official 87:085cde657901 726 {
mbed_official 87:085cde657901 727 /* Change CAN state */
mbed_official 87:085cde657901 728 hcan->State = HAL_CAN_STATE_BUSY_TX;
mbed_official 87:085cde657901 729 }
mbed_official 87:085cde657901 730
mbed_official 87:085cde657901 731 /* Set CAN error code to none */
mbed_official 87:085cde657901 732 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
mbed_official 87:085cde657901 733
mbed_official 87:085cde657901 734 /* Process Unlocked */
mbed_official 87:085cde657901 735 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 736
mbed_official 87:085cde657901 737 /* Enable Error warning Interrupt */
mbed_official 87:085cde657901 738 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG);
mbed_official 87:085cde657901 739
mbed_official 87:085cde657901 740 /* Enable Error passive Interrupt */
mbed_official 87:085cde657901 741 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EPV);
mbed_official 87:085cde657901 742
mbed_official 87:085cde657901 743 /* Enable Bus-off Interrupt */
mbed_official 87:085cde657901 744 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_BOF);
mbed_official 87:085cde657901 745
mbed_official 87:085cde657901 746 /* Enable Last error code Interrupt */
mbed_official 87:085cde657901 747 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_LEC);
mbed_official 87:085cde657901 748
mbed_official 87:085cde657901 749 /* Enable Error Interrupt */
mbed_official 87:085cde657901 750 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 751
mbed_official 87:085cde657901 752 /* Enable Transmit mailbox empty Interrupt */
mbed_official 87:085cde657901 753 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_TME);
mbed_official 87:085cde657901 754
mbed_official 87:085cde657901 755 /* Request transmission */
mbed_official 87:085cde657901 756 hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
mbed_official 87:085cde657901 757 }
mbed_official 87:085cde657901 758 }
mbed_official 87:085cde657901 759 else
mbed_official 87:085cde657901 760 {
mbed_official 87:085cde657901 761 return HAL_BUSY;
mbed_official 87:085cde657901 762 }
mbed_official 87:085cde657901 763
mbed_official 87:085cde657901 764 return HAL_OK;
mbed_official 87:085cde657901 765 }
mbed_official 87:085cde657901 766
mbed_official 87:085cde657901 767 /**
mbed_official 87:085cde657901 768 * @brief Receives a correct CAN frame.
mbed_official 87:085cde657901 769 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 770 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 771 * @param FIFONumber: FIFO Number value
mbed_official 87:085cde657901 772 * @param Timeout: Specify Timeout value
mbed_official 87:085cde657901 773 * @retval HAL status
mbed_official 87:085cde657901 774 * @retval None
mbed_official 87:085cde657901 775 */
mbed_official 87:085cde657901 776 HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, uint32_t Timeout)
mbed_official 87:085cde657901 777 {
mbed_official 87:085cde657901 778 uint32_t timeout;
mbed_official 87:085cde657901 779
mbed_official 87:085cde657901 780 /* Check the parameters */
mbed_official 87:085cde657901 781 assert_param(IS_CAN_FIFO(FIFONumber));
mbed_official 87:085cde657901 782
mbed_official 87:085cde657901 783 /* Process locked */
mbed_official 87:085cde657901 784 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 785
mbed_official 87:085cde657901 786 if(hcan->State == HAL_CAN_STATE_BUSY_TX)
mbed_official 87:085cde657901 787 {
mbed_official 87:085cde657901 788 /* Change CAN state */
mbed_official 87:085cde657901 789 hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 790 }
mbed_official 87:085cde657901 791 else
mbed_official 87:085cde657901 792 {
mbed_official 87:085cde657901 793 /* Change CAN state */
mbed_official 87:085cde657901 794 hcan->State = HAL_CAN_STATE_BUSY_RX;
mbed_official 87:085cde657901 795 }
mbed_official 87:085cde657901 796
mbed_official 87:085cde657901 797 /* Get timeout */
mbed_official 87:085cde657901 798 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 799
mbed_official 87:085cde657901 800 /* Check pending message */
mbed_official 87:085cde657901 801 while(__HAL_CAN_MSG_PENDING(hcan, FIFONumber) == 0)
mbed_official 87:085cde657901 802 {
mbed_official 87:085cde657901 803 /* Check for the Timeout */
mbed_official 87:085cde657901 804 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 805 {
mbed_official 87:085cde657901 806 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 807 {
mbed_official 87:085cde657901 808 hcan->State = HAL_CAN_STATE_TIMEOUT;
mbed_official 87:085cde657901 809 /* Process unlocked */
mbed_official 87:085cde657901 810 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 811 return HAL_TIMEOUT;
mbed_official 87:085cde657901 812 }
mbed_official 87:085cde657901 813 }
mbed_official 87:085cde657901 814 }
mbed_official 87:085cde657901 815
mbed_official 87:085cde657901 816 /* Get the Id */
mbed_official 87:085cde657901 817 hcan->pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
mbed_official 87:085cde657901 818 if (hcan->pRxMsg->IDE == CAN_ID_STD)
mbed_official 87:085cde657901 819 {
mbed_official 87:085cde657901 820 hcan->pRxMsg->StdId = (uint32_t)0x000007FF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21);
mbed_official 87:085cde657901 821 }
mbed_official 87:085cde657901 822 else
mbed_official 87:085cde657901 823 {
mbed_official 87:085cde657901 824 hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3);
mbed_official 87:085cde657901 825 }
mbed_official 87:085cde657901 826
mbed_official 87:085cde657901 827 hcan->pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
mbed_official 87:085cde657901 828 /* Get the DLC */
mbed_official 87:085cde657901 829 hcan->pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
mbed_official 87:085cde657901 830 /* Get the FMI */
mbed_official 87:085cde657901 831 hcan->pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8);
mbed_official 87:085cde657901 832 /* Get the data field */
mbed_official 87:085cde657901 833 hcan->pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
mbed_official 87:085cde657901 834 hcan->pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8);
mbed_official 87:085cde657901 835 hcan->pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16);
mbed_official 87:085cde657901 836 hcan->pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24);
mbed_official 87:085cde657901 837 hcan->pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
mbed_official 87:085cde657901 838 hcan->pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8);
mbed_official 87:085cde657901 839 hcan->pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16);
mbed_official 87:085cde657901 840 hcan->pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24);
mbed_official 87:085cde657901 841
mbed_official 87:085cde657901 842 /* Release the FIFO */
mbed_official 87:085cde657901 843 if(FIFONumber == CAN_FIFO0)
mbed_official 87:085cde657901 844 {
mbed_official 87:085cde657901 845 /* Release FIFO0 */
mbed_official 87:085cde657901 846 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0);
mbed_official 87:085cde657901 847 }
mbed_official 87:085cde657901 848 else /* FIFONumber == CAN_FIFO1 */
mbed_official 87:085cde657901 849 {
mbed_official 87:085cde657901 850 /* Release FIFO1 */
mbed_official 87:085cde657901 851 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1);
mbed_official 87:085cde657901 852 }
mbed_official 87:085cde657901 853
mbed_official 87:085cde657901 854 if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 855 {
mbed_official 87:085cde657901 856 /* Change CAN state */
mbed_official 87:085cde657901 857 hcan->State = HAL_CAN_STATE_BUSY_TX;
mbed_official 87:085cde657901 858
mbed_official 87:085cde657901 859 /* Process unlocked */
mbed_official 87:085cde657901 860 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 861 }
mbed_official 87:085cde657901 862 else
mbed_official 87:085cde657901 863 {
mbed_official 87:085cde657901 864 /* Change CAN state */
mbed_official 87:085cde657901 865 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 866
mbed_official 87:085cde657901 867 /* Process unlocked */
mbed_official 87:085cde657901 868 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 869 }
mbed_official 87:085cde657901 870
mbed_official 87:085cde657901 871 /* Return function status */
mbed_official 87:085cde657901 872 return HAL_OK;
mbed_official 87:085cde657901 873 }
mbed_official 87:085cde657901 874
mbed_official 87:085cde657901 875 /**
mbed_official 87:085cde657901 876 * @brief Receives a correct CAN frame.
mbed_official 87:085cde657901 877 * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 878 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 879 * @param FIFONumber: Specify the FIFO number
mbed_official 87:085cde657901 880 * @retval HAL status
mbed_official 87:085cde657901 881 * @retval None
mbed_official 87:085cde657901 882 */
mbed_official 87:085cde657901 883 HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
mbed_official 87:085cde657901 884 {
mbed_official 87:085cde657901 885 uint32_t tmp = 0;
mbed_official 87:085cde657901 886
mbed_official 87:085cde657901 887 /* Check the parameters */
mbed_official 87:085cde657901 888 assert_param(IS_CAN_FIFO(FIFONumber));
mbed_official 87:085cde657901 889
mbed_official 87:085cde657901 890 tmp = hcan->State;
mbed_official 87:085cde657901 891 if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_TX))
mbed_official 87:085cde657901 892 {
mbed_official 87:085cde657901 893 /* Process locked */
mbed_official 87:085cde657901 894 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 895
mbed_official 87:085cde657901 896 if(hcan->State == HAL_CAN_STATE_BUSY_TX)
mbed_official 87:085cde657901 897 {
mbed_official 87:085cde657901 898 /* Change CAN state */
mbed_official 87:085cde657901 899 hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 900 }
mbed_official 87:085cde657901 901 else
mbed_official 87:085cde657901 902 {
mbed_official 87:085cde657901 903 /* Change CAN state */
mbed_official 87:085cde657901 904 hcan->State = HAL_CAN_STATE_BUSY_RX;
mbed_official 87:085cde657901 905 }
mbed_official 87:085cde657901 906
mbed_official 87:085cde657901 907 /* Set CAN error code to none */
mbed_official 87:085cde657901 908 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
mbed_official 87:085cde657901 909
mbed_official 87:085cde657901 910 /* Enable Error warning Interrupt */
mbed_official 87:085cde657901 911 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG);
mbed_official 87:085cde657901 912
mbed_official 87:085cde657901 913 /* Enable Error passive Interrupt */
mbed_official 87:085cde657901 914 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EPV);
mbed_official 87:085cde657901 915
mbed_official 87:085cde657901 916 /* Enable Bus-off Interrupt */
mbed_official 87:085cde657901 917 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_BOF);
mbed_official 87:085cde657901 918
mbed_official 87:085cde657901 919 /* Enable Last error code Interrupt */
mbed_official 87:085cde657901 920 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_LEC);
mbed_official 87:085cde657901 921
mbed_official 87:085cde657901 922 /* Enable Error Interrupt */
mbed_official 87:085cde657901 923 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 924
mbed_official 87:085cde657901 925 /* Process unlocked */
mbed_official 87:085cde657901 926 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 927
mbed_official 87:085cde657901 928 if(FIFONumber == CAN_FIFO0)
mbed_official 87:085cde657901 929 {
mbed_official 87:085cde657901 930 /* Enable FIFO 0 message pending Interrupt */
mbed_official 87:085cde657901 931 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0);
mbed_official 87:085cde657901 932 }
mbed_official 87:085cde657901 933 else
mbed_official 87:085cde657901 934 {
mbed_official 87:085cde657901 935 /* Enable FIFO 1 message pending Interrupt */
mbed_official 87:085cde657901 936 __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP1);
mbed_official 87:085cde657901 937 }
mbed_official 87:085cde657901 938
mbed_official 87:085cde657901 939 }
mbed_official 87:085cde657901 940 else
mbed_official 87:085cde657901 941 {
mbed_official 87:085cde657901 942 return HAL_BUSY;
mbed_official 87:085cde657901 943 }
mbed_official 87:085cde657901 944
mbed_official 87:085cde657901 945 /* Return function status */
mbed_official 87:085cde657901 946 return HAL_OK;
mbed_official 87:085cde657901 947 }
mbed_official 87:085cde657901 948
mbed_official 87:085cde657901 949 /**
mbed_official 87:085cde657901 950 * @brief Enters the Sleep (low power) mode.
mbed_official 87:085cde657901 951 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 952 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 953 * @retval HAL status.
mbed_official 87:085cde657901 954 */
mbed_official 87:085cde657901 955 HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 956 {
mbed_official 87:085cde657901 957 uint32_t timeout;
mbed_official 87:085cde657901 958
mbed_official 87:085cde657901 959 /* Process locked */
mbed_official 87:085cde657901 960 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 961
mbed_official 87:085cde657901 962 /* Change CAN state */
mbed_official 87:085cde657901 963 hcan->State = HAL_CAN_STATE_BUSY;
mbed_official 87:085cde657901 964
mbed_official 87:085cde657901 965 /* Request Sleep mode */
mbed_official 87:085cde657901 966 hcan->Instance->MCR = (((hcan->Instance->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP);
mbed_official 87:085cde657901 967
mbed_official 87:085cde657901 968 /* Sleep mode status */
mbed_official 87:085cde657901 969 if ((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK)
mbed_official 87:085cde657901 970 {
mbed_official 87:085cde657901 971 /* Return function status */
mbed_official 87:085cde657901 972 return HAL_ERROR;
mbed_official 87:085cde657901 973 }
mbed_official 87:085cde657901 974
mbed_official 87:085cde657901 975 /* Get timeout */
mbed_official 87:085cde657901 976 timeout = HAL_GetTick() + 10;
mbed_official 87:085cde657901 977
mbed_official 87:085cde657901 978 /* Wait the acknowledge */
mbed_official 87:085cde657901 979 while((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK)
mbed_official 87:085cde657901 980 {
mbed_official 87:085cde657901 981 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 982 {
mbed_official 87:085cde657901 983 hcan->State = HAL_CAN_STATE_TIMEOUT;
mbed_official 87:085cde657901 984 /* Process unlocked */
mbed_official 87:085cde657901 985 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 986 return HAL_TIMEOUT;
mbed_official 87:085cde657901 987 }
mbed_official 87:085cde657901 988 }
mbed_official 87:085cde657901 989
mbed_official 87:085cde657901 990 /* Change CAN state */
mbed_official 87:085cde657901 991 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 992
mbed_official 87:085cde657901 993 /* Process unlocked */
mbed_official 87:085cde657901 994 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 995
mbed_official 87:085cde657901 996 /* Return function status */
mbed_official 87:085cde657901 997 return HAL_OK;
mbed_official 87:085cde657901 998 }
mbed_official 87:085cde657901 999
mbed_official 87:085cde657901 1000 /**
mbed_official 87:085cde657901 1001 * @brief Wakes up the CAN peripheral from sleep mode, after that the CAN peripheral
mbed_official 87:085cde657901 1002 * is in the normal mode.
mbed_official 87:085cde657901 1003 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1004 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1005 * @retval HAL status.
mbed_official 87:085cde657901 1006 */
mbed_official 87:085cde657901 1007 HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1008 {
mbed_official 87:085cde657901 1009 uint32_t timeout;
mbed_official 87:085cde657901 1010
mbed_official 87:085cde657901 1011 /* Process locked */
mbed_official 87:085cde657901 1012 __HAL_LOCK(hcan);
mbed_official 87:085cde657901 1013
mbed_official 87:085cde657901 1014 /* Change CAN state */
mbed_official 87:085cde657901 1015 hcan->State = HAL_CAN_STATE_BUSY;
mbed_official 87:085cde657901 1016
mbed_official 87:085cde657901 1017 /* Wake up request */
mbed_official 87:085cde657901 1018 hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_SLEEP;
mbed_official 87:085cde657901 1019
mbed_official 87:085cde657901 1020 /* Get timeout */
mbed_official 87:085cde657901 1021 timeout = HAL_GetTick() + 10;
mbed_official 87:085cde657901 1022
mbed_official 87:085cde657901 1023 /* Sleep mode status */
mbed_official 87:085cde657901 1024 while((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)
mbed_official 87:085cde657901 1025 {
mbed_official 87:085cde657901 1026 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 1027 {
mbed_official 87:085cde657901 1028 hcan->State= HAL_CAN_STATE_TIMEOUT;
mbed_official 87:085cde657901 1029 /* Process unlocked */
mbed_official 87:085cde657901 1030 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 1031 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1032 }
mbed_official 87:085cde657901 1033 }
mbed_official 87:085cde657901 1034 if((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)
mbed_official 87:085cde657901 1035 {
mbed_official 87:085cde657901 1036 /* Return function status */
mbed_official 87:085cde657901 1037 return HAL_ERROR;
mbed_official 87:085cde657901 1038 }
mbed_official 87:085cde657901 1039
mbed_official 87:085cde657901 1040 /* Change CAN state */
mbed_official 87:085cde657901 1041 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 1042
mbed_official 87:085cde657901 1043 /* Process unlocked */
mbed_official 87:085cde657901 1044 __HAL_UNLOCK(hcan);
mbed_official 87:085cde657901 1045
mbed_official 87:085cde657901 1046 /* Return function status */
mbed_official 87:085cde657901 1047 return HAL_OK;
mbed_official 87:085cde657901 1048 }
mbed_official 87:085cde657901 1049
mbed_official 87:085cde657901 1050 /**
mbed_official 87:085cde657901 1051 * @brief Handles CAN interrupt request
mbed_official 87:085cde657901 1052 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1053 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1054 * @retval None
mbed_official 87:085cde657901 1055 */
mbed_official 87:085cde657901 1056 void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1057 {
mbed_official 87:085cde657901 1058 uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
mbed_official 87:085cde657901 1059
mbed_official 87:085cde657901 1060 /* Check End of transmission flag */
mbed_official 87:085cde657901 1061 if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
mbed_official 87:085cde657901 1062 {
mbed_official 87:085cde657901 1063 tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
mbed_official 87:085cde657901 1064 tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);
mbed_official 87:085cde657901 1065 tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);
mbed_official 87:085cde657901 1066 if(tmp1 || tmp2 || tmp3)
mbed_official 87:085cde657901 1067 {
mbed_official 87:085cde657901 1068 /* Call transmit function */
mbed_official 87:085cde657901 1069 CAN_Transmit_IT(hcan);
mbed_official 87:085cde657901 1070 }
mbed_official 87:085cde657901 1071 }
mbed_official 87:085cde657901 1072
mbed_official 87:085cde657901 1073 tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0);
mbed_official 87:085cde657901 1074 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0);
mbed_official 87:085cde657901 1075 /* Check End of reception flag for FIFO0 */
mbed_official 87:085cde657901 1076 if((tmp1 != 0) && tmp2)
mbed_official 87:085cde657901 1077 {
mbed_official 87:085cde657901 1078 /* Call receive function */
mbed_official 87:085cde657901 1079 CAN_Receive_IT(hcan, CAN_FIFO0);
mbed_official 87:085cde657901 1080 }
mbed_official 87:085cde657901 1081
mbed_official 87:085cde657901 1082 tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1);
mbed_official 87:085cde657901 1083 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1);
mbed_official 87:085cde657901 1084 /* Check End of reception flag for FIFO1 */
mbed_official 87:085cde657901 1085 if((tmp1 != 0) && tmp2)
mbed_official 87:085cde657901 1086 {
mbed_official 87:085cde657901 1087 /* Call receive function */
mbed_official 87:085cde657901 1088 CAN_Receive_IT(hcan, CAN_FIFO1);
mbed_official 87:085cde657901 1089 }
mbed_official 87:085cde657901 1090
mbed_official 87:085cde657901 1091 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EWG);
mbed_official 87:085cde657901 1092 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EWG);
mbed_official 87:085cde657901 1093 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1094 /* Check Error Warning Flag */
mbed_official 87:085cde657901 1095 if(tmp1 && tmp2 && tmp3)
mbed_official 87:085cde657901 1096 {
mbed_official 87:085cde657901 1097 /* Set CAN error code to EWG error */
mbed_official 87:085cde657901 1098 hcan->ErrorCode |= HAL_CAN_ERROR_EWG;
mbed_official 87:085cde657901 1099 /* Clear Error Warning Flag */
mbed_official 87:085cde657901 1100 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_EWG);
mbed_official 87:085cde657901 1101 }
mbed_official 87:085cde657901 1102
mbed_official 87:085cde657901 1103 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EPV);
mbed_official 87:085cde657901 1104 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EPV);
mbed_official 87:085cde657901 1105 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1106 /* Check Error Passive Flag */
mbed_official 87:085cde657901 1107 if(tmp1 && tmp2 && tmp3)
mbed_official 87:085cde657901 1108 {
mbed_official 87:085cde657901 1109 /* Set CAN error code to EPV error */
mbed_official 87:085cde657901 1110 hcan->ErrorCode |= HAL_CAN_ERROR_EPV;
mbed_official 87:085cde657901 1111 /* Clear Error Passive Flag */
mbed_official 87:085cde657901 1112 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_EPV);
mbed_official 87:085cde657901 1113 }
mbed_official 87:085cde657901 1114
mbed_official 87:085cde657901 1115 tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_BOF);
mbed_official 87:085cde657901 1116 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_BOF);
mbed_official 87:085cde657901 1117 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1118 /* Check Bus-Off Flag */
mbed_official 87:085cde657901 1119 if(tmp1 && tmp2 && tmp3)
mbed_official 87:085cde657901 1120 {
mbed_official 87:085cde657901 1121 /* Set CAN error code to BOF error */
mbed_official 87:085cde657901 1122 hcan->ErrorCode |= HAL_CAN_ERROR_BOF;
mbed_official 87:085cde657901 1123 /* Clear Bus-Off Flag */
mbed_official 87:085cde657901 1124 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_BOF);
mbed_official 87:085cde657901 1125 }
mbed_official 87:085cde657901 1126
mbed_official 87:085cde657901 1127 tmp1 = HAL_IS_BIT_CLR(hcan->Instance->ESR, CAN_ESR_LEC);
mbed_official 87:085cde657901 1128 tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_LEC);
mbed_official 87:085cde657901 1129 tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1130 /* Check Last error code Flag */
mbed_official 87:085cde657901 1131 if((!tmp1) && tmp2 && tmp3)
mbed_official 87:085cde657901 1132 {
mbed_official 87:085cde657901 1133 tmp1 = (hcan->Instance->ESR) & CAN_ESR_LEC;
mbed_official 87:085cde657901 1134 switch(tmp1)
mbed_official 87:085cde657901 1135 {
mbed_official 87:085cde657901 1136 case(CAN_ESR_LEC_0):
mbed_official 87:085cde657901 1137 /* Set CAN error code to STF error */
mbed_official 87:085cde657901 1138 hcan->ErrorCode |= HAL_CAN_ERROR_STF;
mbed_official 87:085cde657901 1139 break;
mbed_official 87:085cde657901 1140 case(CAN_ESR_LEC_1):
mbed_official 87:085cde657901 1141 /* Set CAN error code to FOR error */
mbed_official 87:085cde657901 1142 hcan->ErrorCode |= HAL_CAN_ERROR_FOR;
mbed_official 87:085cde657901 1143 break;
mbed_official 87:085cde657901 1144 case(CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
mbed_official 87:085cde657901 1145 /* Set CAN error code to ACK error */
mbed_official 87:085cde657901 1146 hcan->ErrorCode |= HAL_CAN_ERROR_ACK;
mbed_official 87:085cde657901 1147 break;
mbed_official 87:085cde657901 1148 case(CAN_ESR_LEC_2):
mbed_official 87:085cde657901 1149 /* Set CAN error code to BR error */
mbed_official 87:085cde657901 1150 hcan->ErrorCode |= HAL_CAN_ERROR_BR;
mbed_official 87:085cde657901 1151 break;
mbed_official 87:085cde657901 1152 case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
mbed_official 87:085cde657901 1153 /* Set CAN error code to BD error */
mbed_official 87:085cde657901 1154 hcan->ErrorCode |= HAL_CAN_ERROR_BD;
mbed_official 87:085cde657901 1155 break;
mbed_official 87:085cde657901 1156 case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
mbed_official 87:085cde657901 1157 /* Set CAN error code to CRC error */
mbed_official 87:085cde657901 1158 hcan->ErrorCode |= HAL_CAN_ERROR_CRC;
mbed_official 87:085cde657901 1159 break;
mbed_official 87:085cde657901 1160 default:
mbed_official 87:085cde657901 1161 break;
mbed_official 87:085cde657901 1162 }
mbed_official 87:085cde657901 1163
mbed_official 87:085cde657901 1164 /* Clear Last error code Flag */
mbed_official 87:085cde657901 1165 hcan->Instance->ESR &= ~(CAN_ESR_LEC);
mbed_official 87:085cde657901 1166 }
mbed_official 87:085cde657901 1167
mbed_official 87:085cde657901 1168 /* Call the Error call Back in case of Errors */
mbed_official 87:085cde657901 1169 if(hcan->ErrorCode != HAL_IRDA_ERROR_NONE)
mbed_official 87:085cde657901 1170 {
mbed_official 87:085cde657901 1171 /* Set the CAN state ready to be able to start again the process */
mbed_official 87:085cde657901 1172 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 1173 /* Call Error callback function */
mbed_official 87:085cde657901 1174 HAL_CAN_ErrorCallback(hcan);
mbed_official 87:085cde657901 1175 }
mbed_official 87:085cde657901 1176 }
mbed_official 87:085cde657901 1177
mbed_official 87:085cde657901 1178 /**
mbed_official 87:085cde657901 1179 * @brief Transmission complete callback in non blocking mode
mbed_official 87:085cde657901 1180 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1181 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1182 * @retval None
mbed_official 87:085cde657901 1183 */
mbed_official 87:085cde657901 1184 __weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1185 {
mbed_official 87:085cde657901 1186 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1187 the HAL_CAN_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 1188 */
mbed_official 87:085cde657901 1189 }
mbed_official 87:085cde657901 1190
mbed_official 87:085cde657901 1191 /**
mbed_official 87:085cde657901 1192 * @brief Transmission complete callback in non blocking mode
mbed_official 87:085cde657901 1193 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1194 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1195 * @retval None
mbed_official 87:085cde657901 1196 */
mbed_official 87:085cde657901 1197 __weak void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1198 {
mbed_official 87:085cde657901 1199 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1200 the HAL_CAN_RxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 1201 */
mbed_official 87:085cde657901 1202 }
mbed_official 87:085cde657901 1203
mbed_official 87:085cde657901 1204 /**
mbed_official 87:085cde657901 1205 * @brief Error CAN callback.
mbed_official 87:085cde657901 1206 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1207 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1208 * @retval None
mbed_official 87:085cde657901 1209 */
mbed_official 87:085cde657901 1210 __weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
mbed_official 87:085cde657901 1211 {
mbed_official 87:085cde657901 1212 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1213 the HAL_CAN_ErrorCallback could be implemented in the user file
mbed_official 87:085cde657901 1214 */
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 /** @defgroup CAN_Group3 Peripheral State and Error functions
mbed_official 87:085cde657901 1222 * @brief CAN Peripheral State functions
mbed_official 87:085cde657901 1223 *
mbed_official 87:085cde657901 1224 @verbatim
mbed_official 87:085cde657901 1225 ==============================================================================
mbed_official 87:085cde657901 1226 ##### Peripheral State and Error functions #####
mbed_official 87:085cde657901 1227 ==============================================================================
mbed_official 87:085cde657901 1228 [..]
mbed_official 87:085cde657901 1229 This subsection provides functions allowing to
mbed_official 87:085cde657901 1230 (+) Check the CAN state.
mbed_official 87:085cde657901 1231 (+) Check CAN Errors detected during interrupt process
mbed_official 87:085cde657901 1232
mbed_official 87:085cde657901 1233 @endverbatim
mbed_official 87:085cde657901 1234 * @{
mbed_official 87:085cde657901 1235 */
mbed_official 87:085cde657901 1236
mbed_official 87:085cde657901 1237 /**
mbed_official 87:085cde657901 1238 * @brief return the CAN state
mbed_official 87:085cde657901 1239 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1240 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1241 * @retval HAL state
mbed_official 87:085cde657901 1242 */
mbed_official 87:085cde657901 1243 HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1244 {
mbed_official 87:085cde657901 1245 /* Return CAN state */
mbed_official 87:085cde657901 1246 return hcan->State;
mbed_official 87:085cde657901 1247 }
mbed_official 87:085cde657901 1248
mbed_official 87:085cde657901 1249 /**
mbed_official 87:085cde657901 1250 * @brief Return the CAN error code
mbed_official 87:085cde657901 1251 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1252 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1253 * @retval CAN Error Code
mbed_official 87:085cde657901 1254 */
mbed_official 87:085cde657901 1255 uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan)
mbed_official 87:085cde657901 1256 {
mbed_official 87:085cde657901 1257 return hcan->ErrorCode;
mbed_official 87:085cde657901 1258 }
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 * @brief Initiates and transmits a CAN frame message.
mbed_official 87:085cde657901 1265 * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1266 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1267 * @retval HAL status
mbed_official 87:085cde657901 1268 */
mbed_official 87:085cde657901 1269 static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
mbed_official 87:085cde657901 1270 {
mbed_official 87:085cde657901 1271 /* Disable Transmit mailbox empty Interrupt */
mbed_official 87:085cde657901 1272 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_TME);
mbed_official 87:085cde657901 1273
mbed_official 87:085cde657901 1274 if(hcan->State == HAL_CAN_STATE_BUSY_TX)
mbed_official 87:085cde657901 1275 {
mbed_official 87:085cde657901 1276 /* Disable Error warning Interrupt */
mbed_official 87:085cde657901 1277 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG);
mbed_official 87:085cde657901 1278
mbed_official 87:085cde657901 1279 /* Disable Error passive Interrupt */
mbed_official 87:085cde657901 1280 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EPV);
mbed_official 87:085cde657901 1281
mbed_official 87:085cde657901 1282 /* Disable Bus-off Interrupt */
mbed_official 87:085cde657901 1283 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_BOF);
mbed_official 87:085cde657901 1284
mbed_official 87:085cde657901 1285 /* Disable Last error code Interrupt */
mbed_official 87:085cde657901 1286 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_LEC);
mbed_official 87:085cde657901 1287
mbed_official 87:085cde657901 1288 /* Disable Error Interrupt */
mbed_official 87:085cde657901 1289 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1290 }
mbed_official 87:085cde657901 1291
mbed_official 87:085cde657901 1292 if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1293 {
mbed_official 87:085cde657901 1294 /* Change CAN state */
mbed_official 87:085cde657901 1295 hcan->State = HAL_CAN_STATE_BUSY_RX;
mbed_official 87:085cde657901 1296 }
mbed_official 87:085cde657901 1297 else
mbed_official 87:085cde657901 1298 {
mbed_official 87:085cde657901 1299 /* Change CAN state */
mbed_official 87:085cde657901 1300 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 1301 }
mbed_official 87:085cde657901 1302
mbed_official 87:085cde657901 1303 /* Transmission complete callback */
mbed_official 87:085cde657901 1304 HAL_CAN_TxCpltCallback(hcan);
mbed_official 87:085cde657901 1305
mbed_official 87:085cde657901 1306 return HAL_OK;
mbed_official 87:085cde657901 1307 }
mbed_official 87:085cde657901 1308
mbed_official 87:085cde657901 1309 /**
mbed_official 87:085cde657901 1310 * @brief Receives a correct CAN frame.
mbed_official 87:085cde657901 1311 * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1312 * the configuration information for the specified CAN.
mbed_official 87:085cde657901 1313 * @param FIFONumber: Specify the FIFO number
mbed_official 87:085cde657901 1314 * @retval HAL status
mbed_official 87:085cde657901 1315 * @retval None
mbed_official 87:085cde657901 1316 */
mbed_official 87:085cde657901 1317 static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
mbed_official 87:085cde657901 1318 {
mbed_official 87:085cde657901 1319 /* Get the Id */
mbed_official 87:085cde657901 1320 hcan->pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
mbed_official 87:085cde657901 1321 if (hcan->pRxMsg->IDE == CAN_ID_STD)
mbed_official 87:085cde657901 1322 {
mbed_official 87:085cde657901 1323 hcan->pRxMsg->StdId = (uint32_t)0x000007FF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21);
mbed_official 87:085cde657901 1324 }
mbed_official 87:085cde657901 1325 else
mbed_official 87:085cde657901 1326 {
mbed_official 87:085cde657901 1327 hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3);
mbed_official 87:085cde657901 1328 }
mbed_official 87:085cde657901 1329
mbed_official 87:085cde657901 1330 hcan->pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
mbed_official 87:085cde657901 1331 /* Get the DLC */
mbed_official 87:085cde657901 1332 hcan->pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
mbed_official 87:085cde657901 1333 /* Get the FMI */
mbed_official 87:085cde657901 1334 hcan->pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8);
mbed_official 87:085cde657901 1335 /* Get the data field */
mbed_official 87:085cde657901 1336 hcan->pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
mbed_official 87:085cde657901 1337 hcan->pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8);
mbed_official 87:085cde657901 1338 hcan->pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16);
mbed_official 87:085cde657901 1339 hcan->pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24);
mbed_official 87:085cde657901 1340 hcan->pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
mbed_official 87:085cde657901 1341 hcan->pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8);
mbed_official 87:085cde657901 1342 hcan->pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16);
mbed_official 87:085cde657901 1343 hcan->pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24);
mbed_official 87:085cde657901 1344 /* Release the FIFO */
mbed_official 87:085cde657901 1345 /* Release FIFO0 */
mbed_official 87:085cde657901 1346 if (FIFONumber == CAN_FIFO0)
mbed_official 87:085cde657901 1347 {
mbed_official 87:085cde657901 1348 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0);
mbed_official 87:085cde657901 1349
mbed_official 87:085cde657901 1350 /* Disable FIFO 0 message pending Interrupt */
mbed_official 87:085cde657901 1351 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP0);
mbed_official 87:085cde657901 1352 }
mbed_official 87:085cde657901 1353 /* Release FIFO1 */
mbed_official 87:085cde657901 1354 else /* FIFONumber == CAN_FIFO1 */
mbed_official 87:085cde657901 1355 {
mbed_official 87:085cde657901 1356 __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1);
mbed_official 87:085cde657901 1357
mbed_official 87:085cde657901 1358 /* Disable FIFO 1 message pending Interrupt */
mbed_official 87:085cde657901 1359 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP1);
mbed_official 87:085cde657901 1360 }
mbed_official 87:085cde657901 1361
mbed_official 87:085cde657901 1362 if(hcan->State == HAL_CAN_STATE_BUSY_RX)
mbed_official 87:085cde657901 1363 {
mbed_official 87:085cde657901 1364 /* Disable Error warning Interrupt */
mbed_official 87:085cde657901 1365 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG);
mbed_official 87:085cde657901 1366
mbed_official 87:085cde657901 1367 /* Disable Error passive Interrupt */
mbed_official 87:085cde657901 1368 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EPV);
mbed_official 87:085cde657901 1369
mbed_official 87:085cde657901 1370 /* Disable Bus-off Interrupt */
mbed_official 87:085cde657901 1371 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_BOF);
mbed_official 87:085cde657901 1372
mbed_official 87:085cde657901 1373 /* Disable Last error code Interrupt */
mbed_official 87:085cde657901 1374 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_LEC);
mbed_official 87:085cde657901 1375
mbed_official 87:085cde657901 1376 /* Disable Error Interrupt */
mbed_official 87:085cde657901 1377 __HAL_CAN_DISABLE_IT(hcan, CAN_IT_ERR);
mbed_official 87:085cde657901 1378 }
mbed_official 87:085cde657901 1379
mbed_official 87:085cde657901 1380 if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1381 {
mbed_official 87:085cde657901 1382 /* Disable CAN state */
mbed_official 87:085cde657901 1383 hcan->State = HAL_CAN_STATE_BUSY_TX;
mbed_official 87:085cde657901 1384 }
mbed_official 87:085cde657901 1385 else
mbed_official 87:085cde657901 1386 {
mbed_official 87:085cde657901 1387 /* Change CAN state */
mbed_official 87:085cde657901 1388 hcan->State = HAL_CAN_STATE_READY;
mbed_official 87:085cde657901 1389 }
mbed_official 87:085cde657901 1390
mbed_official 87:085cde657901 1391 /* Receive complete callback */
mbed_official 87:085cde657901 1392 HAL_CAN_RxCpltCallback(hcan);
mbed_official 87:085cde657901 1393
mbed_official 87:085cde657901 1394 /* Return function status */
mbed_official 87:085cde657901 1395 return HAL_OK;
mbed_official 87:085cde657901 1396 }
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 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 1402
mbed_official 87:085cde657901 1403 #endif /* HAL_CAN_MODULE_ENABLED */
mbed_official 87:085cde657901 1404 /**
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 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/