drv_can.c 34 KB

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