drv_can.c 27 KB

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