1
0

stm32f4xx_hal_can.c 53 KB

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