drv_can.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/
  27. /**
  28. * @file drv_can.c
  29. * @author Nations
  30. * @version v1.0.0
  31. *
  32. * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  33. */
  34. #include <drv_can.h>
  35. #include "board.h"
  36. #ifdef RT_USING_CAN
  37. #if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2)
  38. /* this driver can be disabled at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable ADC */
  39. CanRxMessage RxMessage;
  40. #ifdef BSP_USING_CAN1
  41. static struct n32_can drv_can1 =
  42. {
  43. .name = "bxcan1",
  44. .CanHandle.Instance = CAN1,
  45. };
  46. #endif
  47. #ifdef BSP_USING_CAN2
  48. static struct n32_can drv_can2 =
  49. {
  50. .name = "bxcan2",
  51. .CanHandle.Instance = CAN2,
  52. };
  53. #endif
  54. static rt_err_t setfilter(struct n32_can *pbxcan, CAN_FilterInitType *pconfig)
  55. {
  56. CAN_FilterInitType CAN_FilterInitStruct;
  57. CAN_Module* CANx;
  58. CANx = pbxcan->CanHandle.Instance;
  59. CAN_FilterInitStruct.Filter_Num = pconfig->Filter_Num;
  60. CAN_FilterInitStruct.Filter_Mode = pconfig->Filter_Mode;
  61. CAN_FilterInitStruct.Filter_Scale = pconfig->Filter_Scale;
  62. CAN_FilterInitStruct.Filter_HighId = pconfig->Filter_HighId;
  63. CAN_FilterInitStruct.Filter_LowId = pconfig->Filter_LowId;
  64. CAN_FilterInitStruct.FilterMask_HighId = pconfig->FilterMask_HighId;;
  65. CAN_FilterInitStruct.FilterMask_LowId = pconfig->FilterMask_LowId;;
  66. CAN_FilterInitStruct.Filter_FIFOAssignment = pconfig->Filter_FIFOAssignment;;
  67. CAN_FilterInitStruct.Filter_Act = pconfig->Filter_Act;
  68. if(CANx == CAN1)
  69. {
  70. CAN1_InitFilter(&CAN_FilterInitStruct);
  71. }
  72. else
  73. {
  74. CAN2_InitFilter(&CAN_FilterInitStruct);
  75. }
  76. return RT_EOK;
  77. }
  78. static void bxcan_init(struct rt_can_device *can, struct can_configure *cfg)
  79. {
  80. CAN_InitType CAN_InitStructure;
  81. struct n32_can *drv_can;
  82. CAN_Module *pbxcan;
  83. drv_can = (struct n32_can *)can->parent.user_data;
  84. pbxcan = drv_can->CanHandle.Instance;
  85. uint32_t bps ;
  86. /* CAN register init */
  87. CAN_DeInit(pbxcan);
  88. /* Struct init*/
  89. CAN_InitStruct(&CAN_InitStructure);
  90. switch(cfg->baud_rate)
  91. {
  92. case CAN1MBaud:
  93. bps = CAN_BAUDRATE_1M;
  94. break;
  95. case CAN500kBaud:
  96. bps = CAN_BAUDRATE_500K;
  97. break;
  98. case CAN250kBaud:
  99. bps = CAN_BAUDRATE_250K;
  100. break;
  101. case CAN125kBaud:
  102. bps = CAN_BAUDRATE_125K;
  103. break;
  104. case CAN100kBaud:
  105. bps = CAN_BAUDRATE_100K;
  106. break;
  107. case CAN50kBaud:
  108. bps = CAN_BAUDRATE_50K;
  109. break;
  110. case CAN20kBaud:
  111. bps = CAN_BAUDRATE_20K;
  112. break;
  113. case CAN10kBaud:
  114. bps = CAN_BAUDRATE_10K;
  115. break;
  116. default:
  117. bps = CAN_BAUDRATE_100K;
  118. break;
  119. }
  120. CAN_InitStructure.BaudRatePrescaler = (uint32_t)(CAN_BTR_CALCULATE / bps);
  121. switch (cfg->mode)
  122. {
  123. case RT_CAN_MODE_NORMAL:
  124. CAN_InitStructure.OperatingMode = CAN_Normal_Mode;
  125. break;
  126. case RT_CAN_MODE_LISEN:
  127. CAN_InitStructure.OperatingMode = CAN_Silent_Mode;
  128. break;
  129. case RT_CAN_MODE_LOOPBACK:
  130. CAN_InitStructure.OperatingMode = CAN_LoopBack_Mode;
  131. break;
  132. case RT_CAN_MODE_LOOPBACKANLISEN:
  133. CAN_InitStructure.OperatingMode = CAN_Silent_LoopBack_Mode;
  134. break;
  135. default:
  136. CAN_InitStructure.OperatingMode = CAN_Normal_Mode;
  137. break;
  138. }
  139. CAN_InitStructure.TTCM = DISABLE;
  140. CAN_InitStructure.ABOM = DISABLE;
  141. CAN_InitStructure.AWKUM = DISABLE;
  142. CAN_InitStructure.NART = DISABLE;
  143. CAN_InitStructure.RFLM = DISABLE;
  144. CAN_InitStructure.TXFP = ENABLE;
  145. CAN_InitStructure.RSJW = CAN_RSJW_1tq;
  146. CAN_InitStructure.TBS1 = CAN_TBS1_3tq;
  147. CAN_InitStructure.TBS2 = CAN_TBS2_2tq;
  148. /*Initializes the CAN */
  149. CAN_Init(pbxcan, &CAN_InitStructure);
  150. /* CAN filter init */
  151. setfilter(drv_can, &drv_can->FilterConfig);
  152. }
  153. #ifdef BSP_USING_CAN1
  154. static void bxcan1_hw_init(void)
  155. {
  156. /* Enable CAN1 reset state */
  157. RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN1, ENABLE);
  158. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
  159. GPIOInit(GPIOD, GPIO_Mode_IPU, GPIO_Speed_50MHz, GPIO_PIN_8);
  160. GPIOInit(GPIOD, GPIO_Mode_AF_PP, GPIO_Speed_50MHz, GPIO_PIN_9);
  161. /* Remap CAN1 GPIOs */
  162. GPIO_ConfigPinRemap(GPIO_RMP1_CAN1, ENABLE);
  163. }
  164. #endif
  165. #ifdef BSP_USING_CAN2
  166. static void bxcan2_hw_init(void)
  167. {
  168. /* Enable CAN2 reset state */
  169. RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN2, ENABLE);
  170. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
  171. GPIOInit(GPIOB, GPIO_Mode_IPU, GPIO_Speed_50MHz, GPIO_PIN_12);
  172. GPIOInit(GPIOB, GPIO_Mode_AF_PP, GPIO_Speed_50MHz, GPIO_PIN_13);
  173. }
  174. #endif
  175. static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
  176. {
  177. struct n32_can *drv_can;
  178. CAN_Module *pbxcan;
  179. drv_can = (struct n32_can *)can->parent.user_data;
  180. pbxcan = drv_can->CanHandle.Instance;
  181. if (pbxcan == CAN1)
  182. {
  183. #ifdef BSP_USING_CAN1
  184. bxcan1_hw_init();
  185. bxcan_init(&drv_can->device, &drv_can->device.config);
  186. #endif
  187. }
  188. else if (pbxcan == CAN2)
  189. {
  190. #ifdef BSP_USING_CAN2
  191. bxcan2_hw_init();
  192. bxcan_init(&drv_can->device, &drv_can->device.config);
  193. #endif
  194. }
  195. return RT_EOK;
  196. }
  197. /**
  198. * @brief Configures the NVIC for CAN.
  199. */
  200. void CAN_NVIC_Config(IRQn_Type IRQn, uint8_t PreemptionPriority, uint8_t SubPriority,FunctionalState cmd)
  201. {
  202. NVIC_InitType NVIC_InitStructure;
  203. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  204. NVIC_InitStructure.NVIC_IRQChannel = IRQn;
  205. NVIC_InitStructure.NVIC_IRQChannelCmd = cmd;
  206. if(cmd)
  207. {
  208. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
  209. NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
  210. }
  211. NVIC_Init(&NVIC_InitStructure);
  212. }
  213. static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
  214. {
  215. rt_uint32_t argval;
  216. struct n32_can *drv_can;
  217. struct rt_can_filter_config *filter_cfg;
  218. RT_ASSERT(can != RT_NULL);
  219. drv_can = (struct n32_can *)can->parent.user_data;
  220. RT_ASSERT(drv_can != RT_NULL);
  221. switch (cmd)
  222. {
  223. case RT_DEVICE_CTRL_CLR_INT:
  224. argval = (rt_uint32_t) arg;
  225. if (argval == RT_DEVICE_FLAG_INT_RX)
  226. {
  227. if (CAN1 == drv_can->CanHandle.Instance)
  228. {
  229. CAN_NVIC_Config(USB_LP_CAN1_RX0_IRQn, 1, 0, ENABLE);
  230. CAN_NVIC_Config(CAN1_RX1_IRQn, 1, 0, ENABLE);
  231. }
  232. #ifdef CAN2
  233. if (CAN2 == drv_can->CanHandle.Instance)
  234. {
  235. CAN_NVIC_Config(CAN2_RX0_IRQn, 0, 0, DISABLE);
  236. CAN_NVIC_Config(CAN2_RX1_IRQn, 0, 0, DISABLE);
  237. }
  238. #endif
  239. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FMP0, DISABLE);
  240. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FF0, DISABLE);
  241. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FOV0, DISABLE);
  242. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FMP1, DISABLE);
  243. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FF1, DISABLE);
  244. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FOV1, DISABLE);
  245. }
  246. else if (argval == RT_DEVICE_FLAG_INT_TX)
  247. {
  248. if (CAN1 == drv_can->CanHandle.Instance)
  249. {
  250. CAN_NVIC_Config(USB_HP_CAN1_TX_IRQn, 0, 0, DISABLE);
  251. }
  252. #ifdef CAN2
  253. if (CAN2 == drv_can->CanHandle.Instance)
  254. {
  255. CAN_NVIC_Config(CAN2_TX_IRQn, 0, 0, DISABLE);
  256. }
  257. #endif
  258. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_TME, DISABLE);
  259. }
  260. else if (argval == RT_DEVICE_CAN_INT_ERR)
  261. {
  262. if (CAN1 == drv_can->CanHandle.Instance)
  263. {
  264. CAN_NVIC_Config(CAN1_SCE_IRQn, 0, 0, DISABLE);
  265. }
  266. #ifdef CAN2
  267. if (CAN2 == drv_can->CanHandle.Instance)
  268. {
  269. CAN_NVIC_Config(CAN2_SCE_IRQn, 0, 0, DISABLE);
  270. }
  271. #endif
  272. CAN_ClearFlag(drv_can->CanHandle.Instance, CAN_FLAG_EWGFL);
  273. CAN_ClearFlag(drv_can->CanHandle.Instance, CAN_FLAG_EPVFL);
  274. CAN_ClearFlag(drv_can->CanHandle.Instance, CAN_FLAG_BOFFL);
  275. CAN_ClearFlag(drv_can->CanHandle.Instance, CAN_FLAG_LEC);
  276. CAN_ClearINTPendingBit(drv_can->CanHandle.Instance, CAN_INT_ERR);
  277. }
  278. break;
  279. case RT_DEVICE_CTRL_SET_INT:
  280. argval = (rt_uint32_t) arg;
  281. if (argval == RT_DEVICE_FLAG_INT_RX)
  282. {
  283. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FMP0, ENABLE);
  284. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FF0, ENABLE);
  285. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FOV0, ENABLE);
  286. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FMP1, ENABLE);
  287. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FF1, ENABLE);
  288. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_FOV1, ENABLE);
  289. if (CAN1 == drv_can->CanHandle.Instance)
  290. {
  291. CAN_NVIC_Config(USB_LP_CAN1_RX0_IRQn, 1, 0, ENABLE);
  292. CAN_NVIC_Config(CAN1_RX1_IRQn, 1, 0, ENABLE);
  293. }
  294. #ifdef CAN2
  295. if (CAN2 == drv_can->CanHandle.Instance)
  296. {
  297. CAN_NVIC_Config(CAN2_RX0_IRQn, 1, 0, ENABLE);
  298. CAN_NVIC_Config(CAN2_RX1_IRQn, 1, 0, ENABLE);
  299. }
  300. #endif
  301. }
  302. else if (argval == RT_DEVICE_FLAG_INT_TX)
  303. {
  304. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_TME, ENABLE);
  305. if (CAN1 == drv_can->CanHandle.Instance)
  306. {
  307. CAN_NVIC_Config(USB_HP_CAN1_TX_IRQn, 1, 0, ENABLE);
  308. }
  309. #ifdef CAN2
  310. if (CAN2 == drv_can->CanHandle.Instance)
  311. {
  312. CAN_NVIC_Config(CAN2_TX_IRQn, 1, 0, ENABLE);
  313. }
  314. #endif
  315. }
  316. else if (argval == RT_DEVICE_CAN_INT_ERR)
  317. {
  318. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_EWG, ENABLE);
  319. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_EPV, ENABLE);
  320. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_BOF, ENABLE);
  321. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_LEC, ENABLE);
  322. CAN_INTConfig(drv_can->CanHandle.Instance, CAN_INT_ERR, ENABLE);
  323. if (CAN1 == drv_can->CanHandle.Instance)
  324. {
  325. CAN_NVIC_Config(CAN1_SCE_IRQn, 1, 0, ENABLE);
  326. }
  327. #ifdef CAN2
  328. if (CAN2 == drv_can->CanHandle.Instance)
  329. {
  330. CAN_NVIC_Config(CAN2_SCE_IRQn, 1, 0, ENABLE);
  331. }
  332. #endif
  333. }
  334. break;
  335. case RT_CAN_CMD_SET_FILTER:
  336. if (RT_NULL == arg)
  337. {
  338. /* default filter config */
  339. setfilter(drv_can, &drv_can->FilterConfig);
  340. }
  341. else
  342. {
  343. filter_cfg = (struct rt_can_filter_config *)arg;
  344. /* get default filter */
  345. for (int i = 0; i < filter_cfg->count; i++)
  346. {
  347. drv_can->FilterConfig.Filter_Num = filter_cfg->items[i].hdr;
  348. drv_can->FilterConfig.Filter_HighId = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  349. drv_can->FilterConfig.Filter_LowId = ((filter_cfg->items[i].id << 3) |
  350. (filter_cfg->items[i].ide << 2) |
  351. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  352. drv_can->FilterConfig.FilterMask_HighId = (filter_cfg->items[i].mask >> 16) & 0xFFFF;
  353. drv_can->FilterConfig.FilterMask_LowId = filter_cfg->items[i].mask & 0xFFFF;
  354. drv_can->FilterConfig.Filter_Mode = filter_cfg->items[i].mode;
  355. /* Filter conf */
  356. setfilter(drv_can, &drv_can->FilterConfig);
  357. }
  358. }
  359. break;
  360. case RT_CAN_CMD_SET_MODE:
  361. argval = (rt_uint32_t) arg;
  362. if (argval != RT_CAN_MODE_NORMAL &&
  363. argval != RT_CAN_MODE_LISEN &&
  364. argval != RT_CAN_MODE_LOOPBACK &&
  365. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  366. {
  367. return -RT_ERROR;
  368. }
  369. if (argval != drv_can->device.config.mode)
  370. {
  371. drv_can->device.config.mode = argval;
  372. return configure(&drv_can->device, &drv_can->device.config);
  373. }
  374. break;
  375. case RT_CAN_CMD_SET_BAUD:
  376. argval = (rt_uint32_t) arg;
  377. if (argval != CAN1MBaud &&
  378. argval != CAN500kBaud &&
  379. argval != CAN250kBaud &&
  380. argval != CAN125kBaud &&
  381. argval != CAN100kBaud &&
  382. argval != CAN50kBaud &&
  383. argval != CAN20kBaud &&
  384. argval != CAN10kBaud)
  385. {
  386. return -RT_ERROR;
  387. }
  388. if (argval != drv_can->device.config.baud_rate)
  389. {
  390. drv_can->device.config.baud_rate = argval;
  391. return configure(&drv_can->device, &drv_can->device.config);
  392. }
  393. break;
  394. case RT_CAN_CMD_SET_PRIV:
  395. argval = (rt_uint32_t) arg;
  396. if (argval != RT_CAN_MODE_PRIV &&
  397. argval != RT_CAN_MODE_NOPRIV)
  398. {
  399. return -RT_ERROR;
  400. }
  401. if (argval != drv_can->device.config.privmode)
  402. {
  403. drv_can->device.config.privmode = argval;
  404. return configure(&drv_can->device, &drv_can->device.config);
  405. }
  406. break;
  407. case RT_CAN_CMD_GET_STATUS:
  408. {
  409. rt_uint32_t errtype;
  410. errtype = drv_can->CanHandle.Instance->ESTS;
  411. drv_can->device.status.rcverrcnt = errtype >> 24;
  412. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  413. drv_can->device.status.lasterrtype = errtype & 0x70;
  414. drv_can->device.status.errcode = errtype & 0x07;
  415. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  416. }
  417. break;
  418. }
  419. return RT_EOK;
  420. }
  421. static int sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
  422. {
  423. CAN_Module *pbxcan;
  424. CanTxMessage TxMessage;
  425. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  426. int i;
  427. pbxcan = ((struct n32_can *) can->parent.user_data)->CanHandle.Instance;
  428. if(pmsg->ide)
  429. {
  430. TxMessage.ExtId = pmsg->id;
  431. TxMessage.StdId = 0;
  432. }
  433. else
  434. {
  435. TxMessage.StdId = pmsg->id;
  436. TxMessage.ExtId = 0;
  437. }
  438. TxMessage.RTR = pmsg->rtr;
  439. TxMessage.IDE = pmsg->ide;
  440. TxMessage.DLC = pmsg->len;
  441. for( i=0; i<TxMessage.DLC ;i++)
  442. {
  443. TxMessage.Data[i] = pmsg->data[i];
  444. }
  445. CAN_TransmitMessage(pbxcan, &TxMessage);
  446. return RT_EOK;
  447. }
  448. static int recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
  449. {
  450. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  451. int i;
  452. pmsg->ide = (rt_uint32_t) RxMessage.IDE;
  453. if(RxMessage.IDE == 1)
  454. pmsg->id = RxMessage.ExtId;
  455. else
  456. pmsg->id = RxMessage.StdId;
  457. pmsg->len = RxMessage.DLC;
  458. pmsg->rtr = RxMessage.RTR;
  459. pmsg->hdr = 0;
  460. for(i= 0;i< RxMessage.DLC; i++)
  461. {
  462. pmsg->data[i] = RxMessage.Data[i];
  463. }
  464. return RT_EOK;
  465. }
  466. static const struct rt_can_ops canops =
  467. {
  468. configure,
  469. control,
  470. sendmsg,
  471. recvmsg,
  472. };
  473. #ifdef BSP_USING_CAN1
  474. struct rt_can_device bxcan1;
  475. void n32_can1_irqhandler(void *param)
  476. {
  477. CAN_Module* CANx;
  478. CANx = CAN1;
  479. /* receive data interrupt */
  480. if (CAN_GetIntStatus(CANx, CAN_INT_FMP0))
  481. {
  482. CAN_ReceiveMessage(CANx, CAN_FIFO0, &RxMessage);
  483. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_RX_IND);
  484. CAN_ClearINTPendingBit(CANx, CAN_INT_FMP0);
  485. rt_kprintf("\r\nCan1 int RX happened!\r\n");
  486. }
  487. /* send data interrupt */
  488. else if (CAN_GetFlagSTS(CANx, CAN_FLAG_RQCPM0))
  489. {
  490. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  491. CAN_ClearFlag(CANx, CAN_FLAG_RQCPM0);
  492. }
  493. /* data overflow interrupt */
  494. else if (CAN_GetIntStatus(CANx, CAN_INT_FOV0))
  495. {
  496. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_RXOF_IND);
  497. rt_kprintf("\r\nCan1 int RX OF happened!\r\n");
  498. }
  499. }
  500. void USB_HP_CAN1_TX_IRQHandler(void)
  501. {
  502. /* enter interrupt */
  503. rt_interrupt_enter();
  504. n32_can1_irqhandler(&drv_can1.device);
  505. /* leave interrupt */
  506. rt_interrupt_leave();
  507. }
  508. void USB_LP_CAN1_RX0_IRQHandler(void)
  509. {
  510. /* enter interrupt */
  511. rt_interrupt_enter();
  512. n32_can1_irqhandler(&drv_can1.device);
  513. /* leave interrupt */
  514. rt_interrupt_leave();
  515. }
  516. #endif /*BSP_USING_CAN1*/
  517. #ifdef BSP_USING_CAN2
  518. struct rt_can_device bxcan2;
  519. void n32_can2_irqhandler(void *param)
  520. {
  521. CAN_Module* CANx;
  522. CANx = CAN2;
  523. /* receive data interrupt */
  524. if (CAN_GetIntStatus(CANx, CAN_INT_FMP0))
  525. {
  526. CAN_ReceiveMessage(CANx, CAN_FIFO0, &RxMessage);
  527. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_RX_IND);
  528. CAN_ClearINTPendingBit(CANx, CAN_INT_FMP0);
  529. rt_kprintf("\r\nCan2 int RX happened!\r\n");
  530. }
  531. /* send data interrupt */
  532. else if (CAN_GetFlagSTS(CANx, CAN_FLAG_RQCPM0))
  533. {
  534. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  535. CAN_ClearFlag(CANx, CAN_FLAG_RQCPM0);
  536. }
  537. /* data overflow interrupt */
  538. else if (CAN_GetIntStatus(CANx, CAN_INT_FOV0))
  539. {
  540. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_RXOF_IND);
  541. rt_kprintf("\r\nCan2 int RX OF happened!\r\n");
  542. }
  543. }
  544. void CAN2_TX_IRQHandler(void)
  545. {
  546. /* enter interrupt */
  547. rt_interrupt_enter();
  548. n32_can2_irqhandler(&drv_can2.device);
  549. /* leave interrupt */
  550. rt_interrupt_leave();
  551. }
  552. void CAN2_RX0_IRQHandler(void)
  553. {
  554. /* enter interrupt */
  555. rt_interrupt_enter();
  556. n32_can2_irqhandler(&drv_can2.device);
  557. /* leave interrupt */
  558. rt_interrupt_leave();
  559. }
  560. #endif /*BSP_USING_CAN2*/
  561. #define CANCONFIG \
  562. {\
  563. CAN500kBaud,\
  564. RT_CANMSG_BOX_SZ,\
  565. RT_CANSND_BOX_NUM,\
  566. RT_CAN_MODE_LOOPBACK,\
  567. };
  568. int rt_hw_can_init(void)
  569. {
  570. struct can_configure config = CANCONFIG;
  571. config.privmode = RT_CAN_MODE_NOPRIV;
  572. config.ticks = 50;
  573. #ifdef RT_CAN_USING_HDR
  574. config.maxhdr = 14;
  575. #ifdef CAN2
  576. config.maxhdr = 28;
  577. #endif
  578. #endif
  579. /* config default filter */
  580. CAN_FilterInitType filterConf = {0};
  581. filterConf.Filter_HighId = 0x0000;
  582. filterConf.Filter_LowId = 0x0000;
  583. filterConf.FilterMask_HighId = 0x0000;
  584. filterConf.FilterMask_LowId = 0x0000;
  585. filterConf.Filter_FIFOAssignment = CAN_FIFO0;
  586. filterConf.Filter_Num = CAN_FILTERNUM0;
  587. filterConf.Filter_Mode = CAN_Filter_IdMaskMode;
  588. filterConf.Filter_Scale = CAN_Filter_32bitScale;
  589. filterConf.Filter_Act = ENABLE;
  590. #ifdef BSP_USING_CAN1
  591. filterConf.Filter_Num = 0;
  592. drv_can1.FilterConfig = filterConf;
  593. drv_can1.device.config = config;
  594. /* register CAN1 device */
  595. rt_hw_can_register(&drv_can1.device,
  596. drv_can1.name,
  597. &canops,
  598. &drv_can1);
  599. #endif /* BSP_USING_CAN1 */
  600. #ifdef BSP_USING_CAN2
  601. filterConf.Filter_Num = 0;
  602. drv_can2.FilterConfig = filterConf;
  603. drv_can2.device.config = config;
  604. /* register CAN2 device */
  605. rt_hw_can_register(&drv_can2.device,
  606. drv_can2.name,
  607. &canops,
  608. &drv_can2);
  609. #endif /* BSP_USING_CAN2 */
  610. return 0;
  611. }
  612. INIT_BOARD_EXPORT(rt_hw_can_init);
  613. #endif /* defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) */
  614. #endif /*RT_USING_CAN*/