You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1684 lines
52 KiB

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