mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
jaerts
Date:
Tue Dec 22 13:22:16 2015 +0000
Revision:
637:ed69428d4850
Parent:
610:813dcc80987e
Add very shady LPC1768 CAN Filter implementation

Who changed what in which revision?

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