mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Aug 06 08:15:07 2014 +0100
Revision:
274:6937b19af361
Parent:
226:b062af740e40
Child:
369:2e96f1b71984
Synchronized with git revision 5b145e4f6c509376173c3ea2aa35a6da879a2124

Full URL: https://github.com/mbedmicro/mbed/commit/5b145e4f6c509376173c3ea2aa35a6da879a2124/

[TARGET_LPC11UXX] PeripheralNames.h and PinMap definitions separation for LPC11UXX platforms

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****/