drv_can.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-05 Xeon Xu the first version
  9. * 2019-01-22 YLZ port from stm324xx-HAL to bsp stm3210x-HAL
  10. * 2019-02-19 YLZ add support EXTID RTR Frame. modify send, recv functions.
  11. * fix bug.port to BSP [stm32]
  12. * 2019-03-27 YLZ support double can channels, support stm32F4xx (only Legacy mode).
  13. * 2019-06-17 YLZ port to new STM32F1xx HAL V1.1.3.
  14. * 2021-02-02 YuZhe XU fix bug in filter config
  15. * 2021-8-25 SVCHAO The baud rate is configured according to the different APB1 frequencies.
  16. f4-series only.
  17. */
  18. #include "drv_can.h"
  19. #ifdef BSP_USING_CAN
  20. #define LOG_TAG "drv_can"
  21. #include <drv_log.h>
  22. /* attention !!! baud calculation example: Tclk / ((ss + bs1 + bs2) * brp) 36 / ((1 + 8 + 3) * 3) = 1MHz*/
  23. #if defined (SOC_SERIES_STM32F1)/* APB1 36MHz(max) */
  24. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  25. {
  26. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 3)},
  27. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_5TQ | CAN_BS2_3TQ | 5)},
  28. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 6)},
  29. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 12)},
  30. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 24)},
  31. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 30)},
  32. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 60)},
  33. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 150)},
  34. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 300)}
  35. };
  36. #elif defined (SOC_SERIES_STM32F4) /* 42MHz or 45MHz */
  37. #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\
  38. defined(STM32F401xC) || defined(STM32F401xE) /* 42MHz(max) */
  39. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  40. {
  41. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 3)},
  42. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_5TQ | 4)},
  43. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 6)},
  44. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 12)},
  45. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 24)},
  46. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 30)},
  47. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 60)},
  48. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 150)},
  49. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 300)}
  50. };
  51. #else /* APB1 45MHz(max) */
  52. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  53. {
  54. #ifdef BSP_USING_CAN168M
  55. {CAN1MBaud, (CAN_SJW_1TQ | CAN_BS1_3TQ | CAN_BS2_3TQ | 6)},
  56. #else
  57. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 3)},
  58. #endif
  59. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_5TQ | 4)},
  60. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 6)},
  61. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 12)},
  62. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 24)},
  63. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 30)},
  64. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 60)},
  65. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 150)},
  66. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 300)}
  67. };
  68. #endif
  69. #elif defined (SOC_SERIES_STM32F7)/* APB1 54MHz(max) */
  70. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  71. {
  72. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 3)},
  73. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_7TQ | 4)},
  74. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 6)},
  75. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 12)},
  76. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 24)},
  77. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 30)},
  78. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 60)},
  79. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 150)},
  80. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 300)}
  81. };
  82. #elif defined (SOC_SERIES_STM32L4)/* APB1 80MHz(max) */
  83. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  84. {
  85. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_5TQ | CAN_BS2_2TQ | 10)},
  86. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_14TQ | CAN_BS2_5TQ | 5)},
  87. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_7TQ | CAN_BS2_2TQ | 16)},
  88. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 20)},
  89. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 40)},
  90. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 50)},
  91. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 100)},
  92. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 250)},
  93. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 500)}
  94. };
  95. #endif
  96. #ifdef BSP_USING_CAN1
  97. static struct stm32_can drv_can1 =
  98. {
  99. .name = "can1",
  100. .CanHandle.Instance = CAN1,
  101. };
  102. #endif
  103. #ifdef BSP_USING_CAN2
  104. static struct stm32_can drv_can2 =
  105. {
  106. "can2",
  107. .CanHandle.Instance = CAN2,
  108. };
  109. #endif
  110. static rt_uint32_t get_can_baud_index(rt_uint32_t baud)
  111. {
  112. rt_uint32_t len, index;
  113. len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]);
  114. for (index = 0; index < len; index++)
  115. {
  116. if (can_baud_rate_tab[index].baud_rate == baud)
  117. return index;
  118. }
  119. return 0; /* default baud is CAN1MBaud */
  120. }
  121. static rt_err_t _can_config(struct rt_can_device *can, struct can_configure *cfg)
  122. {
  123. struct stm32_can *drv_can;
  124. rt_uint32_t baud_index;
  125. RT_ASSERT(can);
  126. RT_ASSERT(cfg);
  127. drv_can = (struct stm32_can *)can->parent.user_data;
  128. RT_ASSERT(drv_can);
  129. drv_can->CanHandle.Init.TimeTriggeredMode = DISABLE;
  130. drv_can->CanHandle.Init.AutoBusOff = ENABLE;
  131. drv_can->CanHandle.Init.AutoWakeUp = DISABLE;
  132. drv_can->CanHandle.Init.AutoRetransmission = DISABLE;
  133. drv_can->CanHandle.Init.ReceiveFifoLocked = DISABLE;
  134. drv_can->CanHandle.Init.TransmitFifoPriority = ENABLE;
  135. switch (cfg->mode)
  136. {
  137. case RT_CAN_MODE_NORMAL:
  138. drv_can->CanHandle.Init.Mode = CAN_MODE_NORMAL;
  139. break;
  140. case RT_CAN_MODE_LISEN:
  141. drv_can->CanHandle.Init.Mode = CAN_MODE_SILENT;
  142. break;
  143. case RT_CAN_MODE_LOOPBACK:
  144. drv_can->CanHandle.Init.Mode = CAN_MODE_LOOPBACK;
  145. break;
  146. case RT_CAN_MODE_LOOPBACKANLISEN:
  147. drv_can->CanHandle.Init.Mode = CAN_MODE_SILENT_LOOPBACK;
  148. break;
  149. }
  150. baud_index = get_can_baud_index(cfg->baud_rate);
  151. drv_can->CanHandle.Init.SyncJumpWidth = BAUD_DATA(SJW, baud_index);
  152. drv_can->CanHandle.Init.TimeSeg1 = BAUD_DATA(BS1, baud_index);
  153. drv_can->CanHandle.Init.TimeSeg2 = BAUD_DATA(BS2, baud_index);
  154. drv_can->CanHandle.Init.Prescaler = BAUD_DATA(RRESCL, baud_index);
  155. /* init can */
  156. if (HAL_CAN_Init(&drv_can->CanHandle) != HAL_OK)
  157. {
  158. return -RT_ERROR;
  159. }
  160. /* default filter config */
  161. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  162. /* can start */
  163. HAL_CAN_Start(&drv_can->CanHandle);
  164. return RT_EOK;
  165. }
  166. static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
  167. {
  168. rt_uint32_t argval;
  169. struct stm32_can *drv_can;
  170. struct rt_can_filter_config *filter_cfg;
  171. RT_ASSERT(can != RT_NULL);
  172. drv_can = (struct stm32_can *)can->parent.user_data;
  173. RT_ASSERT(drv_can != RT_NULL);
  174. switch (cmd)
  175. {
  176. case RT_DEVICE_CTRL_CLR_INT:
  177. argval = (rt_uint32_t) arg;
  178. if (argval == RT_DEVICE_FLAG_INT_RX)
  179. {
  180. if (CAN1 == drv_can->CanHandle.Instance)
  181. {
  182. HAL_NVIC_DisableIRQ(CAN1_RX0_IRQn);
  183. HAL_NVIC_DisableIRQ(CAN1_RX1_IRQn);
  184. }
  185. #ifdef CAN2
  186. if (CAN2 == drv_can->CanHandle.Instance)
  187. {
  188. HAL_NVIC_DisableIRQ(CAN2_RX0_IRQn);
  189. HAL_NVIC_DisableIRQ(CAN2_RX1_IRQn);
  190. }
  191. #endif
  192. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  193. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_FULL);
  194. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_OVERRUN);
  195. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  196. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_FULL);
  197. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_OVERRUN);
  198. }
  199. else if (argval == RT_DEVICE_FLAG_INT_TX)
  200. {
  201. if (CAN1 == drv_can->CanHandle.Instance)
  202. {
  203. HAL_NVIC_DisableIRQ(CAN1_TX_IRQn);
  204. }
  205. #ifdef CAN2
  206. if (CAN2 == drv_can->CanHandle.Instance)
  207. {
  208. HAL_NVIC_DisableIRQ(CAN2_TX_IRQn);
  209. }
  210. #endif
  211. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_TX_MAILBOX_EMPTY);
  212. }
  213. else if (argval == RT_DEVICE_CAN_INT_ERR)
  214. {
  215. if (CAN1 == drv_can->CanHandle.Instance)
  216. {
  217. NVIC_DisableIRQ(CAN1_SCE_IRQn);
  218. }
  219. #ifdef CAN2
  220. if (CAN2 == drv_can->CanHandle.Instance)
  221. {
  222. NVIC_DisableIRQ(CAN2_SCE_IRQn);
  223. }
  224. #endif
  225. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_WARNING);
  226. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_PASSIVE);
  227. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_BUSOFF);
  228. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_LAST_ERROR_CODE);
  229. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR);
  230. }
  231. break;
  232. case RT_DEVICE_CTRL_SET_INT:
  233. argval = (rt_uint32_t) arg;
  234. if (argval == RT_DEVICE_FLAG_INT_RX)
  235. {
  236. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  237. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_FULL);
  238. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_OVERRUN);
  239. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  240. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_FULL);
  241. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_OVERRUN);
  242. if (CAN1 == drv_can->CanHandle.Instance)
  243. {
  244. HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0);
  245. HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
  246. HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 1, 0);
  247. HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
  248. }
  249. #ifdef CAN2
  250. if (CAN2 == drv_can->CanHandle.Instance)
  251. {
  252. HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 1, 0);
  253. HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);
  254. HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 1, 0);
  255. HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
  256. }
  257. #endif
  258. }
  259. else if (argval == RT_DEVICE_FLAG_INT_TX)
  260. {
  261. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_TX_MAILBOX_EMPTY);
  262. if (CAN1 == drv_can->CanHandle.Instance)
  263. {
  264. HAL_NVIC_SetPriority(CAN1_TX_IRQn, 1, 0);
  265. HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
  266. }
  267. #ifdef CAN2
  268. if (CAN2 == drv_can->CanHandle.Instance)
  269. {
  270. HAL_NVIC_SetPriority(CAN2_TX_IRQn, 1, 0);
  271. HAL_NVIC_EnableIRQ(CAN2_TX_IRQn);
  272. }
  273. #endif
  274. }
  275. else if (argval == RT_DEVICE_CAN_INT_ERR)
  276. {
  277. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_WARNING);
  278. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_PASSIVE);
  279. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_BUSOFF);
  280. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_LAST_ERROR_CODE);
  281. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR);
  282. if (CAN1 == drv_can->CanHandle.Instance)
  283. {
  284. HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 1, 0);
  285. HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
  286. }
  287. #ifdef CAN2
  288. if (CAN2 == drv_can->CanHandle.Instance)
  289. {
  290. HAL_NVIC_SetPriority(CAN2_SCE_IRQn, 1, 0);
  291. HAL_NVIC_EnableIRQ(CAN2_SCE_IRQn);
  292. }
  293. #endif
  294. }
  295. break;
  296. case RT_CAN_CMD_SET_FILTER:
  297. {
  298. rt_uint32_t id_h = 0;
  299. rt_uint32_t id_l = 0;
  300. rt_uint32_t mask_h = 0;
  301. rt_uint32_t mask_l = 0;
  302. rt_uint32_t mask_l_tail = 0; //CAN_FxR2 bit [2:0]
  303. if (RT_NULL == arg)
  304. {
  305. /* default filter config */
  306. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  307. }
  308. else
  309. {
  310. filter_cfg = (struct rt_can_filter_config *)arg;
  311. /* get default filter */
  312. for (int i = 0; i < filter_cfg->count; i++)
  313. {
  314. if (filter_cfg->items[i].hdr == -1)
  315. {
  316. drv_can->FilterConfig.FilterBank = i;
  317. }
  318. else
  319. {
  320. drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr;
  321. }
  322. /**
  323. * ID | CAN_FxR1[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] |
  324. * MASK | CAN_FxR2[31:24] | CAN_FxR2[23:16] | CAN_FxR2[15:8] | CAN_FxR2[7:0] |
  325. * STD ID | STID[10:3] | STDID[2:0] |<- 21bit ->|
  326. * EXT ID | EXTID[28:21] | EXTID[20:13] | EXTID[12:5] | EXTID[4:0] IDE RTR 0|
  327. * @note the 32bit STD ID must << 21 to fill CAN_FxR1[31:21] and EXT ID must << 3,
  328. * -> but the id bit of struct rt_can_filter_item is 29,
  329. * -> so STD id << 18 and EXT id Don't need << 3, when get the high 16bit.
  330. * -> FilterIdHigh : (((STDid << 18) or (EXT id)) >> 13) & 0xFFFF,
  331. * -> FilterIdLow: ((STDid << 18) or (EXT id << 3)) & 0xFFFF.
  332. * @note the mask bit of struct rt_can_filter_item is 32,
  333. * -> FilterMaskIdHigh: (((STD mask << 21) or (EXT mask <<3)) >> 16) & 0xFFFF
  334. * -> FilterMaskIdLow: ((STD mask << 21) or (EXT mask <<3)) & 0xFFFF
  335. */
  336. if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDMASK)
  337. {
  338. /* make sure the CAN_FxR1[2:0](IDE RTR) work */
  339. mask_l_tail = 0x06;
  340. }
  341. else if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDLIST)
  342. {
  343. /* same as CAN_FxR1 */
  344. mask_l_tail = (filter_cfg->items[i].ide << 2) |
  345. (filter_cfg->items[i].rtr << 1);
  346. }
  347. if (filter_cfg->items[i].ide == RT_CAN_STDID)
  348. {
  349. id_h = ((filter_cfg->items[i].id << 18) >> 13) & 0xFFFF;
  350. id_l = ((filter_cfg->items[i].id << 18) |
  351. (filter_cfg->items[i].ide << 2) |
  352. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  353. mask_h = ((filter_cfg->items[i].mask << 21) >> 16) & 0xFFFF;
  354. mask_l = ((filter_cfg->items[i].mask << 21) | mask_l_tail) & 0xFFFF;
  355. }
  356. else if (filter_cfg->items[i].ide == RT_CAN_EXTID)
  357. {
  358. id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  359. id_l = ((filter_cfg->items[i].id << 3) |
  360. (filter_cfg->items[i].ide << 2) |
  361. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  362. mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF;
  363. mask_l = ((filter_cfg->items[i].mask << 3) | mask_l_tail) & 0xFFFF;
  364. }
  365. drv_can->FilterConfig.FilterIdHigh = id_h;
  366. drv_can->FilterConfig.FilterIdLow = id_l;
  367. drv_can->FilterConfig.FilterMaskIdHigh = mask_h;
  368. drv_can->FilterConfig.FilterMaskIdLow = mask_l;
  369. drv_can->FilterConfig.FilterMode = filter_cfg->items[i].mode;
  370. /* Filter conf */
  371. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  372. }
  373. }
  374. break;
  375. }
  376. case RT_CAN_CMD_SET_MODE:
  377. argval = (rt_uint32_t) arg;
  378. if (argval != RT_CAN_MODE_NORMAL &&
  379. argval != RT_CAN_MODE_LISEN &&
  380. argval != RT_CAN_MODE_LOOPBACK &&
  381. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  382. {
  383. return -RT_ERROR;
  384. }
  385. if (argval != drv_can->device.config.mode)
  386. {
  387. drv_can->device.config.mode = argval;
  388. return _can_config(&drv_can->device, &drv_can->device.config);
  389. }
  390. break;
  391. case RT_CAN_CMD_SET_BAUD:
  392. argval = (rt_uint32_t) arg;
  393. if (argval != CAN1MBaud &&
  394. argval != CAN800kBaud &&
  395. argval != CAN500kBaud &&
  396. argval != CAN250kBaud &&
  397. argval != CAN125kBaud &&
  398. argval != CAN100kBaud &&
  399. argval != CAN50kBaud &&
  400. argval != CAN20kBaud &&
  401. argval != CAN10kBaud)
  402. {
  403. return -RT_ERROR;
  404. }
  405. if (argval != drv_can->device.config.baud_rate)
  406. {
  407. drv_can->device.config.baud_rate = argval;
  408. return _can_config(&drv_can->device, &drv_can->device.config);
  409. }
  410. break;
  411. case RT_CAN_CMD_SET_PRIV:
  412. argval = (rt_uint32_t) arg;
  413. if (argval != RT_CAN_MODE_PRIV &&
  414. argval != RT_CAN_MODE_NOPRIV)
  415. {
  416. return -RT_ERROR;
  417. }
  418. if (argval != drv_can->device.config.privmode)
  419. {
  420. drv_can->device.config.privmode = argval;
  421. return _can_config(&drv_can->device, &drv_can->device.config);
  422. }
  423. break;
  424. case RT_CAN_CMD_GET_STATUS:
  425. {
  426. rt_uint32_t errtype;
  427. errtype = drv_can->CanHandle.Instance->ESR;
  428. drv_can->device.status.rcverrcnt = errtype >> 24;
  429. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  430. drv_can->device.status.lasterrtype = errtype & 0x70;
  431. drv_can->device.status.errcode = errtype & 0x07;
  432. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  433. }
  434. break;
  435. }
  436. return RT_EOK;
  437. }
  438. static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  439. {
  440. CAN_HandleTypeDef *hcan;
  441. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  442. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  443. CAN_TxHeaderTypeDef txheader = {0};
  444. HAL_CAN_StateTypeDef state = hcan->State;
  445. /* Check the parameters */
  446. RT_ASSERT(IS_CAN_DLC(pmsg->len));
  447. if ((state == HAL_CAN_STATE_READY) ||
  448. (state == HAL_CAN_STATE_LISTENING))
  449. {
  450. /*check select mailbox is empty */
  451. switch (1 << box_num)
  452. {
  453. case CAN_TX_MAILBOX0:
  454. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0) != SET)
  455. {
  456. /* Change CAN state */
  457. // hcan->State = HAL_CAN_STATE_ERROR;
  458. /* Return function status */
  459. return -RT_ERROR;
  460. }
  461. break;
  462. case CAN_TX_MAILBOX1:
  463. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1) != SET)
  464. {
  465. /* Change CAN state */
  466. // hcan->State = HAL_CAN_STATE_ERROR;
  467. /* Return function status */
  468. return -RT_ERROR;
  469. }
  470. break;
  471. case CAN_TX_MAILBOX2:
  472. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2) != SET)
  473. {
  474. /* Change CAN state */
  475. // hcan->State = HAL_CAN_STATE_ERROR;
  476. /* Return function status */
  477. return -RT_ERROR;
  478. }
  479. break;
  480. default:
  481. RT_ASSERT(0);
  482. break;
  483. }
  484. if (RT_CAN_STDID == pmsg->ide)
  485. {
  486. txheader.IDE = CAN_ID_STD;
  487. RT_ASSERT(IS_CAN_STDID(pmsg->id));
  488. txheader.StdId = pmsg->id;
  489. }
  490. else
  491. {
  492. txheader.IDE = CAN_ID_EXT;
  493. RT_ASSERT(IS_CAN_EXTID(pmsg->id));
  494. txheader.ExtId = pmsg->id;
  495. }
  496. if (RT_CAN_DTR == pmsg->rtr)
  497. {
  498. txheader.RTR = CAN_RTR_DATA;
  499. }
  500. else
  501. {
  502. txheader.RTR = CAN_RTR_REMOTE;
  503. }
  504. /* clear TIR */
  505. hcan->Instance->sTxMailBox[box_num].TIR &= CAN_TI0R_TXRQ;
  506. /* Set up the Id */
  507. if (RT_CAN_STDID == pmsg->ide)
  508. {
  509. hcan->Instance->sTxMailBox[box_num].TIR |= (txheader.StdId << CAN_TI0R_STID_Pos) | txheader.RTR;
  510. }
  511. else
  512. {
  513. hcan->Instance->sTxMailBox[box_num].TIR |= (txheader.ExtId << CAN_TI0R_EXID_Pos) | txheader.IDE | txheader.RTR;
  514. }
  515. /* Set up the DLC */
  516. hcan->Instance->sTxMailBox[box_num].TDTR = pmsg->len & 0x0FU;
  517. /* Set up the data field */
  518. WRITE_REG(hcan->Instance->sTxMailBox[box_num].TDHR,
  519. ((uint32_t)pmsg->data[7] << CAN_TDH0R_DATA7_Pos) |
  520. ((uint32_t)pmsg->data[6] << CAN_TDH0R_DATA6_Pos) |
  521. ((uint32_t)pmsg->data[5] << CAN_TDH0R_DATA5_Pos) |
  522. ((uint32_t)pmsg->data[4] << CAN_TDH0R_DATA4_Pos));
  523. WRITE_REG(hcan->Instance->sTxMailBox[box_num].TDLR,
  524. ((uint32_t)pmsg->data[3] << CAN_TDL0R_DATA3_Pos) |
  525. ((uint32_t)pmsg->data[2] << CAN_TDL0R_DATA2_Pos) |
  526. ((uint32_t)pmsg->data[1] << CAN_TDL0R_DATA1_Pos) |
  527. ((uint32_t)pmsg->data[0] << CAN_TDL0R_DATA0_Pos));
  528. /* Request transmission */
  529. SET_BIT(hcan->Instance->sTxMailBox[box_num].TIR, CAN_TI0R_TXRQ);
  530. return RT_EOK;
  531. }
  532. else
  533. {
  534. /* Update error code */
  535. hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
  536. return -RT_ERROR;
  537. }
  538. }
  539. static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  540. {
  541. HAL_StatusTypeDef status;
  542. CAN_HandleTypeDef *hcan;
  543. struct rt_can_msg *pmsg;
  544. CAN_RxHeaderTypeDef rxheader = {0};
  545. RT_ASSERT(can);
  546. hcan = &((struct stm32_can *)can->parent.user_data)->CanHandle;
  547. pmsg = (struct rt_can_msg *) buf;
  548. /* get data */
  549. status = HAL_CAN_GetRxMessage(hcan, fifo, &rxheader, pmsg->data);
  550. if (HAL_OK != status)
  551. return -RT_ERROR;
  552. /* get id */
  553. if (CAN_ID_STD == rxheader.IDE)
  554. {
  555. pmsg->ide = RT_CAN_STDID;
  556. pmsg->id = rxheader.StdId;
  557. }
  558. else
  559. {
  560. pmsg->ide = RT_CAN_EXTID;
  561. pmsg->id = rxheader.ExtId;
  562. }
  563. /* get type */
  564. if (CAN_RTR_DATA == rxheader.RTR)
  565. {
  566. pmsg->rtr = RT_CAN_DTR;
  567. }
  568. else
  569. {
  570. pmsg->rtr = RT_CAN_RTR;
  571. }
  572. /* get len */
  573. pmsg->len = rxheader.DLC;
  574. /* get hdr */
  575. if (hcan->Instance == CAN1)
  576. {
  577. pmsg->hdr = (rxheader.FilterMatchIndex + 1) >> 1;
  578. }
  579. #ifdef CAN2
  580. else if (hcan->Instance == CAN2)
  581. {
  582. pmsg->hdr = (rxheader.FilterMatchIndex >> 1) + 14;
  583. }
  584. #endif
  585. return RT_EOK;
  586. }
  587. static const struct rt_can_ops _can_ops =
  588. {
  589. _can_config,
  590. _can_control,
  591. _can_sendmsg,
  592. _can_recvmsg,
  593. };
  594. static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
  595. {
  596. CAN_HandleTypeDef *hcan;
  597. RT_ASSERT(can);
  598. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  599. switch (fifo)
  600. {
  601. case CAN_RX_FIFO0:
  602. /* save to user list */
  603. if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_MSG_PENDING))
  604. {
  605. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  606. }
  607. /* Check FULL flag for FIFO0 */
  608. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_FULL))
  609. {
  610. /* Clear FIFO0 FULL Flag */
  611. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
  612. }
  613. /* Check Overrun flag for FIFO0 */
  614. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_OVERRUN))
  615. {
  616. /* Clear FIFO0 Overrun Flag */
  617. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
  618. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  619. }
  620. break;
  621. case CAN_RX_FIFO1:
  622. /* save to user list */
  623. if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_MSG_PENDING))
  624. {
  625. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  626. }
  627. /* Check FULL flag for FIFO1 */
  628. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_FULL))
  629. {
  630. /* Clear FIFO1 FULL Flag */
  631. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1);
  632. }
  633. /* Check Overrun flag for FIFO1 */
  634. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_OVERRUN))
  635. {
  636. /* Clear FIFO1 Overrun Flag */
  637. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
  638. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  639. }
  640. break;
  641. }
  642. }
  643. #ifdef BSP_USING_CAN1
  644. /**
  645. * @brief This function handles CAN1 TX interrupts. transmit fifo0/1/2 is empty can trigger this interrupt
  646. */
  647. void CAN1_TX_IRQHandler(void)
  648. {
  649. rt_interrupt_enter();
  650. CAN_HandleTypeDef *hcan;
  651. hcan = &drv_can1.CanHandle;
  652. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
  653. {
  654. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
  655. {
  656. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  657. }
  658. else
  659. {
  660. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  661. }
  662. /* Write 0 to Clear transmission status flag RQCPx */
  663. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
  664. }
  665. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
  666. {
  667. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
  668. {
  669. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | 1 << 8);
  670. }
  671. else
  672. {
  673. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  674. }
  675. /* Write 0 to Clear transmission status flag RQCPx */
  676. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
  677. }
  678. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
  679. {
  680. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
  681. {
  682. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | 2 << 8);
  683. }
  684. else
  685. {
  686. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  687. }
  688. /* Write 0 to Clear transmission status flag RQCPx */
  689. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
  690. }
  691. else
  692. {
  693. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  694. }
  695. rt_interrupt_leave();
  696. }
  697. /**
  698. * @brief This function handles CAN1 RX0 interrupts.
  699. */
  700. void CAN1_RX0_IRQHandler(void)
  701. {
  702. rt_interrupt_enter();
  703. _can_rx_isr(&drv_can1.device, CAN_RX_FIFO0);
  704. rt_interrupt_leave();
  705. }
  706. /**
  707. * @brief This function handles CAN1 RX1 interrupts.
  708. */
  709. void CAN1_RX1_IRQHandler(void)
  710. {
  711. rt_interrupt_enter();
  712. _can_rx_isr(&drv_can1.device, CAN_RX_FIFO1);
  713. rt_interrupt_leave();
  714. }
  715. /**
  716. * @brief This function handles CAN1 SCE interrupts.
  717. */
  718. void CAN1_SCE_IRQHandler(void)
  719. {
  720. rt_uint32_t errtype;
  721. CAN_HandleTypeDef *hcan;
  722. hcan = &drv_can1.CanHandle;
  723. errtype = hcan->Instance->ESR;
  724. rt_interrupt_enter();
  725. HAL_CAN_IRQHandler(hcan);
  726. switch ((errtype & 0x70) >> 4)
  727. {
  728. case RT_CAN_BUS_BIT_PAD_ERR:
  729. drv_can1.device.status.bitpaderrcnt++;
  730. break;
  731. case RT_CAN_BUS_FORMAT_ERR:
  732. drv_can1.device.status.formaterrcnt++;
  733. break;
  734. case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
  735. drv_can1.device.status.ackerrcnt++;
  736. if (!READ_BIT(drv_can1.CanHandle.Instance->TSR, CAN_FLAG_TXOK0))
  737. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  738. else if (!READ_BIT(drv_can1.CanHandle.Instance->TSR, CAN_FLAG_TXOK1))
  739. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  740. else if (!READ_BIT(drv_can1.CanHandle.Instance->TSR, CAN_FLAG_TXOK2))
  741. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  742. break;
  743. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  744. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  745. drv_can1.device.status.biterrcnt++;
  746. break;
  747. case RT_CAN_BUS_CRC_ERR:
  748. drv_can1.device.status.crcerrcnt++;
  749. break;
  750. }
  751. drv_can1.device.status.lasterrtype = errtype & 0x70;
  752. drv_can1.device.status.rcverrcnt = errtype >> 24;
  753. drv_can1.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  754. drv_can1.device.status.errcode = errtype & 0x07;
  755. hcan->Instance->MSR |= CAN_MSR_ERRI;
  756. rt_interrupt_leave();
  757. }
  758. #endif /* BSP_USING_CAN1 */
  759. #ifdef BSP_USING_CAN2
  760. /**
  761. * @brief This function handles CAN2 TX interrupts.
  762. */
  763. void CAN2_TX_IRQHandler(void)
  764. {
  765. rt_interrupt_enter();
  766. CAN_HandleTypeDef *hcan;
  767. hcan = &drv_can2.CanHandle;
  768. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
  769. {
  770. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
  771. {
  772. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  773. }
  774. else
  775. {
  776. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  777. }
  778. /* Write 0 to Clear transmission status flag RQCPx */
  779. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
  780. }
  781. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
  782. {
  783. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
  784. {
  785. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | 1 << 8);
  786. }
  787. else
  788. {
  789. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  790. }
  791. /* Write 0 to Clear transmission status flag RQCPx */
  792. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
  793. }
  794. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
  795. {
  796. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
  797. {
  798. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | 2 << 8);
  799. }
  800. else
  801. {
  802. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  803. }
  804. /* Write 0 to Clear transmission status flag RQCPx */
  805. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
  806. }
  807. else
  808. {
  809. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  810. }
  811. rt_interrupt_leave();
  812. }
  813. /**
  814. * @brief This function handles CAN2 RX0 interrupts.
  815. */
  816. void CAN2_RX0_IRQHandler(void)
  817. {
  818. rt_interrupt_enter();
  819. _can_rx_isr(&drv_can2.device, CAN_RX_FIFO0);
  820. rt_interrupt_leave();
  821. }
  822. /**
  823. * @brief This function handles CAN2 RX1 interrupts.
  824. */
  825. void CAN2_RX1_IRQHandler(void)
  826. {
  827. rt_interrupt_enter();
  828. _can_rx_isr(&drv_can2.device, CAN_RX_FIFO1);
  829. rt_interrupt_leave();
  830. }
  831. /**
  832. * @brief This function handles CAN2 SCE interrupts.
  833. */
  834. void CAN2_SCE_IRQHandler(void)
  835. {
  836. rt_uint32_t errtype;
  837. CAN_HandleTypeDef *hcan;
  838. hcan = &drv_can2.CanHandle;
  839. errtype = hcan->Instance->ESR;
  840. rt_interrupt_enter();
  841. HAL_CAN_IRQHandler(hcan);
  842. switch ((errtype & 0x70) >> 4)
  843. {
  844. case RT_CAN_BUS_BIT_PAD_ERR:
  845. drv_can2.device.status.bitpaderrcnt++;
  846. break;
  847. case RT_CAN_BUS_FORMAT_ERR:
  848. drv_can2.device.status.formaterrcnt++;
  849. break;
  850. case RT_CAN_BUS_ACK_ERR:
  851. drv_can2.device.status.ackerrcnt++;
  852. if (!READ_BIT(drv_can2.CanHandle.Instance->TSR, CAN_FLAG_TXOK0))
  853. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  854. else if (!READ_BIT(drv_can2.CanHandle.Instance->TSR, CAN_FLAG_TXOK1))
  855. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  856. else if (!READ_BIT(drv_can2.CanHandle.Instance->TSR, CAN_FLAG_TXOK2))
  857. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  858. break;
  859. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  860. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  861. drv_can2.device.status.biterrcnt++;
  862. break;
  863. case RT_CAN_BUS_CRC_ERR:
  864. drv_can2.device.status.crcerrcnt++;
  865. break;
  866. }
  867. drv_can2.device.status.lasterrtype = errtype & 0x70;
  868. drv_can2.device.status.rcverrcnt = errtype >> 24;
  869. drv_can2.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  870. drv_can2.device.status.errcode = errtype & 0x07;
  871. hcan->Instance->MSR |= CAN_MSR_ERRI;
  872. rt_interrupt_leave();
  873. }
  874. #endif /* BSP_USING_CAN2 */
  875. /**
  876. * @brief Error CAN callback.
  877. * @param hcan pointer to a CAN_HandleTypeDef structure that contains
  878. * the configuration information for the specified CAN.
  879. * @retval None
  880. */
  881. void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
  882. {
  883. __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING |
  884. CAN_IT_ERROR_PASSIVE |
  885. CAN_IT_BUSOFF |
  886. CAN_IT_LAST_ERROR_CODE |
  887. CAN_IT_ERROR |
  888. CAN_IT_RX_FIFO0_MSG_PENDING |
  889. CAN_IT_RX_FIFO0_OVERRUN |
  890. CAN_IT_RX_FIFO0_FULL |
  891. CAN_IT_RX_FIFO1_MSG_PENDING |
  892. CAN_IT_RX_FIFO1_OVERRUN |
  893. CAN_IT_RX_FIFO1_FULL |
  894. CAN_IT_TX_MAILBOX_EMPTY);
  895. }
  896. int rt_hw_can_init(void)
  897. {
  898. struct can_configure config = CANDEFAULTCONFIG;
  899. config.privmode = RT_CAN_MODE_NOPRIV;
  900. config.ticks = 50;
  901. #ifdef RT_CAN_USING_HDR
  902. config.maxhdr = 14;
  903. #ifdef CAN2
  904. config.maxhdr = 28;
  905. #endif
  906. #endif
  907. /* config default filter */
  908. CAN_FilterTypeDef filterConf = {0};
  909. filterConf.FilterIdHigh = 0x0000;
  910. filterConf.FilterIdLow = 0x0000;
  911. filterConf.FilterMaskIdHigh = 0x0000;
  912. filterConf.FilterMaskIdLow = 0x0000;
  913. filterConf.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  914. filterConf.FilterBank = 0;
  915. filterConf.FilterMode = CAN_FILTERMODE_IDMASK;
  916. filterConf.FilterScale = CAN_FILTERSCALE_32BIT;
  917. filterConf.FilterActivation = ENABLE;
  918. filterConf.SlaveStartFilterBank = 14;
  919. #ifdef BSP_USING_CAN1
  920. filterConf.FilterBank = 0;
  921. drv_can1.FilterConfig = filterConf;
  922. drv_can1.device.config = config;
  923. /* register CAN1 device */
  924. rt_hw_can_register(&drv_can1.device,
  925. drv_can1.name,
  926. &_can_ops,
  927. &drv_can1);
  928. #endif /* BSP_USING_CAN1 */
  929. #ifdef BSP_USING_CAN2
  930. filterConf.FilterBank = filterConf.SlaveStartFilterBank;
  931. drv_can2.FilterConfig = filterConf;
  932. drv_can2.device.config = config;
  933. /* register CAN2 device */
  934. rt_hw_can_register(&drv_can2.device,
  935. drv_can2.name,
  936. &_can_ops,
  937. &drv_can2);
  938. #endif /* BSP_USING_CAN2 */
  939. return 0;
  940. }
  941. INIT_BOARD_EXPORT(rt_hw_can_init);
  942. #endif /* BSP_USING_CAN */
  943. /************************** end of file ******************/