Initial commit

Dependencies:   FastPWM

Committer:
lypinator
Date:
Wed Sep 16 01:11:49 2020 +0000
Revision:
0:bb348c97df44
Added PWM

Who changed what in which revision?

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