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:
Thu Jul 02 16:30:08 2015 +0100
Revision:
581:39197bcd20f2
Parent:
532:fe11edbda85c
Child:
613:bc40b8d2aec4
Synchronized with git revision ae2d3cdffe70184eb8736d94f76c45c93f4b7724

Full URL: https://github.com/mbedmicro/mbed/commit/ae2d3cdffe70184eb8736d94f76c45c93f4b7724/

Make it possible to build the core mbed library with yotta

Who changed what in which revision?

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