mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

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 613:bc40b8d2aec4 5 * @version V1.3.2
mbed_official 613:bc40b8d2aec4 6 * @date 26-June-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 613:bc40b8d2aec4 174 if(hcan == 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 613:bc40b8d2aec4 463 if(hcan == 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****/