stm32f1xx_hal_can.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702
  1. /**
  2. ******************************************************************************
  3. * @file stm32f1xx_hal_can.c
  4. * @author MCD Application Team
  5. * @version V1.1.1
  6. * @date 12-May-2017
  7. * @brief CAN HAL module driver.
  8. * This file provides firmware functions to manage the following
  9. * functionalities of the Controller Area Network (CAN) peripheral:
  10. * + Initialization and de-initialization functions
  11. * + IO operation functions
  12. * + Peripheral Control functions
  13. * + Peripheral State and Error functions
  14. *
  15. @verbatim
  16. ==============================================================================
  17. ##### How to use this driver #####
  18. ==============================================================================
  19. [..]
  20. (#) Enable the CAN controller interface clock using
  21. __HAL_RCC_CAN1_CLK_ENABLE() for CAN1 and __HAL_RCC_CAN2_CLK_ENABLE() for CAN2
  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. __HAL_RCC_GPIOx_CLK_ENABLE();
  26. (++) Connect and configure the involved CAN pins using the
  27. following function HAL_GPIO_Init();
  28. (#) Initialize and configure the CAN using HAL_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 "stm32f1xx_hal.h"
  95. /** @addtogroup STM32F1xx_HAL_Driver
  96. * @{
  97. */
  98. /** @defgroup CAN CAN
  99. * @brief CAN driver modules
  100. * @{
  101. */
  102. #ifdef HAL_CAN_MODULE_ENABLED
  103. #if defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || \
  104. defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC)
  105. /* Private typedef -----------------------------------------------------------*/
  106. /* Private define ------------------------------------------------------------*/
  107. /** @defgroup CAN_Private_Constants CAN Private Constants
  108. * @{
  109. */
  110. #define CAN_TIMEOUT_VALUE 10U
  111. /**
  112. * @}
  113. */
  114. /* Private macro -------------------------------------------------------------*/
  115. /* Private variables ---------------------------------------------------------*/
  116. /* Private function prototypes -----------------------------------------------*/
  117. /** @defgroup CAN_Private_Functions CAN Private Functions
  118. * @{
  119. */
  120. static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber);
  121. static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan);
  122. /**
  123. * @}
  124. */
  125. /* Exported functions --------------------------------------------------------*/
  126. /** @defgroup CAN_Exported_Functions CAN Exported Functions
  127. * @{
  128. */
  129. /** @defgroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions
  130. * @brief Initialization and Configuration functions
  131. *
  132. @verbatim
  133. ==============================================================================
  134. ##### Initialization and de-initialization functions #####
  135. ==============================================================================
  136. [..] This section provides functions allowing to:
  137. (+) Initialize and configure the CAN.
  138. (+) De-initialize the CAN.
  139. @endverbatim
  140. * @{
  141. */
  142. /**
  143. * @brief Initializes the CAN peripheral according to the specified
  144. * parameters in the CAN_InitStruct.
  145. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  146. * the configuration information for the specified CAN.
  147. * @retval HAL status
  148. */
  149. HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
  150. {
  151. uint32_t status = CAN_INITSTATUS_FAILED; /* Default init status */
  152. uint32_t tickstart = 0U;
  153. uint32_t tmp_mcr = 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. CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
  183. /* Request initialisation */
  184. SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
  185. /* Get timeout */
  186. tickstart = HAL_GetTick();
  187. /* Wait the acknowledge */
  188. while(HAL_IS_BIT_CLR(hcan->Instance->MSR, 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. SET_BIT(tmp_mcr, CAN_MCR_TTCM);
  205. }
  206. else
  207. {
  208. CLEAR_BIT(tmp_mcr, CAN_MCR_TTCM);
  209. }
  210. /* Set the automatic bus-off management */
  211. if (hcan->Init.ABOM == ENABLE)
  212. {
  213. SET_BIT(tmp_mcr, CAN_MCR_ABOM);
  214. }
  215. else
  216. {
  217. CLEAR_BIT(tmp_mcr, CAN_MCR_ABOM);
  218. }
  219. /* Set the automatic wake-up mode */
  220. if (hcan->Init.AWUM == ENABLE)
  221. {
  222. SET_BIT(tmp_mcr, CAN_MCR_AWUM);
  223. }
  224. else
  225. {
  226. CLEAR_BIT(tmp_mcr, CAN_MCR_AWUM);
  227. }
  228. /* Set the no automatic retransmission */
  229. if (hcan->Init.NART == ENABLE)
  230. {
  231. SET_BIT(tmp_mcr, CAN_MCR_NART);
  232. }
  233. else
  234. {
  235. CLEAR_BIT(tmp_mcr, CAN_MCR_NART);
  236. }
  237. /* Set the receive FIFO locked mode */
  238. if (hcan->Init.RFLM == ENABLE)
  239. {
  240. SET_BIT(tmp_mcr, CAN_MCR_RFLM);
  241. }
  242. else
  243. {
  244. CLEAR_BIT(tmp_mcr, CAN_MCR_RFLM);
  245. }
  246. /* Set the transmit FIFO priority */
  247. if (hcan->Init.TXFP == ENABLE)
  248. {
  249. SET_BIT(tmp_mcr, CAN_MCR_TXFP);
  250. }
  251. else
  252. {
  253. CLEAR_BIT(tmp_mcr, CAN_MCR_TXFP);
  254. }
  255. /* Update register MCR */
  256. MODIFY_REG(hcan->Instance->MCR,
  257. CAN_MCR_TTCM |
  258. CAN_MCR_ABOM |
  259. CAN_MCR_AWUM |
  260. CAN_MCR_NART |
  261. CAN_MCR_RFLM |
  262. CAN_MCR_TXFP,
  263. tmp_mcr);
  264. /* Set the bit timing register */
  265. WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode |
  266. hcan->Init.SJW |
  267. hcan->Init.BS1 |
  268. hcan->Init.BS2 |
  269. (hcan->Init.Prescaler - 1U)));
  270. /* Request leave initialisation */
  271. CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
  272. /* Get timeout */
  273. tickstart = HAL_GetTick();
  274. /* Wait the acknowledge */
  275. while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
  276. {
  277. if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
  278. {
  279. hcan->State= HAL_CAN_STATE_TIMEOUT;
  280. /* Process unlocked */
  281. __HAL_UNLOCK(hcan);
  282. return HAL_TIMEOUT;
  283. }
  284. }
  285. /* Check acknowledged */
  286. if(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
  287. {
  288. status = CAN_INITSTATUS_SUCCESS;
  289. }
  290. }
  291. if(status == CAN_INITSTATUS_SUCCESS)
  292. {
  293. /* Set CAN error code to none */
  294. hcan->ErrorCode = HAL_CAN_ERROR_NONE;
  295. /* Initialize the CAN state */
  296. hcan->State = HAL_CAN_STATE_READY;
  297. /* Return function status */
  298. return HAL_OK;
  299. }
  300. else
  301. {
  302. /* Initialize the CAN state */
  303. hcan->State = HAL_CAN_STATE_ERROR;
  304. /* Return function status */
  305. return HAL_ERROR;
  306. }
  307. }
  308. /**
  309. * @brief Configures the CAN reception filter according to the specified
  310. * parameters in the CAN_FilterInitStruct.
  311. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  312. * the configuration information for the specified CAN.
  313. * @param sFilterConfig: pointer to a CAN_FilterConfTypeDef structure that
  314. * contains the filter configuration information.
  315. * @retval None
  316. */
  317. HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig)
  318. {
  319. uint32_t filternbrbitpos = 0U;
  320. /* Prevent unused argument(s) compilation warning */
  321. UNUSED(hcan);
  322. /* Check the parameters */
  323. assert_param(IS_CAN_FILTER_NUMBER(sFilterConfig->FilterNumber));
  324. assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode));
  325. assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale));
  326. assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment));
  327. assert_param(IS_FUNCTIONAL_STATE(sFilterConfig->FilterActivation));
  328. assert_param(IS_CAN_BANKNUMBER(sFilterConfig->BankNumber));
  329. filternbrbitpos = (1U) << sFilterConfig->FilterNumber;
  330. /* Initialisation mode for the filter */
  331. /* Select the start slave bank */
  332. MODIFY_REG(hcan->Instance->FMR ,
  333. CAN_FMR_CAN2SB ,
  334. CAN_FMR_FINIT |
  335. (uint32_t)(sFilterConfig->BankNumber << 8U) );
  336. /* Filter Deactivation */
  337. CLEAR_BIT(hcan->Instance->FA1R, filternbrbitpos);
  338. /* Filter Scale */
  339. if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT)
  340. {
  341. /* 16-bit scale for the filter */
  342. CLEAR_BIT(hcan->Instance->FS1R, filternbrbitpos);
  343. /* First 16-bit identifier and First 16-bit mask */
  344. /* Or First 16-bit identifier and Second 16-bit identifier */
  345. hcan->Instance->sFilterRegister[sFilterConfig->FilterNumber].FR1 =
  346. ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) |
  347. (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
  348. /* Second 16-bit identifier and Second 16-bit mask */
  349. /* Or Third 16-bit identifier and Fourth 16-bit identifier */
  350. hcan->Instance->sFilterRegister[sFilterConfig->FilterNumber].FR2 =
  351. ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
  352. (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh);
  353. }
  354. if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT)
  355. {
  356. /* 32-bit scale for the filter */
  357. SET_BIT(hcan->Instance->FS1R, filternbrbitpos);
  358. /* 32-bit identifier or First 32-bit identifier */
  359. hcan->Instance->sFilterRegister[sFilterConfig->FilterNumber].FR1 =
  360. ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) |
  361. (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
  362. /* 32-bit mask or Second 32-bit identifier */
  363. hcan->Instance->sFilterRegister[sFilterConfig->FilterNumber].FR2 =
  364. ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
  365. (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow);
  366. }
  367. /* Filter Mode */
  368. if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK)
  369. {
  370. /*Id/Mask mode for the filter*/
  371. CLEAR_BIT(hcan->Instance->FM1R, filternbrbitpos);
  372. }
  373. else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */
  374. {
  375. /*Identifier list mode for the filter*/
  376. SET_BIT(hcan->Instance->FM1R, filternbrbitpos);
  377. }
  378. /* Filter FIFO assignment */
  379. if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0)
  380. {
  381. /* FIFO 0 assignation for the filter */
  382. CLEAR_BIT(hcan->Instance->FFA1R, filternbrbitpos);
  383. }
  384. else
  385. {
  386. /* FIFO 1 assignation for the filter */
  387. SET_BIT(hcan->Instance->FFA1R, filternbrbitpos);
  388. }
  389. /* Filter activation */
  390. if (sFilterConfig->FilterActivation == ENABLE)
  391. {
  392. SET_BIT(hcan->Instance->FA1R, filternbrbitpos);
  393. }
  394. /* Leave the initialisation mode for the filter */
  395. CLEAR_BIT(hcan->Instance->FMR, ((uint32_t)CAN_FMR_FINIT));
  396. /* Return function status */
  397. return HAL_OK;
  398. }
  399. /**
  400. * @brief Deinitializes the CANx peripheral registers to their default reset values.
  401. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  402. * the configuration information for the specified CAN.
  403. * @retval HAL status
  404. */
  405. HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan)
  406. {
  407. /* Check CAN handle */
  408. if(hcan == NULL)
  409. {
  410. return HAL_ERROR;
  411. }
  412. /* Check the parameters */
  413. assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
  414. /* Change CAN state */
  415. hcan->State = HAL_CAN_STATE_BUSY;
  416. /* DeInit the low level hardware */
  417. HAL_CAN_MspDeInit(hcan);
  418. /* Change CAN state */
  419. hcan->State = HAL_CAN_STATE_RESET;
  420. /* Release Lock */
  421. __HAL_UNLOCK(hcan);
  422. /* Return function status */
  423. return HAL_OK;
  424. }
  425. /**
  426. * @brief Initializes the CAN MSP.
  427. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  428. * the configuration information for the specified CAN.
  429. * @retval None
  430. */
  431. __weak void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
  432. {
  433. /* Prevent unused argument(s) compilation warning */
  434. UNUSED(hcan);
  435. /* NOTE : This function Should not be modified, when the callback is needed,
  436. the HAL_CAN_MspInit can be implemented in the user file
  437. */
  438. }
  439. /**
  440. * @brief DeInitializes the CAN MSP.
  441. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  442. * the configuration information for the specified CAN.
  443. * @retval None
  444. */
  445. __weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
  446. {
  447. /* Prevent unused argument(s) compilation warning */
  448. UNUSED(hcan);
  449. /* NOTE : This function Should not be modified, when the callback is needed,
  450. the HAL_CAN_MspDeInit can be implemented in the user file
  451. */
  452. }
  453. /**
  454. * @}
  455. */
  456. /** @defgroup CAN_Exported_Functions_Group2 Input and Output operation functions
  457. * @brief I/O operation functions
  458. *
  459. @verbatim
  460. ==============================================================================
  461. ##### IO operation functions #####
  462. ==============================================================================
  463. [..] This section provides functions allowing to:
  464. (+) Transmit a CAN frame message.
  465. (+) Receive a CAN frame message.
  466. (+) Enter CAN peripheral in sleep mode.
  467. (+) Wake up the CAN peripheral from sleep mode.
  468. @endverbatim
  469. * @{
  470. */
  471. /**
  472. * @brief Initiates and transmits a CAN frame message.
  473. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  474. * the configuration information for the specified CAN.
  475. * @param Timeout: Specify Timeout value
  476. * @retval HAL status
  477. */
  478. HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)
  479. {
  480. uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
  481. uint32_t tickstart = 0U;
  482. /* Check the parameters */
  483. assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
  484. assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
  485. assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
  486. if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \
  487. ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \
  488. ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))
  489. {
  490. /* Process locked */
  491. __HAL_LOCK(hcan);
  492. /* Change CAN state */
  493. switch(hcan->State)
  494. {
  495. case(HAL_CAN_STATE_BUSY_RX0):
  496. hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
  497. break;
  498. case(HAL_CAN_STATE_BUSY_RX1):
  499. hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
  500. break;
  501. case(HAL_CAN_STATE_BUSY_RX0_RX1):
  502. hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
  503. break;
  504. default: /* HAL_CAN_STATE_READY */
  505. hcan->State = HAL_CAN_STATE_BUSY_TX;
  506. break;
  507. }
  508. /* Select one empty transmit mailbox */
  509. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0))
  510. {
  511. transmitmailbox = CAN_TXMAILBOX_0;
  512. }
  513. else if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1))
  514. {
  515. transmitmailbox = CAN_TXMAILBOX_1;
  516. }
  517. else
  518. {
  519. transmitmailbox = CAN_TXMAILBOX_2;
  520. }
  521. /* Set up the Id */
  522. hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
  523. if (hcan->pTxMsg->IDE == CAN_ID_STD)
  524. {
  525. assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
  526. hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << CAN_TI0R_STID_Pos) |
  527. hcan->pTxMsg->RTR);
  528. }
  529. else
  530. {
  531. assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
  532. hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << CAN_TI0R_EXID_Pos) |
  533. hcan->pTxMsg->IDE |
  534. hcan->pTxMsg->RTR);
  535. }
  536. /* Set up the DLC */
  537. hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
  538. hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= 0xFFFFFFF0U;
  539. hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
  540. /* Set up the data field */
  541. WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, ((uint32_t)hcan->pTxMsg->Data[3] << CAN_TDL0R_DATA3_Pos) |
  542. ((uint32_t)hcan->pTxMsg->Data[2] << CAN_TDL0R_DATA2_Pos) |
  543. ((uint32_t)hcan->pTxMsg->Data[1] << CAN_TDL0R_DATA1_Pos) |
  544. ((uint32_t)hcan->pTxMsg->Data[0] << CAN_TDL0R_DATA0_Pos));
  545. WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, ((uint32_t)hcan->pTxMsg->Data[7] << CAN_TDL0R_DATA3_Pos) |
  546. ((uint32_t)hcan->pTxMsg->Data[6] << CAN_TDL0R_DATA2_Pos) |
  547. ((uint32_t)hcan->pTxMsg->Data[5] << CAN_TDL0R_DATA1_Pos) |
  548. ((uint32_t)hcan->pTxMsg->Data[4] << CAN_TDL0R_DATA0_Pos));
  549. /* Request transmission */
  550. SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
  551. /* Get tick */
  552. tickstart = HAL_GetTick();
  553. /* Check End of transmission flag */
  554. while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
  555. {
  556. /* Check for the Timeout */
  557. if(Timeout != HAL_MAX_DELAY)
  558. {
  559. if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
  560. {
  561. hcan->State = HAL_CAN_STATE_TIMEOUT;
  562. /* Cancel transmission */
  563. __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);
  564. /* Process unlocked */
  565. __HAL_UNLOCK(hcan);
  566. return HAL_TIMEOUT;
  567. }
  568. }
  569. }
  570. /* Change CAN state */
  571. switch(hcan->State)
  572. {
  573. case(HAL_CAN_STATE_BUSY_TX_RX0):
  574. hcan->State = HAL_CAN_STATE_BUSY_RX0;
  575. break;
  576. case(HAL_CAN_STATE_BUSY_TX_RX1):
  577. hcan->State = HAL_CAN_STATE_BUSY_RX1;
  578. break;
  579. case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
  580. hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
  581. break;
  582. default: /* HAL_CAN_STATE_BUSY_TX */
  583. hcan->State = HAL_CAN_STATE_READY;
  584. break;
  585. }
  586. /* Process unlocked */
  587. __HAL_UNLOCK(hcan);
  588. /* Return function status */
  589. return HAL_OK;
  590. }
  591. else
  592. {
  593. /* Change CAN state */
  594. hcan->State = HAL_CAN_STATE_ERROR;
  595. /* Return function status */
  596. return HAL_ERROR;
  597. }
  598. }
  599. /**
  600. * @brief Initiates and transmits a CAN frame message.
  601. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  602. * the configuration information for the specified CAN.
  603. * @retval HAL status
  604. */
  605. HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
  606. {
  607. uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
  608. /* Check the parameters */
  609. assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
  610. assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
  611. assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
  612. if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \
  613. ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \
  614. ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))
  615. {
  616. /* Process Locked */
  617. __HAL_LOCK(hcan);
  618. /* Select one empty transmit mailbox */
  619. if(HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0))
  620. {
  621. transmitmailbox = CAN_TXMAILBOX_0;
  622. }
  623. else if(HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1))
  624. {
  625. transmitmailbox = CAN_TXMAILBOX_1;
  626. }
  627. else
  628. {
  629. transmitmailbox = CAN_TXMAILBOX_2;
  630. }
  631. /* Set up the Id */
  632. hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
  633. if(hcan->pTxMsg->IDE == CAN_ID_STD)
  634. {
  635. assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));
  636. hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << CAN_TI0R_STID_Pos) | \
  637. hcan->pTxMsg->RTR);
  638. }
  639. else
  640. {
  641. assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
  642. hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << CAN_TI0R_EXID_Pos) | \
  643. hcan->pTxMsg->IDE |
  644. hcan->pTxMsg->RTR);
  645. }
  646. /* Set up the DLC */
  647. hcan->pTxMsg->DLC &= (uint8_t)0x0000000FU;
  648. hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= 0xFFFFFFF0U;
  649. hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
  650. /* Set up the data field */
  651. WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, ((uint32_t)hcan->pTxMsg->Data[3U] << CAN_TDL0R_DATA3_Pos) |
  652. ((uint32_t)hcan->pTxMsg->Data[2U] << CAN_TDL0R_DATA2_Pos) |
  653. ((uint32_t)hcan->pTxMsg->Data[1U] << CAN_TDL0R_DATA1_Pos) |
  654. ((uint32_t)hcan->pTxMsg->Data[0U] << CAN_TDL0R_DATA0_Pos));
  655. WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, ((uint32_t)hcan->pTxMsg->Data[7U] << CAN_TDL0R_DATA3_Pos) |
  656. ((uint32_t)hcan->pTxMsg->Data[6U] << CAN_TDL0R_DATA2_Pos) |
  657. ((uint32_t)hcan->pTxMsg->Data[5U] << CAN_TDL0R_DATA1_Pos) |
  658. ((uint32_t)hcan->pTxMsg->Data[4U] << CAN_TDL0R_DATA0_Pos));
  659. /* Change CAN state */
  660. switch(hcan->State)
  661. {
  662. case(HAL_CAN_STATE_BUSY_RX0):
  663. hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
  664. break;
  665. case(HAL_CAN_STATE_BUSY_RX1):
  666. hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
  667. break;
  668. case(HAL_CAN_STATE_BUSY_RX0_RX1):
  669. hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1;
  670. break;
  671. default: /* HAL_CAN_STATE_READY */
  672. hcan->State = HAL_CAN_STATE_BUSY_TX;
  673. break;
  674. }
  675. /* Set CAN error code to none */
  676. hcan->ErrorCode = HAL_CAN_ERROR_NONE;
  677. /* Process Unlocked */
  678. __HAL_UNLOCK(hcan);
  679. /* Request transmission */
  680. hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
  681. /* Enable interrupts: */
  682. /* - Enable Error warning Interrupt */
  683. /* - Enable Error passive Interrupt */
  684. /* - Enable Bus-off Interrupt */
  685. /* - Enable Last error code Interrupt */
  686. /* - Enable Error Interrupt */
  687. /* - Enable Transmit mailbox empty Interrupt */
  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)CAN_ID_EXT & 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)CAN_RTR_REMOTE & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
  810. /* Get the DLC */
  811. pRxMsg->DLC = (uint8_t)0x0FU & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
  812. /* Get the FMI */
  813. pRxMsg->FMI = (uint8_t)0xFFU & (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)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
  818. pRxMsg->Data[1] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U);
  819. pRxMsg->Data[2] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U);
  820. pRxMsg->Data[3] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U);
  821. pRxMsg->Data[4] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
  822. pRxMsg->Data[5] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U);
  823. pRxMsg->Data[6] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U);
  824. pRxMsg->Data[7] = (uint8_t)0xFFU & (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. MODIFY_REG(hcan->Instance->MCR,
  989. CAN_MCR_INRQ ,
  990. CAN_MCR_SLEEP );
  991. /* Sleep mode status */
  992. if (HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_SLAK) ||
  993. HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK) )
  994. {
  995. /* Process unlocked */
  996. __HAL_UNLOCK(hcan);
  997. /* Return function status */
  998. return HAL_ERROR;
  999. }
  1000. /* Get tick */
  1001. tickstart = HAL_GetTick();
  1002. /* Wait the acknowledge */
  1003. while (HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_SLAK) ||
  1004. HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
  1005. {
  1006. if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
  1007. {
  1008. hcan->State = HAL_CAN_STATE_TIMEOUT;
  1009. /* Process unlocked */
  1010. __HAL_UNLOCK(hcan);
  1011. return HAL_TIMEOUT;
  1012. }
  1013. }
  1014. /* Change CAN state */
  1015. hcan->State = HAL_CAN_STATE_READY;
  1016. /* Process unlocked */
  1017. __HAL_UNLOCK(hcan);
  1018. /* Return function status */
  1019. return HAL_OK;
  1020. }
  1021. /**
  1022. * @brief Wakes up the CAN peripheral from sleep mode, after that the CAN peripheral
  1023. * is in the normal mode.
  1024. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1025. * the configuration information for the specified CAN.
  1026. * @retval HAL status.
  1027. */
  1028. HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef* hcan)
  1029. {
  1030. uint32_t tickstart = 0U;
  1031. /* Process locked */
  1032. __HAL_LOCK(hcan);
  1033. /* Change CAN state */
  1034. hcan->State = HAL_CAN_STATE_BUSY;
  1035. /* Wake up request */
  1036. CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
  1037. /* Get timeout */
  1038. tickstart = HAL_GetTick();
  1039. /* Sleep mode status */
  1040. while((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)
  1041. {
  1042. if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
  1043. {
  1044. hcan->State= HAL_CAN_STATE_TIMEOUT;
  1045. /* Process unlocked */
  1046. __HAL_UNLOCK(hcan);
  1047. return HAL_TIMEOUT;
  1048. }
  1049. }
  1050. if(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_SLAK))
  1051. {
  1052. /* Process unlocked */
  1053. __HAL_UNLOCK(hcan);
  1054. /* Return function status */
  1055. return HAL_ERROR;
  1056. }
  1057. /* Change CAN state */
  1058. hcan->State = HAL_CAN_STATE_READY;
  1059. /* Process unlocked */
  1060. __HAL_UNLOCK(hcan);
  1061. /* Return function status */
  1062. return HAL_OK;
  1063. }
  1064. /**
  1065. * @brief Handles CAN interrupt request
  1066. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1067. * the configuration information for the specified CAN.
  1068. * @retval None
  1069. */
  1070. void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
  1071. {
  1072. uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U;
  1073. uint32_t errorcode = HAL_CAN_ERROR_NONE;
  1074. /* Check Overrun flag for FIFO0 */
  1075. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0);
  1076. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV0);
  1077. if((tmp1 != 0U) && tmp2)
  1078. {
  1079. /* Set CAN error code to FOV0 error */
  1080. errorcode |= HAL_CAN_ERROR_FOV0;
  1081. /* Clear FIFO0 Overrun Flag */
  1082. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
  1083. }
  1084. /* Check Overrun flag for FIFO1 */
  1085. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1);
  1086. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV1);
  1087. if((tmp1 != 0U) && tmp2)
  1088. {
  1089. /* Set CAN error code to FOV1 error */
  1090. errorcode |= HAL_CAN_ERROR_FOV1;
  1091. /* Clear FIFO1 Overrun Flag */
  1092. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
  1093. }
  1094. /* Check End of transmission flag */
  1095. if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME))
  1096. {
  1097. /* Check Transmit request completion status */
  1098. tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0);
  1099. tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1);
  1100. tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2);
  1101. if(tmp1 || tmp2 || tmp3)
  1102. {
  1103. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0);
  1104. tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1);
  1105. tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2);
  1106. /* Check Transmit success */
  1107. if((tmp1) || (tmp2) || (tmp3))
  1108. {
  1109. /* Call transmit function */
  1110. CAN_Transmit_IT(hcan);
  1111. }
  1112. else /* Transmit failure */
  1113. {
  1114. /* Set CAN error code to TXFAIL error */
  1115. errorcode |= HAL_CAN_ERROR_TXFAIL;
  1116. }
  1117. /* Clear transmission status flags (RQCPx and TXOKx) */
  1118. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \
  1119. CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2);
  1120. }
  1121. }
  1122. tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0);
  1123. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0);
  1124. /* Check End of reception flag for FIFO0 */
  1125. if((tmp1 != 0U) && tmp2)
  1126. {
  1127. /* Call receive function */
  1128. CAN_Receive_IT(hcan, CAN_FIFO0);
  1129. }
  1130. tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1);
  1131. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1);
  1132. /* Check End of reception flag for FIFO1 */
  1133. if((tmp1 != 0U) && tmp2)
  1134. {
  1135. /* Call receive function */
  1136. CAN_Receive_IT(hcan, CAN_FIFO1);
  1137. }
  1138. /* Set error code in handle */
  1139. hcan->ErrorCode |= errorcode;
  1140. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EWG);
  1141. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EWG);
  1142. tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
  1143. /* Check Error Warning Flag */
  1144. if(tmp1 && tmp2 && tmp3)
  1145. {
  1146. /* Set CAN error code to EWG error */
  1147. hcan->ErrorCode |= HAL_CAN_ERROR_EWG;
  1148. /* No need for clear of Error Warning Flag as read-only */
  1149. }
  1150. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EPV);
  1151. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EPV);
  1152. tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
  1153. /* Check Error Passive Flag */
  1154. if(tmp1 && tmp2 && tmp3)
  1155. {
  1156. /* Set CAN error code to EPV error */
  1157. hcan->ErrorCode |= HAL_CAN_ERROR_EPV;
  1158. /* No need for clear of Error Passive Flag as read-only */
  1159. }
  1160. tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_BOF);
  1161. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_BOF);
  1162. tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
  1163. /* Check Bus-Off Flag */
  1164. if(tmp1 && tmp2 && tmp3)
  1165. {
  1166. /* Set CAN error code to BOF error */
  1167. hcan->ErrorCode |= HAL_CAN_ERROR_BOF;
  1168. /* No need for clear of Bus-Off Flag as read-only */
  1169. }
  1170. tmp1 = HAL_IS_BIT_CLR(hcan->Instance->ESR, CAN_ESR_LEC);
  1171. tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_LEC);
  1172. tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR);
  1173. /* Check Last error code Flag */
  1174. if((!tmp1) && tmp2 && tmp3)
  1175. {
  1176. tmp1 = (hcan->Instance->ESR & CAN_ESR_LEC);
  1177. switch(tmp1)
  1178. {
  1179. case(CAN_ESR_LEC_0):
  1180. /* Set CAN error code to STF error */
  1181. hcan->ErrorCode |= HAL_CAN_ERROR_STF;
  1182. break;
  1183. case(CAN_ESR_LEC_1):
  1184. /* Set CAN error code to FOR error */
  1185. hcan->ErrorCode |= HAL_CAN_ERROR_FOR;
  1186. break;
  1187. case(CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
  1188. /* Set CAN error code to ACK error */
  1189. hcan->ErrorCode |= HAL_CAN_ERROR_ACK;
  1190. break;
  1191. case(CAN_ESR_LEC_2):
  1192. /* Set CAN error code to BR error */
  1193. hcan->ErrorCode |= HAL_CAN_ERROR_BR;
  1194. break;
  1195. case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
  1196. /* Set CAN error code to BD error */
  1197. hcan->ErrorCode |= HAL_CAN_ERROR_BD;
  1198. break;
  1199. case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
  1200. /* Set CAN error code to CRC error */
  1201. hcan->ErrorCode |= HAL_CAN_ERROR_CRC;
  1202. break;
  1203. default:
  1204. break;
  1205. }
  1206. /* Clear Last error code Flag */
  1207. CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC);
  1208. }
  1209. /* Call the Error call Back in case of Errors */
  1210. if(hcan->ErrorCode != HAL_CAN_ERROR_NONE)
  1211. {
  1212. /* Clear ERRI Flag */
  1213. hcan->Instance->MSR = CAN_MSR_ERRI;
  1214. /* Set the CAN state ready to be able to start again the process */
  1215. hcan->State = HAL_CAN_STATE_READY;
  1216. /* Disable interrupts: */
  1217. /* - Disable Error warning Interrupt */
  1218. /* - Disable Error passive Interrupt */
  1219. /* - Disable Bus-off Interrupt */
  1220. /* - Disable Last error code Interrupt */
  1221. /* - Disable Error Interrupt */
  1222. /* - Disable FIFO 0 message pending Interrupt */
  1223. /* - Disable FIFO 0 Overrun Interrupt */
  1224. /* - Disable FIFO 1 message pending Interrupt */
  1225. /* - Disable FIFO 1 Overrun Interrupt */
  1226. /* - Disable Transmit mailbox empty Interrupt */
  1227. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
  1228. CAN_IT_EPV |
  1229. CAN_IT_BOF |
  1230. CAN_IT_LEC |
  1231. CAN_IT_ERR |
  1232. CAN_IT_FMP0|
  1233. CAN_IT_FOV0|
  1234. CAN_IT_FMP1|
  1235. CAN_IT_FOV1|
  1236. CAN_IT_TME );
  1237. /* Call Error callback function */
  1238. HAL_CAN_ErrorCallback(hcan);
  1239. }
  1240. }
  1241. /**
  1242. * @brief Transmission complete callback in non blocking mode
  1243. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1244. * the configuration information for the specified CAN.
  1245. * @retval None
  1246. */
  1247. __weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
  1248. {
  1249. /* Prevent unused argument(s) compilation warning */
  1250. UNUSED(hcan);
  1251. /* NOTE : This function Should not be modified, when the callback is needed,
  1252. the HAL_CAN_TxCpltCallback can be implemented in the user file
  1253. */
  1254. }
  1255. /**
  1256. * @brief Transmission complete callback in non blocking mode
  1257. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1258. * the configuration information for the specified CAN.
  1259. * @retval None
  1260. */
  1261. __weak void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
  1262. {
  1263. /* Prevent unused argument(s) compilation warning */
  1264. UNUSED(hcan);
  1265. /* NOTE : This function Should not be modified, when the callback is needed,
  1266. the HAL_CAN_RxCpltCallback can be implemented in the user file
  1267. */
  1268. }
  1269. /**
  1270. * @brief Error CAN callback.
  1271. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1272. * the configuration information for the specified CAN.
  1273. * @retval None
  1274. */
  1275. __weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
  1276. {
  1277. /* Prevent unused argument(s) compilation warning */
  1278. UNUSED(hcan);
  1279. /* NOTE : This function Should not be modified, when the callback is needed,
  1280. the HAL_CAN_ErrorCallback can be implemented in the user file
  1281. */
  1282. }
  1283. /**
  1284. * @}
  1285. */
  1286. /** @defgroup CAN_Exported_Functions_Group3 Peripheral State and Error functions
  1287. * @brief CAN Peripheral State functions
  1288. *
  1289. @verbatim
  1290. ==============================================================================
  1291. ##### Peripheral State and Error functions #####
  1292. ==============================================================================
  1293. [..]
  1294. This subsection provides functions allowing to :
  1295. (+) Check the CAN state.
  1296. (+) Check CAN Errors detected during interrupt process
  1297. @endverbatim
  1298. * @{
  1299. */
  1300. /**
  1301. * @brief return the CAN state
  1302. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1303. * the configuration information for the specified CAN.
  1304. * @retval HAL state
  1305. */
  1306. HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan)
  1307. {
  1308. /* Return CAN state */
  1309. return hcan->State;
  1310. }
  1311. /**
  1312. * @brief Return the CAN error code
  1313. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1314. * the configuration information for the specified CAN.
  1315. * @retval CAN Error Code
  1316. */
  1317. uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan)
  1318. {
  1319. return hcan->ErrorCode;
  1320. }
  1321. /**
  1322. * @}
  1323. */
  1324. /**
  1325. * @}
  1326. */
  1327. /** @addtogroup CAN_Private_Functions
  1328. * @{
  1329. */
  1330. /**
  1331. * @brief Initiates and transmits a CAN frame message.
  1332. * @param hcan: pointer to a CAN_HandleTypeDef structure that contains
  1333. * the configuration information for the specified CAN.
  1334. * @retval HAL status
  1335. */
  1336. static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
  1337. {
  1338. /* Disable Transmit mailbox empty Interrupt */
  1339. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_TME);
  1340. if(hcan->State == HAL_CAN_STATE_BUSY_TX)
  1341. {
  1342. /* Disable interrupts: */
  1343. /* - Disable Error warning Interrupt */
  1344. /* - Disable Error passive Interrupt */
  1345. /* - Disable Bus-off Interrupt */
  1346. /* - Disable Last error code Interrupt */
  1347. /* - Disable Error Interrupt */
  1348. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
  1349. CAN_IT_EPV |
  1350. CAN_IT_BOF |
  1351. CAN_IT_LEC |
  1352. CAN_IT_ERR);
  1353. }
  1354. /* Change CAN state */
  1355. switch(hcan->State)
  1356. {
  1357. case(HAL_CAN_STATE_BUSY_TX_RX0):
  1358. hcan->State = HAL_CAN_STATE_BUSY_RX0;
  1359. break;
  1360. case(HAL_CAN_STATE_BUSY_TX_RX1):
  1361. hcan->State = HAL_CAN_STATE_BUSY_RX1;
  1362. break;
  1363. case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
  1364. hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1;
  1365. break;
  1366. default: /* HAL_CAN_STATE_BUSY_TX */
  1367. hcan->State = HAL_CAN_STATE_READY;
  1368. break;
  1369. }
  1370. /* Transmission complete callback */
  1371. HAL_CAN_TxCpltCallback(hcan);
  1372. return HAL_OK;
  1373. }
  1374. /**
  1375. * @brief Receives a correct CAN frame.
  1376. * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains
  1377. * the configuration information for the specified CAN.
  1378. * @param FIFONumber: Specify the FIFO number
  1379. * @retval HAL status
  1380. * @retval None
  1381. */
  1382. static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
  1383. {
  1384. uint32_t tmp1 = 0U;
  1385. CanRxMsgTypeDef* pRxMsg = NULL;
  1386. /* Set RxMsg pointer */
  1387. if(FIFONumber == CAN_FIFO0)
  1388. {
  1389. pRxMsg = hcan->pRxMsg;
  1390. }
  1391. else /* FIFONumber == CAN_FIFO1 */
  1392. {
  1393. pRxMsg = hcan->pRx1Msg;
  1394. }
  1395. /* Get the Id */
  1396. pRxMsg->IDE = (uint8_t)0x04U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
  1397. if (pRxMsg->IDE == CAN_ID_STD)
  1398. {
  1399. pRxMsg->StdId = 0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U);
  1400. }
  1401. else
  1402. {
  1403. pRxMsg->ExtId = 0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U);
  1404. }
  1405. pRxMsg->RTR = (uint8_t)0x02U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
  1406. /* Get the DLC */
  1407. pRxMsg->DLC = (uint8_t)0x0FU & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR;
  1408. /* Get the FIFONumber */
  1409. pRxMsg->FIFONumber = FIFONumber;
  1410. /* Get the FMI */
  1411. pRxMsg->FMI = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U);
  1412. /* Get the data field */
  1413. pRxMsg->Data[0] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR;
  1414. pRxMsg->Data[1] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U);
  1415. pRxMsg->Data[2] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U);
  1416. pRxMsg->Data[3] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U);
  1417. pRxMsg->Data[4] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR;
  1418. pRxMsg->Data[5] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U);
  1419. pRxMsg->Data[6] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U);
  1420. pRxMsg->Data[7] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U);
  1421. /* Release the FIFO */
  1422. /* Release FIFO0 */
  1423. if (FIFONumber == CAN_FIFO0)
  1424. {
  1425. __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0);
  1426. /* Disable FIFO 0 overrun and message pending Interrupt */
  1427. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0);
  1428. }
  1429. /* Release FIFO1 */
  1430. else /* FIFONumber == CAN_FIFO1 */
  1431. {
  1432. __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1);
  1433. /* Disable FIFO 1 overrun and message pending Interrupt */
  1434. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1);
  1435. }
  1436. tmp1 = hcan->State;
  1437. if((tmp1 == HAL_CAN_STATE_BUSY_RX0) || (tmp1 == HAL_CAN_STATE_BUSY_RX1))
  1438. {
  1439. /* Disable interrupts: */
  1440. /* - Disable Error warning Interrupt */
  1441. /* - Disable Error passive Interrupt */
  1442. /* - Disable Bus-off Interrupt */
  1443. /* - Disable Last error code Interrupt */
  1444. /* - Disable Error Interrupt */
  1445. __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
  1446. CAN_IT_EPV |
  1447. CAN_IT_BOF |
  1448. CAN_IT_LEC |
  1449. CAN_IT_ERR);
  1450. }
  1451. /* Change CAN state */
  1452. if (FIFONumber == CAN_FIFO0)
  1453. {
  1454. switch(hcan->State)
  1455. {
  1456. case(HAL_CAN_STATE_BUSY_TX_RX0):
  1457. hcan->State = HAL_CAN_STATE_BUSY_TX;
  1458. break;
  1459. case(HAL_CAN_STATE_BUSY_RX0_RX1):
  1460. hcan->State = HAL_CAN_STATE_BUSY_RX1;
  1461. break;
  1462. case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
  1463. hcan->State = HAL_CAN_STATE_BUSY_TX_RX1;
  1464. break;
  1465. default: /* HAL_CAN_STATE_BUSY_RX0 */
  1466. hcan->State = HAL_CAN_STATE_READY;
  1467. break;
  1468. }
  1469. }
  1470. else /* FIFONumber == CAN_FIFO1 */
  1471. {
  1472. switch(hcan->State)
  1473. {
  1474. case(HAL_CAN_STATE_BUSY_TX_RX1):
  1475. hcan->State = HAL_CAN_STATE_BUSY_TX;
  1476. break;
  1477. case(HAL_CAN_STATE_BUSY_RX0_RX1):
  1478. hcan->State = HAL_CAN_STATE_BUSY_RX0;
  1479. break;
  1480. case(HAL_CAN_STATE_BUSY_TX_RX0_RX1):
  1481. hcan->State = HAL_CAN_STATE_BUSY_TX_RX0;
  1482. break;
  1483. default: /* HAL_CAN_STATE_BUSY_RX1 */
  1484. hcan->State = HAL_CAN_STATE_READY;
  1485. break;
  1486. }
  1487. }
  1488. /* Receive complete callback */
  1489. HAL_CAN_RxCpltCallback(hcan);
  1490. /* Return function status */
  1491. return HAL_OK;
  1492. }
  1493. /**
  1494. * @}
  1495. */
  1496. #endif /* STM32F103x6) || STM32F103xB || STM32F103xE || STM32F103xG) || STM32F105xC || STM32F107xC */
  1497. #endif /* HAL_CAN_MODULE_ENABLED */
  1498. /**
  1499. * @}
  1500. */
  1501. /**
  1502. * @}
  1503. */
  1504. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/