drv_can.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the License); you may
  7. * not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  14. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * Change Logs:
  19. * Date Author Notes
  20. * 2020-01-14 wangyq the first version
  21. * 2021-04-20 liuhy the second version
  22. */
  23. #include "drv_can.h"
  24. #ifdef RT_USING_CAN
  25. static struct es32f3_can can;
  26. static rt_uint32_t get_can_baud_index(rt_uint32_t baud,can_init_t * init)
  27. {
  28. /* attention !!! baud calculation example: Pclk / ((1 + seg1 + seg2) * psc) Pclk=48 / ((1 + seg1=3 + seg2=2) * 8) = 1MHz */
  29. double target,temp,min;
  30. uint32_t i,j,j_max,near = 0;
  31. target = (double)(ald_cmu_get_pclk1_clock());
  32. target/= baud; /*计算误差1*/
  33. min = 0xFFFFFFFF;
  34. for(i = 1 + 16 + 8 ;i > 2;i--) /*SYNC_SEG + SEG1 + SEG2*/
  35. {
  36. j_max = target/i/(0.98) + 1; /*缩小范围*/
  37. j_max = (j_max > 1024) ? (1024) : (j_max);
  38. for(j = target/i/1.02 ;j < j_max;j++)
  39. {
  40. temp = target/i/j; /*计算误差2*/
  41. temp = (temp > 1) ? (temp - 1) : (1 - temp);
  42. temp+= ((1.0 * i * j) / 0xFFFFFFFF) ;
  43. if(temp < min)
  44. {
  45. if(temp > 0.000001)
  46. {
  47. near = (i<<16) + j;
  48. min = temp;
  49. }
  50. else
  51. {
  52. init->seg1 = (can_seg1_t)((i - 1)*2/3-1);
  53. init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1);
  54. init->psc = j;
  55. return 0;
  56. }
  57. }
  58. }
  59. }
  60. if(min < 0.01)
  61. {
  62. i = near>>16;
  63. j = near % (1<<16);
  64. init->seg1 = (can_seg1_t)((i - 1)*2/3-1);
  65. init->seg2 = (can_seg2_t)(i - init->seg1 - 1 - 1 - 1);
  66. init->psc = j;
  67. return 0;
  68. }
  69. else
  70. {
  71. return 1;
  72. }
  73. }
  74. static rt_err_t _can_config(struct rt_can_device *can_device, struct can_configure *cfg)
  75. {
  76. struct es32f3_can *drv_can;
  77. RT_ASSERT(can_device);
  78. RT_ASSERT(cfg);
  79. drv_can = (struct es32f3_can *)can_device->parent.user_data;
  80. RT_ASSERT(drv_can);
  81. drv_can->CanHandle.perh = CAN0;
  82. drv_can->CanHandle.init.ttcm = DISABLE;
  83. drv_can->CanHandle.init.abom = ENABLE;
  84. drv_can->CanHandle.init.awk = DISABLE;
  85. drv_can->CanHandle.init.artx = (type_func_t)ES_CAN0_AUTO_BAN_RE_T;
  86. drv_can->CanHandle.init.rfom = DISABLE;
  87. drv_can->CanHandle.init.txmp = ENABLE;
  88. switch (cfg->mode)
  89. {
  90. case RT_CAN_MODE_NORMAL:
  91. drv_can->CanHandle.init.mode = CAN_MODE_NORMAL;
  92. break;
  93. case RT_CAN_MODE_LISTEN:
  94. drv_can->CanHandle.init.mode = CAN_MODE_SILENT;
  95. break;
  96. case RT_CAN_MODE_LOOPBACK:
  97. drv_can->CanHandle.init.mode = CAN_MODE_LOOPBACK;
  98. break;
  99. case RT_CAN_MODE_LOOPBACKANLISTEN:
  100. drv_can->CanHandle.init.mode = CAN_MODE_SILENT_LOOPBACK;
  101. break;
  102. }
  103. /*配置参数*/
  104. if(get_can_baud_index(cfg->baud_rate,&(drv_can->CanHandle.init)))
  105. {
  106. return -RT_ERROR;
  107. }
  108. drv_can->CanHandle.init.sjw = (can_sjw_t)(cfg->reserved);
  109. /* init can */
  110. if (ald_can_init(&drv_can->CanHandle) != OK)
  111. {
  112. return -RT_ERROR;
  113. }
  114. /* default filter config */
  115. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  116. return RT_EOK;
  117. }
  118. static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *arg)
  119. {
  120. rt_uint32_t argval;
  121. struct es32f3_can *drv_can;
  122. #ifdef RT_CAN_USING_HDR
  123. struct rt_can_filter_config *filter_cfg;
  124. #endif
  125. RT_ASSERT(can_device != RT_NULL);
  126. drv_can = (struct es32f3_can *)can_device->parent.user_data;
  127. RT_ASSERT(drv_can != RT_NULL);
  128. switch (cmd)
  129. {
  130. case RT_DEVICE_CTRL_CLR_INT:
  131. argval = (rt_uint32_t) arg;
  132. if (argval == RT_DEVICE_FLAG_INT_RX)
  133. {
  134. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, DISABLE);
  135. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, DISABLE);
  136. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, DISABLE);
  137. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, DISABLE);
  138. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, DISABLE);
  139. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, DISABLE);
  140. }
  141. else if (argval == RT_DEVICE_FLAG_INT_TX)
  142. {
  143. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, DISABLE);
  144. }
  145. else if (argval == RT_DEVICE_CAN_INT_ERR)
  146. {
  147. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, DISABLE);
  148. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, DISABLE);
  149. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, DISABLE);
  150. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, DISABLE);
  151. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, DISABLE);
  152. }
  153. break;
  154. case RT_DEVICE_CTRL_SET_INT:
  155. argval = (rt_uint32_t) arg;
  156. if (argval == RT_DEVICE_FLAG_INT_RX)
  157. {
  158. NVIC_SetPriority(CAN0_RX0_IRQn, 1);
  159. NVIC_EnableIRQ(CAN0_RX0_IRQn);
  160. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, ENABLE);
  161. // ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, ENABLE);
  162. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, ENABLE);
  163. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, ENABLE);
  164. // ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, ENABLE);
  165. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, ENABLE);
  166. }
  167. else if (argval == RT_DEVICE_FLAG_INT_TX)
  168. {
  169. NVIC_SetPriority(CAN0_TX_IRQn, 1);
  170. NVIC_EnableIRQ(CAN0_TX_IRQn);
  171. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, ENABLE);
  172. }
  173. else if (argval == RT_DEVICE_CAN_INT_ERR)
  174. {
  175. NVIC_SetPriority(CAN0_EXCEPTION_IRQn, 1);
  176. NVIC_EnableIRQ(CAN0_EXCEPTION_IRQn);
  177. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, ENABLE);
  178. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, ENABLE);
  179. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, ENABLE);
  180. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, ENABLE);
  181. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, ENABLE);
  182. }
  183. break;
  184. #ifdef RT_CAN_USING_HDR
  185. case RT_CAN_CMD_SET_FILTER:
  186. if (RT_NULL == arg)
  187. {
  188. /* default filter config */
  189. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  190. }
  191. else
  192. {
  193. filter_cfg = (struct rt_can_filter_config *)arg;
  194. /* get default filter */
  195. for (int i = 0; i < filter_cfg->count; i++)
  196. {
  197. /*默认过滤表判断*/
  198. if(filter_cfg->items[i].hdr_bank < drv_can->device.config.maxhdr)
  199. drv_can->FilterConfig.number = filter_cfg->items[i].hdr_bank;
  200. else
  201. drv_can->FilterConfig.number = ES_C_CAN_DEFAULT_FILTER_NUMBER;
  202. if(filter_cfg->items[i].mode)
  203. {
  204. /*标识符列表模式: 类型匹配 ,id匹配为:接收的id = 配置的id
  205. 或者 = 配置的mask ,通过*/
  206. /*扩展帧*/
  207. if(filter_cfg->items[i].ide)
  208. {
  209. // filter_cfg->items[i].id = filter_cfg->items[i].id ; /*id 29 位*/
  210. filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 3) |
  211. (filter_cfg->items[i].ide << 2) |
  212. (filter_cfg->items[i].rtr << 1));
  213. }
  214. else /*标准帧*/
  215. {
  216. filter_cfg->items[i].id = (filter_cfg->items[i].id << 18);
  217. filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 21) |
  218. (filter_cfg->items[i].ide << 2) |
  219. (filter_cfg->items[i].rtr << 1));
  220. }
  221. }
  222. else
  223. {
  224. /*标识符掩码模式*/
  225. /*扩展帧*/
  226. if(filter_cfg->items[i].ide)
  227. {
  228. filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<3;
  229. }
  230. else /*标准帧*/
  231. {
  232. filter_cfg->items[i].id = (filter_cfg->items[i].id)<<18;
  233. filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<21;
  234. }
  235. #if ES_C_CAN_FILTER_FRAME_TYPE
  236. /*匹配类型*/
  237. filter_cfg->items[i].mask |= 0x6;
  238. #endif
  239. }
  240. drv_can->FilterConfig.id_high = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  241. drv_can->FilterConfig.id_low = ((filter_cfg->items[i].id << 3) |
  242. (filter_cfg->items[i].ide << 2) |
  243. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  244. drv_can->FilterConfig.mask_id_high = (filter_cfg->items[i].mask >> 16) & 0xFFFF;
  245. drv_can->FilterConfig.mask_id_low = filter_cfg->items[i].mask & 0xFFFF;
  246. drv_can->FilterConfig.mode = (can_filter_mode_t)filter_cfg->items[i].mode;
  247. /* Filter conf */
  248. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  249. }
  250. }
  251. break;
  252. #endif
  253. case RT_CAN_CMD_SET_MODE:
  254. argval = (rt_uint32_t) arg;
  255. if (argval != RT_CAN_MODE_NORMAL &&
  256. argval != RT_CAN_MODE_LISTEN &&
  257. argval != RT_CAN_MODE_LOOPBACK &&
  258. argval != RT_CAN_MODE_LOOPBACKANLISTEN)
  259. {
  260. return -RT_ERROR;
  261. }
  262. if (argval != drv_can->device.config.mode)
  263. {
  264. drv_can->device.config.mode = argval;
  265. return _can_config(&drv_can->device, &drv_can->device.config);
  266. }
  267. break;
  268. case RT_CAN_CMD_SET_BAUD:
  269. argval = (rt_uint32_t) arg;
  270. if (argval != drv_can->device.config.baud_rate)
  271. {
  272. drv_can->device.config.baud_rate = argval;
  273. return _can_config(&drv_can->device, &drv_can->device.config);
  274. }
  275. break;
  276. case RT_CAN_CMD_SET_PRIV:
  277. argval = (rt_uint32_t) arg;
  278. if (argval != RT_CAN_MODE_PRIV &&
  279. argval != RT_CAN_MODE_NOPRIV)
  280. {
  281. return -RT_ERROR;
  282. }
  283. if (argval != drv_can->device.config.privmode)
  284. {
  285. drv_can->device.config.privmode = argval;
  286. return _can_config(&drv_can->device, &drv_can->device.config);
  287. }
  288. break;
  289. case RT_CAN_CMD_GET_STATUS:
  290. {
  291. rt_uint32_t errtype;
  292. errtype = drv_can->CanHandle.perh->ERRSTAT;
  293. drv_can->device.status.rcverrcnt = errtype >> 24;
  294. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  295. drv_can->device.status.lasterrtype = errtype & 0x70;
  296. drv_can->device.status.errcode = errtype & 0x07;
  297. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  298. }
  299. break;
  300. }
  301. return RT_EOK;
  302. }
  303. static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  304. {
  305. can_handle_t *h_can;
  306. h_can = &((struct es32f3_can *) can->parent.user_data)->CanHandle;
  307. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  308. can_tx_msg_t txheader = {0};
  309. can_state_t state = h_can->state;
  310. /* Check the parameters */
  311. RT_ASSERT(IS_CAN_DATA_LEN(pmsg->len));
  312. if ((state == CAN_STATE_READY) ||
  313. (state == CAN_STATE_BUSY_RX0))
  314. {
  315. /*check select mailbox is empty */
  316. switch (1 << box_num)
  317. {
  318. case CAN_TX_MAILBOX_0:
  319. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM0) != SET)
  320. {
  321. /* Change CAN state */
  322. h_can->state = CAN_STATE_ERROR;
  323. /* Return function status */
  324. return -RT_ERROR;
  325. }
  326. break;
  327. case CAN_TX_MAILBOX_1:
  328. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM1) != SET)
  329. {
  330. /* Change CAN state */
  331. h_can->state = CAN_STATE_ERROR;
  332. /* Return function status */
  333. return -RT_ERROR;
  334. }
  335. break;
  336. case CAN_TX_MAILBOX_2:
  337. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM2) != SET)
  338. {
  339. /* Change CAN state */
  340. h_can->state = CAN_STATE_ERROR;
  341. /* Return function status */
  342. return -RT_ERROR;
  343. }
  344. break;
  345. default:
  346. RT_ASSERT(0);
  347. break;
  348. }
  349. if (RT_CAN_STDID == pmsg->ide)
  350. {
  351. txheader.type = CAN_ID_STD;
  352. RT_ASSERT(IS_CAN_STDID(pmsg->id));
  353. txheader.std = pmsg->id;
  354. }
  355. else
  356. {
  357. txheader.type = CAN_ID_EXT;
  358. RT_ASSERT(IS_CAN_EXTID(pmsg->id));
  359. txheader.ext = pmsg->id;
  360. }
  361. if (RT_CAN_DTR == pmsg->rtr)
  362. {
  363. txheader.rtr = CAN_RTR_DATA;
  364. }
  365. else
  366. {
  367. txheader.rtr = CAN_RTR_REMOTE;
  368. }
  369. /* clear TIR */
  370. h_can->perh->TxMailBox[box_num].TXID &= CAN_TXID0_TXMREQ_MSK;
  371. /* Set up the Id */
  372. if (RT_CAN_STDID == pmsg->ide)
  373. {
  374. h_can->perh->TxMailBox[box_num].TXID |= (txheader.std << CAN_TXID0_STDID_POSS) | (txheader.rtr << CAN_TXID0_RTR_POS);
  375. }
  376. else
  377. {
  378. h_can->perh->TxMailBox[box_num].TXID |= (txheader.ext << CAN_TXID0_EXID_POSS) | (txheader.type << CAN_TXID0_IDE_POS) | (txheader.rtr << CAN_TXID0_RTR_POS);
  379. }
  380. /* Set up the DLC */
  381. h_can->perh->TxMailBox[box_num].TXFCON = pmsg->len & 0x0FU;
  382. /* Set up the data field */
  383. WRITE_REG(h_can->perh->TxMailBox[box_num].TXDH,
  384. ((uint32_t)pmsg->data[7] << CAN_TXDH0_BYTE7_POSS) |
  385. ((uint32_t)pmsg->data[6] << CAN_TXDH0_BYTE6_POSS) |
  386. ((uint32_t)pmsg->data[5] << CAN_TXDH0_BYTE5_POSS) |
  387. ((uint32_t)pmsg->data[4] << CAN_TXDH0_BYTE4_POSS));
  388. WRITE_REG(h_can->perh->TxMailBox[box_num].TXDL,
  389. ((uint32_t)pmsg->data[3] << CAN_TXDL0_BYTE3_POSS) |
  390. ((uint32_t)pmsg->data[2] << CAN_TXDL0_BYTE2_POSS) |
  391. ((uint32_t)pmsg->data[1] << CAN_TXDL0_BYTE1_POSS) |
  392. ((uint32_t)pmsg->data[0] << CAN_TXDL0_BYTE0_POSS));
  393. /* Request transmission */
  394. SET_BIT(h_can->perh->TxMailBox[box_num].TXID, CAN_TXID0_TXMREQ_MSK);
  395. return RT_EOK;
  396. }
  397. else
  398. {
  399. /* Update error code */
  400. h_can->err |= 0x00040000U;
  401. return -RT_ERROR;
  402. }
  403. }
  404. static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  405. {
  406. can_handle_t *h_can;
  407. struct rt_can_msg *pmsg;
  408. can_rx_msg_t rxheader = {0};
  409. RT_ASSERT(can);
  410. h_can = &((struct es32f3_can *)can->parent.user_data)->CanHandle;
  411. pmsg = (struct rt_can_msg *) buf;
  412. /* get data */
  413. if (ald_can_recv(h_can, (can_rx_fifo_t)fifo, &rxheader, 0xFFFF) != OK)
  414. return -RT_ERROR;
  415. pmsg->data[0] = rxheader.data[0];
  416. pmsg->data[1] = rxheader.data[1];
  417. pmsg->data[2] = rxheader.data[2];
  418. pmsg->data[3] = rxheader.data[3];
  419. pmsg->data[4] = rxheader.data[4];
  420. pmsg->data[5] = rxheader.data[5];
  421. pmsg->data[6] = rxheader.data[6];
  422. pmsg->data[7] = rxheader.data[7];
  423. /* get id */
  424. if (CAN_ID_STD == rxheader.type)
  425. {
  426. pmsg->ide = RT_CAN_STDID;
  427. pmsg->id = rxheader.std;
  428. }
  429. else
  430. {
  431. pmsg->ide = RT_CAN_EXTID;
  432. pmsg->id = rxheader.ext;
  433. }
  434. /* get type */
  435. if (CAN_RTR_DATA == rxheader.rtr)
  436. {
  437. pmsg->rtr = RT_CAN_DTR;
  438. }
  439. else
  440. {
  441. pmsg->rtr = RT_CAN_RTR;
  442. }
  443. /* get len */
  444. pmsg->len = rxheader.len;
  445. /* get hdr_index */
  446. pmsg->hdr_index = (rxheader.fmi + 1) >> 1;
  447. return RT_EOK;
  448. }
  449. static const struct rt_can_ops _can_ops =
  450. {
  451. _can_config,
  452. _can_control,
  453. _can_sendmsg,
  454. _can_recvmsg,
  455. };
  456. static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
  457. {
  458. can_handle_t *h_can;
  459. RT_ASSERT(can);
  460. h_can = &((struct es32f3_can *) can->parent.user_data)->CanHandle;
  461. switch (fifo)
  462. {
  463. case CAN_RX_FIFO0:
  464. /* Check Overrun flag for FIFO0 */
  465. if (ald_can_get_flag_status(h_can, CAN_FLAG_FOV0) && ald_can_get_it_status(h_can, CAN_IT_FOV0))
  466. {
  467. /* Clear FIFO0 Overrun Flag */
  468. ald_can_clear_flag_status(h_can, CAN_FLAG_FOV0);
  469. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  470. }
  471. /* RX interrupt */
  472. else
  473. {
  474. if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO0) != 0)
  475. {
  476. /* save to user list */
  477. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  478. }
  479. /* Clear FIFO0 rx Flag */
  480. SET_BIT(h_can->perh->RXF0, CAN_RXF0_FREE_MSK);
  481. }
  482. break;
  483. case CAN_RX_FIFO1:
  484. /* Check Overrun flag for FIFO1 */
  485. if (ald_can_get_flag_status(h_can, CAN_FLAG_FOV1) && ald_can_get_it_status(h_can, CAN_IT_FOV1))
  486. {
  487. /* Clear FIFO1 Overrun Flag */
  488. ald_can_clear_flag_status(h_can, CAN_FLAG_FOV1);
  489. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  490. }
  491. /* RX interrupt */
  492. else
  493. {
  494. if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO1) != 0)
  495. {
  496. /* save to user list */
  497. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  498. }
  499. /* Clear FIFO0 rx Flag */
  500. SET_BIT(h_can->perh->RXF1, CAN_RXF1_FREE_MSK);
  501. }
  502. break;
  503. }
  504. }
  505. /**
  506. * @brief This function handles CAN0 TX interrupts. transmit fifo0/1/2 is empty can trigger this interrupt
  507. */
  508. void CAN0_TX_Handler(void)
  509. {
  510. rt_interrupt_enter();
  511. can_handle_t *h_can;
  512. h_can = &can.CanHandle;
  513. /* TX interrupt. transmit fifo0/1/2 is empty can trigger this interrupt */
  514. if (ald_can_get_flag_status(h_can, CAN_FLAG_M0REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  515. {
  516. if (ald_can_get_flag_status(h_can, CAN_FLAG_M0TXC))
  517. {
  518. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  519. }
  520. else
  521. {
  522. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  523. }
  524. /* Clear transmission status flag M0REQC */
  525. ald_can_clear_flag_status(h_can, CAN_FLAG_M0REQC);
  526. }
  527. else if (ald_can_get_flag_status(h_can, CAN_FLAG_M1REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  528. {
  529. if (ald_can_get_flag_status(h_can, CAN_FLAG_M1TXC))
  530. {
  531. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 1 << 8);
  532. }
  533. else
  534. {
  535. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  536. }
  537. ald_can_clear_flag_status(h_can, CAN_FLAG_M1REQC);
  538. }
  539. else if (ald_can_get_flag_status(h_can, CAN_FLAG_M2REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  540. {
  541. if (ald_can_get_flag_status(h_can, CAN_FLAG_M2REQC))
  542. {
  543. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 2 << 8);
  544. }
  545. else
  546. {
  547. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  548. }
  549. ald_can_clear_flag_status(h_can, CAN_FLAG_M2REQC);
  550. }
  551. rt_interrupt_leave();
  552. }
  553. /**
  554. * @brief This function handles CAN0 RX0 interrupts.
  555. */
  556. void CAN0_RX0_Handler(void)
  557. {
  558. rt_interrupt_enter();
  559. _can_rx_isr(&can.device, CAN_RX_FIFO0);
  560. rt_interrupt_leave();
  561. }
  562. /**
  563. * @brief This function handles CAN0 RX1 interrupts.
  564. */
  565. void CAN0_RX1_Handler(void)
  566. {
  567. rt_interrupt_enter();
  568. _can_rx_isr(&can.device, CAN_RX_FIFO1);
  569. rt_interrupt_leave();
  570. }
  571. /**
  572. * @brief This function handles CAN interrupts.
  573. */
  574. void CAN0_EXCEPTION_Handler(void)
  575. {
  576. rt_interrupt_enter();
  577. rt_uint32_t errtype;
  578. can_handle_t *h_can;
  579. h_can = &can.CanHandle;
  580. errtype = h_can->perh->ERRSTAT;
  581. switch ((errtype & 0x70) >> 4)
  582. {
  583. case RT_CAN_BUS_BIT_PAD_ERR:
  584. can.device.status.bitpaderrcnt++;
  585. break;
  586. case RT_CAN_BUS_FORMAT_ERR:
  587. can.device.status.formaterrcnt++;
  588. break;
  589. case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
  590. can.device.status.ackerrcnt++;
  591. if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  592. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  593. else if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  594. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  595. else if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  596. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  597. break;
  598. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  599. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  600. can.device.status.biterrcnt++;
  601. break;
  602. case RT_CAN_BUS_CRC_ERR:
  603. can.device.status.crcerrcnt++;
  604. break;
  605. }
  606. can.device.status.lasterrtype = errtype & 0x70;
  607. can.device.status.rcverrcnt = errtype >> 24;
  608. can.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  609. can.device.status.errcode = errtype & 0x07;
  610. h_can->perh->IFC |= CAN_IFC_ERRIFC_MSK;
  611. rt_interrupt_leave();
  612. }
  613. int rt_hw_can_init(void)
  614. {
  615. gpio_init_t h_gpio;
  616. /* Initialize can common pin */
  617. h_gpio.odos = GPIO_PUSH_PULL;
  618. h_gpio.pupd = GPIO_PUSH_UP;
  619. h_gpio.podrv = GPIO_OUT_DRIVE_6;
  620. h_gpio.nodrv = GPIO_OUT_DRIVE_6;
  621. h_gpio.flt = GPIO_FILTER_DISABLE;
  622. h_gpio.type = GPIO_TYPE_TTL;
  623. #if defined(ES_CAN0_RX_GPIO_FUNC)&&defined(ES_CAN0_RX_GPIO_PORT)&&defined(ES_CAN0_RX_GPIO_PIN)
  624. /* Initialize can rx pin */
  625. h_gpio.mode = GPIO_MODE_INPUT;
  626. h_gpio.func = ES_CAN0_RX_GPIO_FUNC;
  627. ald_gpio_init(ES_CAN0_RX_GPIO_PORT, ES_CAN0_RX_GPIO_PIN, &h_gpio);
  628. #endif
  629. #if defined(ES_CAN0_TX_GPIO_FUNC)&&defined(ES_CAN0_TX_GPIO_PORT)&&defined(ES_CAN0_TX_GPIO_PIN)
  630. /* Initialize can tx pin */
  631. h_gpio.mode = GPIO_MODE_OUTPUT;
  632. h_gpio.func = ES_CAN0_TX_GPIO_FUNC;
  633. ald_gpio_init(ES_CAN0_TX_GPIO_PORT, ES_CAN0_TX_GPIO_PIN, &h_gpio);
  634. #endif
  635. /* config default filter */
  636. can_filter_t filter = {0};
  637. filter.id_high = 0x0000;
  638. filter.id_low = 0x0000;
  639. filter.mask_id_high = 0x0000;
  640. filter.mask_id_low = 0x0000;
  641. filter.fifo = CAN_FILTER_FIFO0;
  642. filter.number = ES_C_CAN_DEFAULT_FILTER_NUMBER;
  643. filter.mode = CAN_FILTER_MODE_MASK;
  644. filter.scale = CAN_FILTER_SCALE_32;
  645. filter.active = ENABLE;
  646. can.FilterConfig = filter;
  647. can.device.config = (struct can_configure)ES_CAN0_CONFIG;
  648. #ifdef RT_CAN_USING_HDR
  649. can.device.config.maxhdr = 14;
  650. #endif
  651. can.device.config.privmode = RT_CAN_MODE_NOPRIV;
  652. can.device.config.ticks = 50;
  653. can.device.config.reserved = ES_CAN0_SJW;
  654. /* register CAN1 device */
  655. rt_hw_can_register(&can.device, ES_DEVICE_NAME_CAN0, &_can_ops, &can);
  656. return 0;
  657. }
  658. INIT_BOARD_EXPORT(rt_hw_can_init);
  659. #endif /* BSP_USING_CAN */