drv_can.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  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. * 2019-11-09 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 es32f0_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 es32f0_can *drv_can;
  77. RT_ASSERT(can_device);
  78. RT_ASSERT(cfg);
  79. drv_can = (struct es32f0_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_LISEN:
  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_LOOPBACKANLISEN:
  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. // baud_index = get_can_baud_index(cfg->baud_rate);
  111. //drv_can->CanHandle.init.sjw = CAN_SJW_1;
  112. // drv_can->CanHandle.init.seg1 = CAN_SEG1_3;
  113. // drv_can->CanHandle.init.seg2 = CAN_SEG2_2;
  114. // drv_can->CanHandle.init.psc = can_baud_rate_tab[baud_index].config_data;
  115. /* init can */
  116. if (ald_can_init(&drv_can->CanHandle) != OK)
  117. {
  118. return -RT_ERROR;
  119. }
  120. /* default filter config */
  121. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  122. return RT_EOK;
  123. }
  124. static rt_err_t _can_control(struct rt_can_device *can_device, int cmd, void *arg)
  125. {
  126. rt_uint32_t argval;
  127. struct es32f0_can *drv_can;
  128. #ifdef RT_CAN_USING_HDR
  129. struct rt_can_filter_config *filter_cfg;
  130. #endif
  131. RT_ASSERT(can_device != RT_NULL);
  132. drv_can = (struct es32f0_can *)can_device->parent.user_data;
  133. RT_ASSERT(drv_can != RT_NULL);
  134. switch (cmd)
  135. {
  136. case RT_DEVICE_CTRL_CLR_INT:
  137. argval = (rt_uint32_t) arg;
  138. if (argval == RT_DEVICE_FLAG_INT_RX)
  139. {
  140. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, DISABLE);
  141. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, DISABLE);
  142. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, DISABLE);
  143. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, DISABLE);
  144. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, DISABLE);
  145. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, DISABLE);
  146. }
  147. else if (argval == RT_DEVICE_FLAG_INT_TX)
  148. {
  149. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, DISABLE);
  150. }
  151. else if (argval == RT_DEVICE_CAN_INT_ERR)
  152. {
  153. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, DISABLE);
  154. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, DISABLE);
  155. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, DISABLE);
  156. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, DISABLE);
  157. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, DISABLE);
  158. }
  159. break;
  160. case RT_DEVICE_CTRL_SET_INT:
  161. argval = (rt_uint32_t) arg;
  162. if (argval == RT_DEVICE_FLAG_INT_RX)
  163. {
  164. NVIC_SetPriority(CAN0_IRQn, 1);
  165. NVIC_EnableIRQ(CAN0_IRQn);
  166. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP0, ENABLE);
  167. // ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF0, ENABLE);
  168. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV0, ENABLE);
  169. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FP1, ENABLE);
  170. // ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FF1, ENABLE);
  171. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_FOV1, ENABLE);
  172. }
  173. else if (argval == RT_DEVICE_FLAG_INT_TX)
  174. {
  175. NVIC_SetPriority(CAN0_IRQn, 1);
  176. NVIC_EnableIRQ(CAN0_IRQn);
  177. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_TXM, ENABLE);
  178. }
  179. else if (argval == RT_DEVICE_CAN_INT_ERR)
  180. {
  181. NVIC_SetPriority(CAN0_IRQn, 1);
  182. NVIC_EnableIRQ(CAN0_IRQn);
  183. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_WARN, ENABLE);
  184. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PERR, ENABLE);
  185. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_BOF, ENABLE);
  186. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_PRERR, ENABLE);
  187. ald_can_interrupt_config(&drv_can->CanHandle, CAN_IT_ERR, ENABLE);
  188. }
  189. break;
  190. #ifdef RT_CAN_USING_HDR
  191. case RT_CAN_CMD_SET_FILTER:
  192. if (RT_NULL == arg)
  193. {
  194. /* default filter config */
  195. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  196. }
  197. else
  198. {
  199. filter_cfg = (struct rt_can_filter_config *)arg;
  200. /* get default filter */
  201. for (int i = 0; i < filter_cfg->count; i++)
  202. {
  203. /*默认过滤表判断*/
  204. if(filter_cfg->items[i].hdr < drv_can->device.config.maxhdr)
  205. drv_can->FilterConfig.number = filter_cfg->items[i].hdr;
  206. else
  207. drv_can->FilterConfig.number = ES_C_CAN_DEFAULT_FILTER_NUMBER;
  208. if(filter_cfg->items[i].mode)
  209. {
  210. /*标识符列表模式: 类型匹配 ,id匹配为:接收的id = 配置的id
  211. 或者 = 配置的mask ,通过*/
  212. /*扩展帧*/
  213. if(filter_cfg->items[i].ide)
  214. {
  215. // filter_cfg->items[i].id = filter_cfg->items[i].id ; /*id 29 位*/
  216. filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 3) |
  217. (filter_cfg->items[i].ide << 2) |
  218. (filter_cfg->items[i].rtr << 1));
  219. }
  220. else /*标准帧*/
  221. {
  222. filter_cfg->items[i].id = (filter_cfg->items[i].id << 18);
  223. filter_cfg->items[i].mask = ((filter_cfg->items[i].mask << 21) |
  224. (filter_cfg->items[i].ide << 2) |
  225. (filter_cfg->items[i].rtr << 1));
  226. }
  227. }
  228. else
  229. {
  230. /*标识符掩码模式*/
  231. /*扩展帧*/
  232. if(filter_cfg->items[i].ide)
  233. {
  234. filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<3;
  235. }
  236. else /*标准帧*/
  237. {
  238. filter_cfg->items[i].id = (filter_cfg->items[i].id)<<18;
  239. filter_cfg->items[i].mask = (filter_cfg->items[i].mask)<<21;
  240. }
  241. #if ES_C_CAN_FILTER_FRAME_TYPE
  242. /*匹配类型*/
  243. filter_cfg->items[i].mask |= 0x6;
  244. #endif
  245. }
  246. drv_can->FilterConfig.id_high = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  247. drv_can->FilterConfig.id_low = ((filter_cfg->items[i].id << 3) |
  248. (filter_cfg->items[i].ide << 2) |
  249. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  250. drv_can->FilterConfig.mask_id_high = (filter_cfg->items[i].mask >> 16) & 0xFFFF;
  251. drv_can->FilterConfig.mask_id_low = filter_cfg->items[i].mask & 0xFFFF;
  252. drv_can->FilterConfig.mode = (can_filter_mode_t)filter_cfg->items[i].mode;
  253. /* Filter conf */
  254. ald_can_filter_config(&drv_can->CanHandle, &drv_can->FilterConfig);
  255. }
  256. }
  257. break;
  258. #endif
  259. case RT_CAN_CMD_SET_MODE:
  260. argval = (rt_uint32_t) arg;
  261. if (argval != RT_CAN_MODE_NORMAL &&
  262. argval != RT_CAN_MODE_LISEN &&
  263. argval != RT_CAN_MODE_LOOPBACK &&
  264. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  265. {
  266. return -RT_ERROR;
  267. }
  268. if (argval != drv_can->device.config.mode)
  269. {
  270. drv_can->device.config.mode = argval;
  271. return _can_config(&drv_can->device, &drv_can->device.config);
  272. }
  273. break;
  274. case RT_CAN_CMD_SET_BAUD:
  275. argval = (rt_uint32_t) arg;
  276. if (argval != drv_can->device.config.baud_rate)
  277. {
  278. drv_can->device.config.baud_rate = argval;
  279. return _can_config(&drv_can->device, &drv_can->device.config);
  280. }
  281. break;
  282. case RT_CAN_CMD_SET_PRIV:
  283. argval = (rt_uint32_t) arg;
  284. if (argval != RT_CAN_MODE_PRIV &&
  285. argval != RT_CAN_MODE_NOPRIV)
  286. {
  287. return -RT_ERROR;
  288. }
  289. if (argval != drv_can->device.config.privmode)
  290. {
  291. drv_can->device.config.privmode = argval;
  292. return _can_config(&drv_can->device, &drv_can->device.config);
  293. }
  294. break;
  295. case RT_CAN_CMD_GET_STATUS:
  296. {
  297. rt_uint32_t errtype;
  298. errtype = drv_can->CanHandle.perh->ERRSTAT;
  299. drv_can->device.status.rcverrcnt = errtype >> 24;
  300. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  301. drv_can->device.status.lasterrtype = errtype & 0x70;
  302. drv_can->device.status.errcode = errtype & 0x07;
  303. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  304. }
  305. break;
  306. }
  307. return RT_EOK;
  308. }
  309. static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  310. {
  311. can_handle_t *h_can;
  312. h_can = &((struct es32f0_can *) can->parent.user_data)->CanHandle;
  313. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  314. can_tx_msg_t txheader = {0};
  315. can_state_t state = h_can->state;
  316. /* Check the parameters */
  317. RT_ASSERT(IS_CAN_DATA_LEN(pmsg->len));
  318. if ((state == CAN_STATE_READY) ||
  319. (state == CAN_STATE_BUSY_RX0))
  320. {
  321. /*check select mailbox is empty */
  322. switch (1 << box_num)
  323. {
  324. case CAN_TX_MAILBOX_0:
  325. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM0) != SET)
  326. {
  327. /* Change CAN state */
  328. h_can->state = CAN_STATE_ERROR;
  329. /* Return function status */
  330. return -RT_ERROR;
  331. }
  332. break;
  333. case CAN_TX_MAILBOX_1:
  334. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM1) != SET)
  335. {
  336. /* Change CAN state */
  337. h_can->state = CAN_STATE_ERROR;
  338. /* Return function status */
  339. return -RT_ERROR;
  340. }
  341. break;
  342. case CAN_TX_MAILBOX_2:
  343. if (ald_can_get_flag_status(h_can, CAN_FLAG_TXM2) != SET)
  344. {
  345. /* Change CAN state */
  346. h_can->state = CAN_STATE_ERROR;
  347. /* Return function status */
  348. return -RT_ERROR;
  349. }
  350. break;
  351. default:
  352. RT_ASSERT(0);
  353. break;
  354. }
  355. if (RT_CAN_STDID == pmsg->ide)
  356. {
  357. txheader.type = CAN_ID_STD;
  358. RT_ASSERT(IS_CAN_STDID(pmsg->id));
  359. txheader.std = pmsg->id;
  360. }
  361. else
  362. {
  363. txheader.type = CAN_ID_EXT;
  364. RT_ASSERT(IS_CAN_EXTID(pmsg->id));
  365. txheader.ext = pmsg->id;
  366. }
  367. if (RT_CAN_DTR == pmsg->rtr)
  368. {
  369. txheader.rtr = CAN_RTR_DATA;
  370. }
  371. else
  372. {
  373. txheader.rtr = CAN_RTR_REMOTE;
  374. }
  375. /* clear TIR */
  376. h_can->perh->TxMailBox[box_num].TXID &= CAN_TXID0_TXMREQ_MSK;
  377. /* Set up the Id */
  378. if (RT_CAN_STDID == pmsg->ide)
  379. {
  380. h_can->perh->TxMailBox[box_num].TXID |= (txheader.std << CAN_TXID0_STDID_POSS) | (txheader.rtr << CAN_TXID0_RTR_POS);
  381. }
  382. else
  383. {
  384. 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);
  385. }
  386. /* Set up the DLC */
  387. h_can->perh->TxMailBox[box_num].TXFCON = pmsg->len & 0x0FU;
  388. /* Set up the data field */
  389. WRITE_REG(h_can->perh->TxMailBox[box_num].TXDH,
  390. ((uint32_t)pmsg->data[7] << CAN_TXDH0_BYTE7_POSS) |
  391. ((uint32_t)pmsg->data[6] << CAN_TXDH0_BYTE6_POSS) |
  392. ((uint32_t)pmsg->data[5] << CAN_TXDH0_BYTE5_POSS) |
  393. ((uint32_t)pmsg->data[4] << CAN_TXDH0_BYTE4_POSS));
  394. WRITE_REG(h_can->perh->TxMailBox[box_num].TXDL,
  395. ((uint32_t)pmsg->data[3] << CAN_TXDL0_BYTE3_POSS) |
  396. ((uint32_t)pmsg->data[2] << CAN_TXDL0_BYTE2_POSS) |
  397. ((uint32_t)pmsg->data[1] << CAN_TXDL0_BYTE1_POSS) |
  398. ((uint32_t)pmsg->data[0] << CAN_TXDL0_BYTE0_POSS));
  399. /* Request transmission */
  400. SET_BIT(h_can->perh->TxMailBox[box_num].TXID, CAN_TXID0_TXMREQ_MSK);
  401. return RT_EOK;
  402. }
  403. else
  404. {
  405. /* Update error code */
  406. h_can->err |= 0x00040000U;
  407. return -RT_ERROR;
  408. }
  409. }
  410. static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  411. {
  412. can_handle_t *h_can;
  413. struct rt_can_msg *pmsg;
  414. can_rx_msg_t rxheader = {0};
  415. RT_ASSERT(can);
  416. h_can = &((struct es32f0_can *)can->parent.user_data)->CanHandle;
  417. pmsg = (struct rt_can_msg *) buf;
  418. /* get data */
  419. if (ald_can_recv(h_can, (can_rx_fifo_t)fifo, &rxheader, 0xFFFF) != OK)
  420. return -RT_ERROR;
  421. pmsg->data[0] = rxheader.data[0];
  422. pmsg->data[1] = rxheader.data[1];
  423. pmsg->data[2] = rxheader.data[2];
  424. pmsg->data[3] = rxheader.data[3];
  425. pmsg->data[4] = rxheader.data[4];
  426. pmsg->data[5] = rxheader.data[5];
  427. pmsg->data[6] = rxheader.data[6];
  428. pmsg->data[7] = rxheader.data[7];
  429. /* get id */
  430. if (CAN_ID_STD == rxheader.type)
  431. {
  432. pmsg->ide = RT_CAN_STDID;
  433. pmsg->id = rxheader.std;
  434. }
  435. else
  436. {
  437. pmsg->ide = RT_CAN_EXTID;
  438. pmsg->id = rxheader.ext;
  439. }
  440. /* get type */
  441. if (CAN_RTR_DATA == rxheader.rtr)
  442. {
  443. pmsg->rtr = RT_CAN_DTR;
  444. }
  445. else
  446. {
  447. pmsg->rtr = RT_CAN_RTR;
  448. }
  449. /* get len */
  450. pmsg->len = rxheader.len;
  451. /* get hdr */
  452. pmsg->hdr = (rxheader.fmi + 1) >> 1;
  453. return RT_EOK;
  454. }
  455. static const struct rt_can_ops _can_ops =
  456. {
  457. _can_config,
  458. _can_control,
  459. _can_sendmsg,
  460. _can_recvmsg,
  461. };
  462. static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
  463. {
  464. can_handle_t *h_can;
  465. RT_ASSERT(can);
  466. h_can = &((struct es32f0_can *) can->parent.user_data)->CanHandle;
  467. switch (fifo)
  468. {
  469. case CAN_RX_FIFO0:
  470. /* Check Overrun flag for FIFO0 */
  471. if (ald_can_get_flag_status(h_can, CAN_FLAG_FOV0) && ald_can_get_it_status(h_can, CAN_IT_FOV0))
  472. {
  473. /* Clear FIFO0 Overrun Flag */
  474. ald_can_clear_flag_status(h_can, CAN_FLAG_FOV0);
  475. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  476. }
  477. /* RX interrupt */
  478. else
  479. {
  480. if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO0) != 0)
  481. {
  482. /* save to user list */
  483. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  484. }
  485. /* Clear FIFO0 rx Flag */
  486. SET_BIT(h_can->perh->RXF0, CAN_RXF0_FREE_MSK);
  487. }
  488. break;
  489. case CAN_RX_FIFO1:
  490. /* Check Overrun flag for FIFO1 */
  491. if (ald_can_get_flag_status(h_can, CAN_FLAG_FOV1) && ald_can_get_it_status(h_can, CAN_IT_FOV1))
  492. {
  493. /* Clear FIFO1 Overrun Flag */
  494. ald_can_clear_flag_status(h_can, CAN_FLAG_FOV1);
  495. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  496. }
  497. /* RX interrupt */
  498. else
  499. {
  500. if(CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO1) != 0)
  501. {
  502. /* save to user list */
  503. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  504. }
  505. /* Clear FIFO0 rx Flag */
  506. SET_BIT(h_can->perh->RXF1, CAN_RXF1_FREE_MSK);
  507. }
  508. break;
  509. }
  510. }
  511. /**
  512. * @brief This function handles CAN interrupts.
  513. */
  514. void CAN0_Handler(void)
  515. {
  516. rt_interrupt_enter();
  517. rt_uint32_t errtype;
  518. can_handle_t *h_can;
  519. h_can = &can.CanHandle;
  520. /* RX FIFO0 interrupt */
  521. if ((ald_can_get_it_status(h_can, CAN_IT_FP0)) && (CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO0) != 0))
  522. {
  523. _can_rx_isr(&can.device, CAN_RX_FIFO0);
  524. }
  525. /* RX FIFO1 interrupt */
  526. if ((ald_can_get_it_status(h_can, CAN_IT_FP1)) && (CAN_RX_MSG_PENDING(h_can, CAN_RX_FIFO1) != 0))
  527. {
  528. _can_rx_isr(&can.device, CAN_RX_FIFO1);
  529. }
  530. /* TX interrupt. transmit fifo0/1/2 is empty can trigger this interrupt */
  531. if (ald_can_get_flag_status(h_can, CAN_FLAG_M0REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  532. {
  533. if (ald_can_get_flag_status(h_can, CAN_FLAG_M0TXC))
  534. {
  535. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 0 << 8);
  536. }
  537. else
  538. {
  539. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  540. }
  541. /* Clear transmission status flag M0REQC */
  542. ald_can_clear_flag_status(h_can, CAN_FLAG_M0REQC);
  543. }
  544. else if (ald_can_get_flag_status(h_can, CAN_FLAG_M1REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  545. {
  546. if (ald_can_get_flag_status(h_can, CAN_FLAG_M1TXC))
  547. {
  548. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 1 << 8);
  549. }
  550. else
  551. {
  552. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  553. }
  554. ald_can_clear_flag_status(h_can, CAN_FLAG_M1REQC);
  555. }
  556. else if (ald_can_get_flag_status(h_can, CAN_FLAG_M2REQC) && ald_can_get_it_status(h_can, CAN_IT_TXM))
  557. {
  558. if (ald_can_get_flag_status(h_can, CAN_FLAG_M2REQC))
  559. {
  560. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_DONE | 2 << 8);
  561. }
  562. else
  563. {
  564. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  565. }
  566. ald_can_clear_flag_status(h_can, CAN_FLAG_M2REQC);
  567. }
  568. /* CAN error interrupt */
  569. if (ald_can_get_flag_status(h_can, CAN_FLAG_ERR) && ald_can_get_it_status(h_can, CAN_IT_ERR))
  570. {
  571. errtype = h_can->perh->ERRSTAT;
  572. switch ((errtype & 0x70) >> 4)
  573. {
  574. case RT_CAN_BUS_BIT_PAD_ERR:
  575. can.device.status.bitpaderrcnt++;
  576. break;
  577. case RT_CAN_BUS_FORMAT_ERR:
  578. can.device.status.formaterrcnt++;
  579. break;
  580. case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
  581. can.device.status.ackerrcnt++;
  582. if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  583. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  584. else if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  585. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  586. else if (!READ_BIT(can.CanHandle.perh->TXSTAT, CAN_FLAG_M0TXC))
  587. rt_hw_can_isr(&can.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  588. break;
  589. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  590. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  591. can.device.status.biterrcnt++;
  592. break;
  593. case RT_CAN_BUS_CRC_ERR:
  594. can.device.status.crcerrcnt++;
  595. break;
  596. }
  597. can.device.status.lasterrtype = errtype & 0x70;
  598. can.device.status.rcverrcnt = errtype >> 24;
  599. can.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  600. can.device.status.errcode = errtype & 0x07;
  601. h_can->perh->IFC |= CAN_IFC_ERRIFC_MSK;
  602. }
  603. rt_interrupt_leave();
  604. }
  605. int rt_hw_can_init(void)
  606. {
  607. gpio_init_t h_gpio;
  608. /* Initialize can common pin */
  609. h_gpio.odos = GPIO_PUSH_PULL;
  610. h_gpio.pupd = GPIO_PUSH_UP;
  611. h_gpio.odrv = GPIO_OUT_DRIVE_NORMAL;
  612. h_gpio.flt = GPIO_FILTER_DISABLE;
  613. h_gpio.type = GPIO_TYPE_TTL;
  614. #if defined(ES_CAN0_RX_GPIO_FUNC)&&defined(ES_CAN0_RX_GPIO_PORT)&&defined(ES_CAN0_RX_GPIO_PIN)
  615. /* Initialize can rx pin */
  616. h_gpio.mode = GPIO_MODE_INPUT;
  617. h_gpio.func = ES_CAN0_RX_GPIO_FUNC;
  618. ald_gpio_init(ES_CAN0_RX_GPIO_PORT, ES_CAN0_RX_GPIO_PIN, &h_gpio);
  619. #endif
  620. #if defined(ES_CAN0_TX_GPIO_FUNC)&&defined(ES_CAN0_TX_GPIO_PORT)&&defined(ES_CAN0_TX_GPIO_PIN)
  621. /* Initialize can tx pin */
  622. h_gpio.mode = GPIO_MODE_OUTPUT;
  623. h_gpio.func = ES_CAN0_TX_GPIO_FUNC;
  624. ald_gpio_init(ES_CAN0_TX_GPIO_PORT, ES_CAN0_TX_GPIO_PIN, &h_gpio);
  625. #endif
  626. /* config default filter */
  627. can_filter_t filter = {0};
  628. filter.id_high = 0x0000;
  629. filter.id_low = 0x0000;
  630. filter.mask_id_high = 0x0000;
  631. filter.mask_id_low = 0x0000;
  632. filter.fifo = CAN_FILTER_FIFO0;
  633. filter.number = ES_C_CAN_DEFAULT_FILTER_NUMBER;
  634. filter.mode = CAN_FILTER_MODE_MASK;
  635. filter.scale = CAN_FILTER_SCALE_32;
  636. filter.active = ENABLE;
  637. can.FilterConfig = filter;
  638. can.device.config = (struct can_configure)ES_CAN0_CONFIG;
  639. #ifdef RT_CAN_USING_HDR
  640. can.device.config.maxhdr = 14;
  641. #endif
  642. can.device.config.privmode = RT_CAN_MODE_NOPRIV;
  643. can.device.config.ticks = 50;
  644. can.device.config.reserved = ES_CAN0_SJW;
  645. /* register CAN1 device */
  646. rt_hw_can_register(&can.device, ES_DEVICE_NAME_CAN0, &_can_ops, &can);
  647. return 0;
  648. }
  649. INIT_BOARD_EXPORT(rt_hw_can_init);
  650. #endif /* BSP_USING_CAN */