SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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