bxcan.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662
  1. /*
  2. * File : bxcan.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2015, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2015-05-14 aubrcool@qq.com first version
  13. */
  14. #include <rthw.h>
  15. #include <rtdevice.h>
  16. #include <board.h>
  17. #include <bxcan.h>
  18. #if (defined (STM32F10X_LD_VL)) || (defined (STM32F10X_MD_VL)) || (defined (STM32F10X_HD_VL))
  19. #undef RT_USING_CAN
  20. #endif
  21. #ifdef RT_USING_CAN
  22. #ifndef STM32F10X_CL
  23. #define BX_CAN_FMRNUMBER 14
  24. #define BX_CAN2_FMRSTART 7
  25. #else
  26. #define BX_CAN_FMRNUMBER 28
  27. #define BX_CAN2_FMRSTART 14
  28. #endif
  29. #if (defined (STM32F10X_LD)) || (defined (STM32F10X_MD)) || (defined (STM32F10X_HD)) || (defined (STM32F10X_XL))
  30. #undef USING_BXCAN2
  31. #define CAN1_RX0_IRQn USB_LP_CAN1_RX0_IRQn
  32. #define CAN1_TX_IRQn USB_HP_CAN1_TX_IRQn
  33. #endif
  34. #define BX_CAN_MAX_FILTERS (BX_CAN_FMRNUMBER * 4)
  35. #define BX_CAN_MAX_FILTER_MASKS BX_CAN_MAX_FILTERS
  36. #define BX_CAN_FILTER_MAX_ARRAY_SIZE ((BX_CAN_MAX_FILTERS + 32 - 1) / 32)
  37. struct stm_bxcanfiltermap
  38. {
  39. rt_uint32_t id32mask_cnt;
  40. rt_uint32_t id32bit_cnt;
  41. rt_uint32_t id16mask_cnt;
  42. rt_uint32_t id16bit_cnt;
  43. };
  44. struct stm_bxcanfilter_masks
  45. {
  46. rt_uint32_t id32maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  47. rt_uint32_t id32bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  48. rt_uint32_t id16maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  49. rt_uint32_t id16bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  50. rt_uint32_t id32maskshift[2];
  51. rt_uint32_t id32bitshift[2];
  52. rt_uint32_t id16maskshift[2];
  53. rt_uint32_t id16bitshift[2];
  54. };
  55. struct stm_bxcan
  56. {
  57. CAN_TypeDef *reg;
  58. void *mfrbase;
  59. IRQn_Type sndirq;
  60. IRQn_Type rcvirq0;
  61. IRQn_Type rcvirq1;
  62. IRQn_Type errirq;
  63. struct stm_bxcanfilter_masks filtermask;
  64. rt_uint32_t alocmask[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  65. const rt_uint32_t filtercnt;
  66. const rt_uint32_t fifo1filteroff;
  67. const struct stm_bxcanfiltermap filtermap[2];
  68. };
  69. struct stm_baud_rate_tab
  70. {
  71. rt_uint32_t baud_rate;
  72. rt_uint32_t confdata;
  73. };
  74. static void calcfiltermasks(struct stm_bxcan *pbxcan);
  75. static void bxcan1_filter_init(struct rt_can_device *can)
  76. {
  77. rt_uint32_t i;
  78. rt_uint32_t mask;
  79. struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
  80. for (i = 0; i < BX_CAN2_FMRSTART; i++)
  81. {
  82. CAN1->FMR |= FMR_FINIT;
  83. mask = 0x01 << (i + 0);
  84. if (i < pbxcan->fifo1filteroff)
  85. {
  86. if (pbxcan->filtermap[0].id32mask_cnt && i < pbxcan->filtermap[0].id32mask_cnt)
  87. {
  88. CAN1->FS1R |= mask;
  89. CAN1->FM1R &= ~mask;
  90. CAN1->FFA1R &= ~mask;
  91. }
  92. else if (pbxcan->filtermap[0].id32bit_cnt &&
  93. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2)
  94. {
  95. CAN1->FS1R |= mask;
  96. CAN1->FM1R |= mask;
  97. CAN1->FFA1R &= ~mask;
  98. }
  99. else if (pbxcan->filtermap[0].id16mask_cnt &&
  100. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  101. + pbxcan->filtermap[0].id16mask_cnt / 2)
  102. {
  103. CAN1->FS1R &= ~mask;
  104. CAN1->FM1R &= ~mask;
  105. CAN1->FFA1R &= ~mask;
  106. }
  107. else if (pbxcan->filtermap[0].id16bit_cnt &&
  108. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  109. + pbxcan->filtermap[0].id16mask_cnt / 2 + pbxcan->filtermap[0].id16bit_cnt / 4
  110. )
  111. {
  112. CAN1->FS1R &= ~mask;
  113. CAN1->FM1R |= mask;
  114. CAN1->FFA1R &= ~mask;
  115. }
  116. }
  117. else
  118. {
  119. if (pbxcan->filtermap[1].id32mask_cnt &&
  120. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff)
  121. {
  122. CAN1->FS1R |= mask;
  123. CAN1->FM1R &= ~mask;
  124. CAN1->FFA1R |= mask;
  125. }
  126. else if (pbxcan->filtermap[1].id32bit_cnt &&
  127. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  128. + pbxcan->fifo1filteroff)
  129. {
  130. CAN1->FS1R |= mask;
  131. CAN1->FM1R |= mask;
  132. CAN1->FFA1R |= mask;
  133. }
  134. else if (pbxcan->filtermap[1].id16mask_cnt &&
  135. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  136. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff)
  137. {
  138. CAN1->FS1R &= ~mask;
  139. CAN1->FM1R &= ~mask;
  140. CAN1->FFA1R |= mask;
  141. }
  142. else if (pbxcan->filtermap[1].id16bit_cnt &&
  143. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  144. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->filtermap[1].id16bit_cnt / 4
  145. + pbxcan->fifo1filteroff)
  146. {
  147. CAN1->FS1R &= ~mask;
  148. CAN1->FM1R |= mask;
  149. CAN1->FFA1R |= mask;
  150. }
  151. }
  152. CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF;
  153. CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF;
  154. CAN1->FMR &= ~FMR_FINIT;
  155. }
  156. calcfiltermasks(pbxcan);
  157. }
  158. #ifdef USING_BXCAN2
  159. static void bxcan2_filter_init(struct rt_can_device *can)
  160. {
  161. rt_uint32_t i;
  162. rt_uint32_t off;
  163. rt_uint32_t mask;
  164. CAN_SlaveStartBank(BX_CAN2_FMRSTART);
  165. struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
  166. for (i = BX_CAN2_FMRSTART; i < BX_CAN_FMRNUMBER; i++)
  167. {
  168. CAN1->FMR |= FMR_FINIT;
  169. mask = 0x01 << (i + 0);
  170. off = i - BX_CAN2_FMRSTART;
  171. if (off < pbxcan->fifo1filteroff)
  172. {
  173. if (pbxcan->filtermap[0].id32mask_cnt && off < pbxcan->filtermap[0].id32mask_cnt)
  174. {
  175. CAN1->FS1R |= mask;
  176. CAN1->FM1R &= ~mask;
  177. CAN1->FFA1R &= ~mask;
  178. }
  179. else if (pbxcan->filtermap[0].id32bit_cnt &&
  180. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2)
  181. {
  182. CAN1->FS1R |= mask;
  183. CAN1->FM1R |= mask;
  184. CAN1->FFA1R &= ~mask;
  185. }
  186. else if (pbxcan->filtermap[0].id16mask_cnt &&
  187. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  188. + pbxcan->filtermap[0].id16mask_cnt / 2)
  189. {
  190. CAN1->FS1R &= ~mask;
  191. CAN1->FM1R &= ~mask;
  192. CAN1->FFA1R &= ~mask;
  193. }
  194. else if (pbxcan->filtermap[0].id16bit_cnt &&
  195. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  196. + pbxcan->filtermap[0].id16mask_cnt / 2 + pbxcan->filtermap[0].id16bit_cnt / 4
  197. )
  198. {
  199. CAN1->FS1R &= ~mask;
  200. CAN1->FM1R |= mask;
  201. CAN1->FFA1R &= ~mask;
  202. }
  203. }
  204. else
  205. {
  206. if (pbxcan->filtermap[1].id32mask_cnt &&
  207. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff)
  208. {
  209. CAN1->FS1R |= mask;
  210. CAN1->FM1R &= ~mask;
  211. CAN1->FFA1R |= mask;
  212. }
  213. else if (pbxcan->filtermap[1].id32bit_cnt &&
  214. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  215. + pbxcan->fifo1filteroff)
  216. {
  217. CAN1->FS1R |= mask;
  218. CAN1->FM1R |= mask;
  219. CAN1->FFA1R |= mask;
  220. }
  221. else if (pbxcan->filtermap[1].id16mask_cnt &&
  222. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  223. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff)
  224. {
  225. CAN1->FS1R &= ~mask;
  226. CAN1->FM1R &= ~mask;
  227. CAN1->FFA1R |= mask;
  228. }
  229. else if (pbxcan->filtermap[1].id16bit_cnt &&
  230. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  231. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->filtermap[1].id16bit_cnt / 4
  232. + pbxcan->fifo1filteroff)
  233. {
  234. CAN1->FS1R &= ~mask;
  235. CAN1->FM1R |= mask;
  236. CAN1->FFA1R |= mask;
  237. }
  238. }
  239. CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF;
  240. CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF;
  241. CAN1->FMR &= ~FMR_FINIT;
  242. }
  243. calcfiltermasks(pbxcan);
  244. }
  245. #endif
  246. #define BS1SHIFT 16
  247. #define BS2SHIFT 20
  248. #define RRESCLSHIFT 0
  249. #define SJWSHIFT 24
  250. #define BS1MASK ( (0x0F) << BS1SHIFT )
  251. #define BS2MASK ( (0x07) << BS2SHIFT )
  252. #define RRESCLMASK ( 0x3FF << RRESCLSHIFT )
  253. #define SJWMASK ( 0x3 << SJWSHIFT )
  254. #define MK_BKCAN_BAUD(SJW,BS1,BS2,PRES) \
  255. ((SJW << SJWSHIFT) | (BS1 << BS1SHIFT) | (BS2 << BS2SHIFT) | (PRES << RRESCLSHIFT))
  256. static const struct stm_baud_rate_tab bxcan_baud_rate_tab[] =
  257. {
  258. #ifdef STM32F10X_CL
  259. // 48 M
  260. {1000UL * 1000, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 3)},
  261. {1000UL * 800, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_6tq, CAN_BS2_3tq, 6)},
  262. {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 5)},
  263. {1000UL * 250, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 11)},//1
  264. {1000UL * 125, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 23)},
  265. {1000UL * 100, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 29)},
  266. {1000UL * 50, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 59)},
  267. {1000UL * 20, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 149)},
  268. {1000UL * 10, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_16tq, CAN_BS2_8tq, 199)}
  269. #else
  270. // 36 M
  271. {1000UL * 1000, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_8tq, CAN_BS2_3tq, 3)},
  272. {1000UL * 800, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_11tq, CAN_BS2_3tq, 3)},
  273. {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 6)},
  274. {1000UL * 250, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 9)},//1
  275. {1000UL * 125, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 18)},
  276. {1000UL * 100, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 30)},
  277. {1000UL * 50, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 45)},
  278. {1000UL * 20, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 100)},
  279. {1000UL * 10, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 200)}
  280. #endif
  281. };
  282. #define BAUD_DATA(TYPE,NO) \
  283. ((bxcan_baud_rate_tab[NO].confdata & TYPE##MASK) >> TYPE##SHIFT)
  284. static rt_uint32_t bxcan_get_baud_index(rt_uint32_t baud)
  285. {
  286. rt_uint32_t len, index, default_index;
  287. len = sizeof(bxcan_baud_rate_tab)/sizeof(bxcan_baud_rate_tab[0]);
  288. default_index = len;
  289. for(index = 0; index < len; index++)
  290. {
  291. if(bxcan_baud_rate_tab[index].baud_rate == baud)
  292. return index;
  293. if(bxcan_baud_rate_tab[index].baud_rate == 1000UL * 250)
  294. default_index = index;
  295. }
  296. if(default_index != len)
  297. return default_index;
  298. return 0;
  299. }
  300. static void bxcan_init(CAN_TypeDef *pcan, rt_uint32_t baud, rt_uint32_t mode)
  301. {
  302. CAN_InitTypeDef CAN_InitStructure;
  303. rt_uint32_t baud_index = bxcan_get_baud_index(baud);
  304. CAN_InitStructure.CAN_TTCM = DISABLE;
  305. CAN_InitStructure.CAN_ABOM = ENABLE;
  306. CAN_InitStructure.CAN_AWUM = DISABLE;
  307. CAN_InitStructure.CAN_NART = DISABLE;
  308. CAN_InitStructure.CAN_RFLM = DISABLE;
  309. CAN_InitStructure.CAN_TXFP = ENABLE;
  310. switch (mode)
  311. {
  312. case RT_CAN_MODE_NORMAL:
  313. CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  314. break;
  315. case RT_CAN_MODE_LISEN:
  316. CAN_InitStructure.CAN_Mode = CAN_Mode_Silent;
  317. break;
  318. case RT_CAN_MODE_LOOPBACK:
  319. CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
  320. break;
  321. case RT_CAN_MODE_LOOPBACKANLISEN:
  322. CAN_InitStructure.CAN_Mode = CAN_Mode_Silent_LoopBack;
  323. break;
  324. }
  325. CAN_InitStructure.CAN_SJW = BAUD_DATA(SJW, baud_index);
  326. CAN_InitStructure.CAN_BS1 = BAUD_DATA(BS1, baud_index);
  327. CAN_InitStructure.CAN_BS2 = BAUD_DATA(BS2, baud_index);
  328. CAN_InitStructure.CAN_Prescaler = BAUD_DATA(RRESCL, baud_index);
  329. CAN_Init(pcan, &CAN_InitStructure);
  330. }
  331. static void bxcan1_hw_init(void)
  332. {
  333. GPIO_InitTypeDef GPIO_InitStructure;
  334. NVIC_InitTypeDef NVIC_InitStructure;
  335. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  336. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  337. GPIO_Init(GPIOA, &GPIO_InitStructure);
  338. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  339. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  340. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  341. GPIO_Init(GPIOA, &GPIO_InitStructure);
  342. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  343. NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  344. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  345. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  346. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  347. NVIC_Init(&NVIC_InitStructure);
  348. NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
  349. NVIC_Init(&NVIC_InitStructure);
  350. NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn;
  351. NVIC_Init(&NVIC_InitStructure);
  352. }
  353. #ifdef USING_BXCAN2
  354. static void bxcan2_hw_init(void)
  355. {
  356. GPIO_InitTypeDef GPIO_InitStructure;
  357. NVIC_InitTypeDef NVIC_InitStructure;
  358. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  359. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  360. GPIO_Init(GPIOB, &GPIO_InitStructure);
  361. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  362. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  363. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  364. GPIO_Init(GPIOB, &GPIO_InitStructure);
  365. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  366. NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
  367. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  368. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  369. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  370. NVIC_Init(&NVIC_InitStructure);
  371. NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
  372. NVIC_Init(&NVIC_InitStructure);
  373. NVIC_InitStructure.NVIC_IRQChannel = CAN2_TX_IRQn;
  374. NVIC_Init(&NVIC_InitStructure);
  375. }
  376. #endif
  377. rt_inline rt_err_t bxcan_enter_init(CAN_TypeDef *pcan)
  378. {
  379. uint32_t wait_ack = 0x00000000;
  380. pcan->MCR |= CAN_MCR_INRQ ;
  381. while (((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
  382. {
  383. wait_ack++;
  384. }
  385. if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
  386. {
  387. return RT_ERROR;
  388. }
  389. return RT_EOK;
  390. }
  391. rt_inline rt_err_t bxcan_exit_init(CAN_TypeDef *pcan)
  392. {
  393. uint32_t wait_ack = 0x00000000;
  394. pcan->MCR &= ~(uint32_t)CAN_MCR_INRQ;
  395. while (((pcan->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
  396. {
  397. wait_ack++;
  398. }
  399. if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
  400. {
  401. return RT_ERROR;
  402. }
  403. return RT_EOK;
  404. }
  405. static rt_err_t bxcan_set_mode(CAN_TypeDef *pcan, rt_uint32_t mode)
  406. {
  407. if (bxcan_enter_init(pcan) != RT_EOK)
  408. {
  409. return RT_ERROR;
  410. }
  411. pcan->BTR &= ~(uint32_t)((uint32_t)0x03 << 30);
  412. switch (mode)
  413. {
  414. case RT_CAN_MODE_NORMAL:
  415. mode = CAN_Mode_Normal;
  416. break;
  417. case RT_CAN_MODE_LISEN:
  418. mode = CAN_Mode_Silent;
  419. break;
  420. case RT_CAN_MODE_LOOPBACK:
  421. mode = CAN_Mode_LoopBack;
  422. break;
  423. case RT_CAN_MODE_LOOPBACKANLISEN:
  424. mode = CAN_Mode_Silent_LoopBack;
  425. break;
  426. }
  427. pcan->BTR |= ~(uint32_t)(mode << 30);
  428. if (bxcan_exit_init(pcan) != RT_EOK)
  429. {
  430. return RT_ERROR;
  431. }
  432. return RT_EOK;
  433. }
  434. static rt_err_t bxcan_set_privmode(CAN_TypeDef *pcan, rt_uint32_t mode)
  435. {
  436. if (bxcan_enter_init(pcan) != RT_EOK)
  437. {
  438. return RT_ERROR;
  439. }
  440. if (mode == ENABLE)
  441. {
  442. pcan->MCR |= CAN_MCR_TXFP;
  443. }
  444. else
  445. {
  446. pcan->MCR &= ~(uint32_t)CAN_MCR_TXFP;
  447. }
  448. if (bxcan_exit_init(pcan) != RT_EOK)
  449. {
  450. return RT_ERROR;
  451. }
  452. return RT_EOK;
  453. }
  454. static rt_err_t bxcan_set_baud_rate(CAN_TypeDef *pcan, rt_uint32_t baud)
  455. {
  456. rt_uint32_t mode;
  457. rt_uint32_t baud_index = bxcan_get_baud_index(baud);
  458. if (bxcan_enter_init(pcan) != RT_EOK)
  459. {
  460. return RT_ERROR;
  461. }
  462. pcan->BTR = 0;
  463. mode = pcan->BTR & ((rt_uint32_t)0x03 << 30);
  464. pcan->BTR = (mode | \
  465. ((BAUD_DATA(SJW, baud_index)) << 24) | \
  466. ((BAUD_DATA(BS1, baud_index)) << 16) | \
  467. ((BAUD_DATA(BS2, baud_index)) << 20) | \
  468. (BAUD_DATA(RRESCL, baud_index)));
  469. if (bxcan_exit_init(pcan) != RT_EOK)
  470. {
  471. return RT_ERROR;
  472. }
  473. return RT_EOK;
  474. }
  475. static rt_err_t bxcancalcbaseoff(struct stm_bxcan *pbxcan, rt_int32_t hdr,
  476. rt_int32_t *pbase, rt_int32_t *poff)
  477. {
  478. rt_uint32_t fifo0start, fifo0end;
  479. rt_uint32_t fifo1start, fifo1end;
  480. rt_uint32_t ptr;
  481. fifo0start = 0;
  482. fifo0end = fifo0start
  483. + pbxcan->filtermap[0].id32mask_cnt
  484. + pbxcan->filtermap[0].id32bit_cnt
  485. + pbxcan->filtermap[0].id16mask_cnt
  486. + pbxcan->filtermap[0].id16bit_cnt ;
  487. fifo1start = pbxcan->fifo1filteroff * 4;
  488. fifo1end = fifo1start
  489. + pbxcan->filtermap[1].id32mask_cnt
  490. + pbxcan->filtermap[1].id32bit_cnt
  491. + pbxcan->filtermap[1].id16mask_cnt
  492. + pbxcan->filtermap[1].id16bit_cnt ;
  493. if (hdr >= fifo0start && hdr < fifo0end)
  494. {
  495. *pbase = 0;
  496. ptr = 0;
  497. hdr -= fifo0start;
  498. }
  499. else if (hdr >= fifo1start && hdr < fifo1end)
  500. {
  501. *pbase = pbxcan->fifo1filteroff;
  502. ptr = 1;
  503. hdr -= fifo1start;
  504. }
  505. else
  506. {
  507. return RT_ERROR;
  508. }
  509. if (hdr > pbxcan->filtermap[ptr].id32mask_cnt)
  510. {
  511. hdr -= pbxcan->filtermap[ptr].id32mask_cnt;
  512. *pbase += pbxcan->filtermap[ptr].id32mask_cnt;
  513. }
  514. else
  515. {
  516. *pbase += hdr;
  517. *poff = 0;
  518. return RT_EOK;
  519. }
  520. if (hdr > pbxcan->filtermap[ptr].id32bit_cnt)
  521. {
  522. hdr -= pbxcan->filtermap[ptr].id32bit_cnt;
  523. *pbase += pbxcan->filtermap[ptr].id32bit_cnt / 2;
  524. }
  525. else
  526. {
  527. *pbase += hdr / 2;
  528. *poff = hdr % 2;
  529. return RT_EOK;
  530. }
  531. if (hdr > pbxcan->filtermap[ptr].id16mask_cnt)
  532. {
  533. hdr -= pbxcan->filtermap[ptr].id16mask_cnt;
  534. *pbase += pbxcan->filtermap[ptr].id16mask_cnt / 2;
  535. }
  536. else
  537. {
  538. *pbase += hdr / 2;
  539. *poff = hdr % 2;
  540. return RT_EOK;
  541. }
  542. if (hdr > pbxcan->filtermap[ptr].id16bit_cnt)
  543. {
  544. return RT_ERROR;
  545. }
  546. else
  547. {
  548. *pbase += hdr / 4;
  549. *poff = hdr % 4;
  550. return RT_EOK;
  551. }
  552. }
  553. static void calcandormask(rt_uint32_t *pmask, rt_uint32_t shift, rt_int32_t count)
  554. {
  555. rt_uint32_t tmpmask;
  556. rt_uint32_t tmpmaskarray[BX_CAN_FILTER_MAX_ARRAY_SIZE] = {0,};
  557. rt_int32_t i;
  558. i = 0;
  559. while (count > 0)
  560. {
  561. if (i >= 32)
  562. {
  563. tmpmaskarray[i] = 0xFFFFFFFF;
  564. }
  565. else
  566. {
  567. tmpmaskarray[i] = (0x01 << count) - 1;
  568. }
  569. count -= 32;
  570. i++;
  571. };
  572. count = i;
  573. for (i = 0; i < count && i < BX_CAN_FILTER_MAX_ARRAY_SIZE; i++)
  574. {
  575. tmpmask = tmpmaskarray[i];
  576. pmask[i] |= (rt_uint32_t)(tmpmask << shift);
  577. if (i < BX_CAN_FILTER_MAX_ARRAY_SIZE - 1)
  578. {
  579. pmask[i + 1] |= (rt_uint32_t)(tmpmask >> (32 - shift));
  580. }
  581. }
  582. }
  583. static void calcfiltermasks(struct stm_bxcan *pbxcan)
  584. {
  585. rt_memset(&pbxcan->filtermask, 0, sizeof(pbxcan->filtermask));
  586. pbxcan->filtermask.id32maskshift[0] = 0;
  587. if (pbxcan->filtermap[0].id32mask_cnt)
  588. {
  589. calcandormask(pbxcan->filtermask.id32maskm, pbxcan->filtermask.id32maskshift[0],
  590. pbxcan->filtermap[0].id32mask_cnt);
  591. }
  592. pbxcan->filtermask.id32maskshift[1] = pbxcan->fifo1filteroff * 4;
  593. if (pbxcan->filtermap[1].id32mask_cnt)
  594. {
  595. calcandormask(pbxcan->filtermask.id32maskm, pbxcan->filtermask.id32maskshift[1],
  596. pbxcan->filtermap[1].id32mask_cnt);
  597. }
  598. pbxcan->filtermask.id32bitshift[0] = pbxcan->filtermask.id32maskshift[0] +
  599. pbxcan->filtermap[0].id32mask_cnt;
  600. if (pbxcan->filtermap[0].id32bit_cnt)
  601. {
  602. calcandormask(pbxcan->filtermask.id32bitm, pbxcan->filtermask.id32bitshift[0],
  603. pbxcan->filtermap[0].id32bit_cnt);
  604. }
  605. pbxcan->filtermask.id32bitshift[1] = pbxcan->filtermask.id32maskshift[1] +
  606. pbxcan->filtermap[1].id32mask_cnt;
  607. if (pbxcan->filtermap[1].id32bit_cnt)
  608. {
  609. calcandormask(pbxcan->filtermask.id32bitm, pbxcan->filtermask.id32bitshift[1],
  610. pbxcan->filtermap[1].id32bit_cnt);
  611. }
  612. pbxcan->filtermask.id16maskshift[0] = pbxcan->filtermask.id32bitshift[0] +
  613. pbxcan->filtermap[0].id32bit_cnt;
  614. if (pbxcan->filtermap[0].id16mask_cnt)
  615. {
  616. calcandormask(pbxcan->filtermask.id16maskm, pbxcan->filtermask.id16maskshift[0],
  617. pbxcan->filtermap[0].id16mask_cnt);
  618. }
  619. pbxcan->filtermask.id16maskshift[1] = pbxcan->filtermask.id32bitshift[1] +
  620. pbxcan->filtermap[1].id32bit_cnt;
  621. if (pbxcan->filtermap[1].id16mask_cnt)
  622. {
  623. calcandormask(pbxcan->filtermask.id16maskm, pbxcan->filtermask.id16maskshift[1],
  624. pbxcan->filtermap[1].id16mask_cnt);
  625. }
  626. pbxcan->filtermask.id16bitshift[0] = pbxcan->filtermask.id16maskshift[0] +
  627. pbxcan->filtermap[0].id16mask_cnt;
  628. if (pbxcan->filtermap[0].id16bit_cnt)
  629. {
  630. calcandormask(pbxcan->filtermask.id16bitm, pbxcan->filtermask.id16bitshift[0],
  631. pbxcan->filtermap[0].id16bit_cnt);
  632. }
  633. pbxcan->filtermask.id16bitshift[1] = pbxcan->filtermask.id16maskshift[1] +
  634. pbxcan->filtermap[1].id16mask_cnt;
  635. if (pbxcan->filtermap[1].id16bit_cnt)
  636. {
  637. calcandormask(pbxcan->filtermask.id16bitm, pbxcan->filtermask.id16bitshift[1],
  638. pbxcan->filtermap[1].id16bit_cnt);
  639. }
  640. }
  641. static rt_int32_t bxcanfindfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_item *pitem,
  642. rt_int32_t type, rt_int32_t *base, rt_int32_t *off)
  643. {
  644. rt_int32_t i;
  645. rt_uint32_t bits, thisid, thismask, shift, found;
  646. CAN_FilterRegister_TypeDef *pfilterreg;
  647. found = 0;
  648. switch (type)
  649. {
  650. case 3:
  651. shift = 3;
  652. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  653. {
  654. bits = 0x01 << (i & 0x1F);
  655. if (bits & (pbxcan->filtermask.id32maskm[i >> 5] & pbxcan->alocmask[i >> 5]))
  656. {
  657. bxcancalcbaseoff(pbxcan, i, base, off);
  658. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  659. thisid = (rt_uint32_t)pitem->id << shift;
  660. thismask = (rt_uint32_t)pitem->mask << shift;
  661. if (pitem->ide)
  662. {
  663. thisid |= CAN_ID_EXT;
  664. thismask |= CAN_ID_EXT;
  665. }
  666. if (pitem->rtr)
  667. {
  668. thisid |= CAN_RTR_REMOTE;
  669. thismask |= CAN_RTR_REMOTE;
  670. }
  671. if (pfilterreg->FR1 == thisid && pfilterreg->FR2 == thismask)
  672. {
  673. found = 1;
  674. break;
  675. }
  676. }
  677. }
  678. break;
  679. case 2:
  680. shift = 3;
  681. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  682. {
  683. bits = 0x01 << (i % 32);
  684. if (bits & (pbxcan->filtermask.id32bitm[i >> 5] & pbxcan->alocmask[i >> 5]))
  685. {
  686. bxcancalcbaseoff(pbxcan, i, base, off);
  687. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  688. thisid = (rt_uint32_t)pitem->id << shift;
  689. if (pitem->ide)
  690. {
  691. thisid |= CAN_ID_EXT;
  692. }
  693. if (pitem->rtr)
  694. {
  695. thisid |= CAN_RTR_REMOTE;
  696. }
  697. if ((*off == 0 && pfilterreg->FR1 == thisid) ||
  698. (*off == 1 && pfilterreg->FR2 == thisid)
  699. )
  700. {
  701. found = 1;
  702. break;
  703. }
  704. }
  705. }
  706. break;
  707. case 1:
  708. shift = 5;
  709. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  710. {
  711. bits = 0x01 << (i % 32);
  712. if (bits & (pbxcan->filtermask.id16maskm[i >> 5] & pbxcan->alocmask[i >> 5]))
  713. {
  714. bxcancalcbaseoff(pbxcan, i, base, off);
  715. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  716. thisid = pitem->id << shift;
  717. if (pitem->rtr)
  718. {
  719. thisid |= CAN_RTR_REMOTE << (shift - 2);
  720. }
  721. thismask = pitem->mask << shift;
  722. if (pitem->rtr)
  723. {
  724. thismask |= CAN_RTR_REMOTE << (shift - 2);
  725. }
  726. if (*off == 0 && pfilterreg->FR1 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16)) ||
  727. *off == 1 && pfilterreg->FR2 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16))
  728. )
  729. {
  730. found = 1;
  731. break;
  732. }
  733. }
  734. }
  735. break;
  736. case 0:
  737. shift = 5;
  738. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  739. {
  740. bits = 0x01 << (i % 32);
  741. if (bits & (pbxcan->filtermask.id16bitm[i >> 5] & pbxcan->alocmask[i >> 5]))
  742. {
  743. bxcancalcbaseoff(pbxcan, i, base, off);
  744. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  745. thisid = pitem->id << shift;
  746. if (pitem->rtr)
  747. {
  748. thisid |= CAN_RTR_REMOTE << (shift - 2);
  749. }
  750. if (*off < 2 && ((rt_uint16_t *)&pfilterreg->FR1)[*off & 0x01] == thisid ||
  751. *off >= 2 && ((rt_uint16_t *)&pfilterreg->FR2)[*off & 0x01] == thisid)
  752. {
  753. found = 1;
  754. break;
  755. }
  756. }
  757. }
  758. break;
  759. }
  760. if (found)
  761. {
  762. return i;
  763. }
  764. return -1;
  765. }
  766. extern int __rt_ffs(int value);
  767. static rt_err_t bxcanallocfilter(rt_uint32_t *pmask, rt_uint32_t *palocmask,
  768. rt_uint32_t count, rt_int32_t *hdr)
  769. {
  770. rt_int32_t i;
  771. for (i = 0; i < count; i++)
  772. {
  773. rt_enter_critical();
  774. if ((pmask[i] & ~palocmask[i]) != 0)
  775. {
  776. *hdr = __rt_ffs(pmask[i] & ~palocmask[i]) - 1 + i * 32;
  777. palocmask[i] |= 0x01 << (*hdr % 0x1F);
  778. rt_exit_critical();
  779. return RT_EOK;
  780. }
  781. rt_exit_critical();
  782. }
  783. if (i >= count)
  784. {
  785. return RT_ENOMEM;
  786. }
  787. return RT_EOK;
  788. }
  789. static rt_err_t bxcanallocnewfilter(struct stm_bxcan *pbxcan, rt_int32_t actived,
  790. rt_int32_t type, rt_int32_t *hdr, rt_int32_t *base, rt_int32_t *off)
  791. {
  792. rt_err_t res;
  793. *hdr = -1;
  794. switch (type)
  795. {
  796. case 0x03:
  797. res = bxcanallocfilter(pbxcan->filtermask.id32maskm, pbxcan->alocmask,
  798. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  799. break;
  800. case 0x02:
  801. res = bxcanallocfilter(pbxcan->filtermask.id32bitm, pbxcan->alocmask,
  802. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  803. break;
  804. case 0x01:
  805. res = bxcanallocfilter(pbxcan->filtermask.id16maskm, pbxcan->alocmask,
  806. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  807. break;
  808. case 0x00:
  809. res = bxcanallocfilter(pbxcan->filtermask.id16bitm, pbxcan->alocmask,
  810. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  811. break;
  812. }
  813. if (res != RT_EOK || *hdr < 0)
  814. {
  815. return RT_ENOMEM;
  816. }
  817. bxcancalcbaseoff(pbxcan, *hdr, base, off);
  818. return RT_EOK;
  819. }
  820. static rt_err_t bxmodifyfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_item *pitem, rt_uint32_t actived)
  821. {
  822. rt_int32_t fcase;
  823. rt_err_t res;
  824. rt_int32_t hdr, fbase, foff;
  825. rt_uint32_t ID[2];
  826. rt_uint32_t shift;
  827. rt_uint32_t thisid;
  828. rt_uint32_t thismask;
  829. CAN_FilterInitTypeDef CAN_FilterInitStructure;
  830. CAN_FilterRegister_TypeDef *pfilterreg;
  831. fcase = (pitem->mode | (pitem->ide << 1));
  832. hdr = bxcanfindfilter(pbxcan, pitem, fcase, &fbase, &foff);
  833. if (hdr < 0)
  834. {
  835. if (!actived)
  836. {
  837. return RT_EOK;
  838. }
  839. else if (pitem->hdr == -1)
  840. {
  841. res = bxcanallocnewfilter(pbxcan, actived, fcase, &hdr, &fbase, &foff);
  842. if (res != RT_EOK)
  843. {
  844. return res;
  845. }
  846. }
  847. else if (pitem->hdr >= 0)
  848. {
  849. rt_enter_critical();
  850. res = bxcancalcbaseoff(pbxcan, pitem->hdr, &fbase, &foff);
  851. if (res != RT_EOK)
  852. {
  853. return res;
  854. }
  855. hdr = pitem->hdr;
  856. if (actived)
  857. {
  858. pbxcan->alocmask[hdr >> 5] |= 0x01 << (hdr % 0x1F);
  859. }
  860. rt_exit_critical();
  861. }
  862. }
  863. else
  864. {
  865. if (!actived)
  866. {
  867. pitem->hdr = hdr;
  868. }
  869. else if (hdr >= 0 && (pitem->hdr >= 0 || pitem->hdr == -1))
  870. {
  871. pitem->hdr = hdr;
  872. return RT_EBUSY;
  873. }
  874. }
  875. pitem->hdr = hdr;
  876. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[fbase];
  877. ID[0] = pfilterreg->FR1;
  878. ID[1] = pfilterreg->FR2;
  879. CAN_FilterInitStructure.CAN_FilterNumber = (pfilterreg - &CAN1->sFilterRegister[0]);
  880. if (pitem->mode)
  881. {
  882. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  883. }
  884. else
  885. {
  886. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
  887. }
  888. if (pitem->ide)
  889. {
  890. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  891. }
  892. else
  893. {
  894. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
  895. }
  896. switch (fcase)
  897. {
  898. case 0x03:
  899. if (actived)
  900. {
  901. shift = 3;
  902. thisid = (rt_uint32_t)pitem->id << shift;
  903. thismask = (rt_uint32_t)pitem->mask << shift;
  904. if (pitem->ide)
  905. {
  906. thisid |= CAN_ID_EXT;
  907. thismask |= CAN_ID_EXT;
  908. }
  909. if (pitem->rtr)
  910. {
  911. thisid |= CAN_RTR_REMOTE;
  912. thismask |= CAN_RTR_REMOTE;
  913. }
  914. ID[0] = thisid;
  915. ID[1] = thismask;
  916. }
  917. else
  918. {
  919. ID[0] = 0xFFFFFFFF;
  920. ID[1] = 0xFFFFFFFF;
  921. }
  922. break;
  923. case 0x02:
  924. if (actived)
  925. {
  926. shift = 3;
  927. thisid = (rt_uint32_t)pitem->id << shift;
  928. if (pitem->ide)
  929. {
  930. thisid |= CAN_ID_EXT;
  931. }
  932. if (pitem->rtr)
  933. {
  934. thisid |= CAN_RTR_REMOTE;
  935. }
  936. ID[foff] = thisid;
  937. }
  938. else
  939. {
  940. ID[foff] = 0xFFFFFFFF;
  941. }
  942. break;
  943. case 0x01:
  944. if (actived)
  945. {
  946. shift = 5;
  947. thisid = pitem->id << shift;
  948. if (pitem->rtr)
  949. {
  950. thisid |= CAN_RTR_REMOTE << (shift - 2);
  951. }
  952. thismask = pitem->mask << shift;
  953. if (pitem->rtr)
  954. {
  955. thismask |= CAN_RTR_REMOTE << (shift - 2);
  956. }
  957. ID[foff] = (thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16);
  958. }
  959. else
  960. {
  961. ID[foff] = 0xFFFFFFFF;
  962. }
  963. break;
  964. case 0x00:
  965. if (actived)
  966. {
  967. shift = 5;
  968. thisid = pitem->id << shift;
  969. if (pitem->rtr)
  970. {
  971. thisid |= CAN_RTR_REMOTE << (shift - 2);
  972. }
  973. ((rt_uint16_t *) ID)[foff] = thisid;
  974. }
  975. else
  976. {
  977. ((rt_uint16_t *) ID)[foff] = 0xFFFF;
  978. }
  979. break;
  980. }
  981. if(pitem->ide)
  982. {
  983. CAN_FilterInitStructure.CAN_FilterIdHigh = (ID[0] & 0xFFFF0000) >> 16;
  984. CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
  985. CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
  986. CAN_FilterInitStructure.CAN_FilterMaskIdLow = ((ID[1]) & 0x0000FFFF);
  987. }
  988. else
  989. {
  990. CAN_FilterInitStructure.CAN_FilterIdHigh = ((ID[1]) & 0x0000FFFF);
  991. CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
  992. CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
  993. CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID[0] & 0xFFFF0000) >> 16;
  994. }
  995. if (fbase >= pbxcan->fifo1filteroff)
  996. {
  997. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;
  998. }
  999. else
  1000. {
  1001. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  1002. }
  1003. if (ID[0] != 0xFFFFFFFF || ID[1] != 0xFFFFFFFF)
  1004. {
  1005. CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  1006. }
  1007. else
  1008. {
  1009. CAN_FilterInitStructure.CAN_FilterActivation = DISABLE;
  1010. }
  1011. if (!actived)
  1012. {
  1013. rt_enter_critical();
  1014. pbxcan->alocmask[hdr >> 5] &= ~(0x01 << (hdr % 0x1F));
  1015. rt_exit_critical();
  1016. }
  1017. CAN_FilterInit(&CAN_FilterInitStructure);
  1018. return RT_EOK;
  1019. }
  1020. static rt_err_t setfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_config *pconfig)
  1021. {
  1022. struct rt_can_filter_item *pitem = pconfig->items;
  1023. rt_uint32_t count = pconfig->count;
  1024. rt_err_t res;
  1025. while (count)
  1026. {
  1027. res = bxmodifyfilter(pbxcan, pitem, pconfig->actived);
  1028. if (res != RT_EOK)
  1029. {
  1030. return res;
  1031. }
  1032. pitem++;
  1033. count--;
  1034. }
  1035. return RT_EOK;
  1036. }
  1037. static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
  1038. {
  1039. CAN_TypeDef *pbxcan;
  1040. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1041. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1042. if (pbxcan == CAN1)
  1043. {
  1044. bxcan1_hw_init();
  1045. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1046. bxcan1_filter_init(can);
  1047. }
  1048. else
  1049. {
  1050. #ifdef USING_BXCAN2
  1051. bxcan2_hw_init();
  1052. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1053. bxcan2_filter_init(can);
  1054. #endif
  1055. }
  1056. return RT_EOK;
  1057. }
  1058. static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
  1059. {
  1060. struct stm_bxcan *pbxcan;
  1061. rt_uint32_t argval;
  1062. NVIC_InitTypeDef NVIC_InitStructure;
  1063. pbxcan = (struct stm_bxcan *) can->parent.user_data;
  1064. assert_param(pbxcan != RT_NULL);
  1065. switch (cmd)
  1066. {
  1067. case RT_DEVICE_CTRL_CLR_INT:
  1068. argval = (rt_uint32_t) arg;
  1069. if (argval == RT_DEVICE_FLAG_INT_RX)
  1070. {
  1071. NVIC_DisableIRQ(pbxcan->rcvirq0);
  1072. NVIC_DisableIRQ(pbxcan->rcvirq1);
  1073. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , DISABLE);
  1074. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , DISABLE);
  1075. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , DISABLE);
  1076. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , DISABLE);
  1077. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , DISABLE);
  1078. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , DISABLE);
  1079. }
  1080. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1081. {
  1082. NVIC_DisableIRQ(pbxcan->sndirq);
  1083. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, DISABLE);
  1084. }
  1085. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1086. {
  1087. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , DISABLE);
  1088. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , DISABLE);
  1089. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , DISABLE);
  1090. NVIC_DisableIRQ(pbxcan->errirq);
  1091. }
  1092. break;
  1093. case RT_DEVICE_CTRL_SET_INT:
  1094. argval = (rt_uint32_t) arg;
  1095. if (argval == RT_DEVICE_FLAG_INT_RX)
  1096. {
  1097. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , ENABLE);
  1098. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , ENABLE);
  1099. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , ENABLE);
  1100. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , ENABLE);
  1101. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , ENABLE);
  1102. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , ENABLE);
  1103. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1104. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1105. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1106. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq0;
  1107. NVIC_Init(&NVIC_InitStructure);
  1108. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq1;
  1109. NVIC_Init(&NVIC_InitStructure);
  1110. }
  1111. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1112. {
  1113. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, ENABLE);
  1114. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1115. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1116. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1117. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->sndirq;
  1118. NVIC_Init(&NVIC_InitStructure);
  1119. }
  1120. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1121. {
  1122. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , ENABLE);
  1123. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , ENABLE);
  1124. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , ENABLE);
  1125. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1126. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1127. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1128. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->errirq;
  1129. NVIC_Init(&NVIC_InitStructure);
  1130. }
  1131. break;
  1132. case RT_CAN_CMD_SET_FILTER:
  1133. return setfilter(pbxcan, (struct rt_can_filter_config *) arg);
  1134. case RT_CAN_CMD_SET_MODE:
  1135. argval = (rt_uint32_t) arg;
  1136. if (argval != RT_CAN_MODE_NORMAL ||
  1137. argval != RT_CAN_MODE_LISEN ||
  1138. argval != RT_CAN_MODE_LOOPBACK ||
  1139. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  1140. {
  1141. return RT_ERROR;
  1142. }
  1143. if (argval != can->config.mode)
  1144. {
  1145. can->config.mode = argval;
  1146. return bxcan_set_mode(pbxcan->reg, argval);
  1147. }
  1148. break;
  1149. case RT_CAN_CMD_SET_BAUD:
  1150. argval = (rt_uint32_t) arg;
  1151. if (argval != CAN1MBaud &&
  1152. argval != CAN800kBaud &&
  1153. argval != CAN500kBaud &&
  1154. argval != CAN250kBaud &&
  1155. argval != CAN125kBaud &&
  1156. argval != CAN100kBaud &&
  1157. argval != CAN50kBaud &&
  1158. argval != CAN20kBaud &&
  1159. argval != CAN10kBaud)
  1160. {
  1161. return RT_ERROR;
  1162. }
  1163. if (argval != can->config.baud_rate)
  1164. {
  1165. can->config.baud_rate = argval;
  1166. return bxcan_set_baud_rate(pbxcan->reg, argval);
  1167. }
  1168. break;
  1169. case RT_CAN_CMD_SET_PRIV:
  1170. argval = (rt_uint32_t) arg;
  1171. if (argval != RT_CAN_MODE_PRIV ||
  1172. argval != RT_CAN_MODE_NOPRIV)
  1173. {
  1174. return RT_ERROR;
  1175. }
  1176. if (argval != can->config.privmode)
  1177. {
  1178. can->config.privmode = argval;
  1179. return bxcan_set_privmode(pbxcan->reg, argval);
  1180. }
  1181. break;
  1182. case RT_CAN_CMD_GET_STATUS:
  1183. {
  1184. rt_uint32_t errtype;
  1185. errtype = pbxcan->reg->ESR;
  1186. can->status.rcverrcnt = errtype >> 24;
  1187. can->status.snderrcnt = (errtype >> 16 & 0xFF);
  1188. can->status.errcode = errtype & 0x07;
  1189. if (arg != &can->status)
  1190. {
  1191. rt_memcpy(arg, &can->status, sizeof(can->status));
  1192. }
  1193. }
  1194. break;
  1195. }
  1196. return RT_EOK;
  1197. }
  1198. static int sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
  1199. {
  1200. CAN_TypeDef *pbxcan;
  1201. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1202. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1203. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1204. pbxcan->sTxMailBox[boxno].TIR &= TMIDxR_TXRQ;
  1205. if (pmsg->ide == RT_CAN_STDID)
  1206. {
  1207. assert_param(IS_CAN_STDID(pmsg->id));
  1208. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 21) | \
  1209. (pmsg->rtr << 1));
  1210. }
  1211. else
  1212. {
  1213. assert_param(IS_CAN_EXTID(pmsg->id));
  1214. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 3) | \
  1215. (pmsg->ide << 2) | \
  1216. (pmsg->rtr << 1));
  1217. }
  1218. pmsg->len &= (uint8_t)0x0000000F;
  1219. pbxcan->sTxMailBox[boxno].TDTR &= (uint32_t)0xFFFFFFF0;
  1220. pbxcan->sTxMailBox[boxno].TDTR |= pmsg->len;
  1221. pbxcan->sTxMailBox[boxno].TDLR = (((uint32_t)pmsg->data[3] << 24) |
  1222. ((uint32_t)pmsg->data[2] << 16) |
  1223. ((uint32_t)pmsg->data[1] << 8) |
  1224. ((uint32_t)pmsg->data[0]));
  1225. if (pmsg->len > 4)
  1226. {
  1227. pbxcan->sTxMailBox[boxno].TDHR = (((uint32_t)pmsg->data[7] << 24) |
  1228. ((uint32_t)pmsg->data[6] << 16) |
  1229. ((uint32_t)pmsg->data[5] << 8) |
  1230. ((uint32_t)pmsg->data[4]));
  1231. }
  1232. pbxcan->sTxMailBox[boxno].TIR |= TMIDxR_TXRQ;
  1233. return RT_EOK;
  1234. }
  1235. static int recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
  1236. {
  1237. CAN_TypeDef *pbxcan;
  1238. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1239. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1240. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1241. assert_param(IS_CAN_FIFO(boxno));
  1242. pmsg->ide = ((uint8_t)0x04 & pbxcan->sFIFOMailBox[boxno].RIR) >> 2;
  1243. if (pmsg->ide == CAN_Id_Standard)
  1244. {
  1245. pmsg->id = (uint32_t)0x000007FF & (pbxcan->sFIFOMailBox[boxno].RIR >> 21);
  1246. }
  1247. else
  1248. {
  1249. pmsg->id = (uint32_t)0x1FFFFFFF & (pbxcan->sFIFOMailBox[boxno].RIR >> 3);
  1250. }
  1251. pmsg->rtr = (uint8_t)((0x02 & pbxcan->sFIFOMailBox[boxno].RIR) >> 1);
  1252. pmsg->len = (uint8_t)0x0F & pbxcan->sFIFOMailBox[boxno].RDTR;
  1253. pmsg->data[0] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDLR;
  1254. pmsg->data[1] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 8);
  1255. pmsg->data[2] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 16);
  1256. pmsg->data[3] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 24);
  1257. if (pmsg->len > 4)
  1258. {
  1259. pmsg->data[4] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDHR;
  1260. pmsg->data[5] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 8);
  1261. pmsg->data[6] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 16);
  1262. pmsg->data[7] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 24);
  1263. }
  1264. pmsg->hdr = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDTR >> 8);
  1265. if (boxno) pmsg->hdr += ((struct stm_bxcan *) can->parent.user_data)->fifo1filteroff * 4;
  1266. return RT_EOK;
  1267. }
  1268. static const struct rt_can_ops canops =
  1269. {
  1270. configure,
  1271. control,
  1272. sendmsg,
  1273. recvmsg,
  1274. };
  1275. #ifdef USING_BXCAN1
  1276. static struct stm_bxcan bxcan1data =
  1277. {
  1278. CAN1,
  1279. (void *) &CAN1->sFilterRegister[0],
  1280. CAN1_TX_IRQn,
  1281. CAN1_RX0_IRQn,
  1282. CAN1_RX1_IRQn,
  1283. CAN1_SCE_IRQn,
  1284. {
  1285. 0,
  1286. },
  1287. {0, 0},
  1288. BX_CAN2_FMRSTART,
  1289. 7,
  1290. {
  1291. {
  1292. 0,
  1293. 0,
  1294. 2,
  1295. 24,
  1296. },
  1297. {
  1298. 0,
  1299. 0,
  1300. 2,
  1301. 24,
  1302. },
  1303. },
  1304. };
  1305. struct rt_can_device bxcan1;
  1306. void CAN1_RX0_IRQHandler(void)
  1307. {
  1308. rt_interrupt_enter();
  1309. if (CAN1->RF0R & 0x03)
  1310. {
  1311. if ((CAN1->RF0R & CAN_RF0R_FOVR0) != 0)
  1312. {
  1313. CAN1->RF0R = CAN_RF0R_FOVR0;
  1314. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1315. }
  1316. else
  1317. {
  1318. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 0 << 8);
  1319. }
  1320. CAN1->RF0R |= CAN_RF0R_RFOM0;
  1321. }
  1322. rt_interrupt_leave();
  1323. }
  1324. void CAN1_RX1_IRQHandler(void)
  1325. {
  1326. rt_interrupt_enter();
  1327. if (CAN1->RF1R & 0x03)
  1328. {
  1329. if ((CAN1->RF1R & CAN_RF1R_FOVR1) != 0)
  1330. {
  1331. CAN1->RF1R = CAN_RF1R_FOVR1;
  1332. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1333. }
  1334. else
  1335. {
  1336. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 1 << 8);
  1337. }
  1338. CAN1->RF1R |= CAN_RF1R_RFOM1;
  1339. }
  1340. rt_interrupt_leave();
  1341. }
  1342. void CAN1_TX_IRQHandler(void)
  1343. {
  1344. rt_uint32_t state;
  1345. rt_interrupt_enter();
  1346. if (CAN1->TSR & (CAN_TSR_RQCP0))
  1347. {
  1348. state = CAN1->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1349. CAN1->TSR |= CAN_TSR_RQCP0;
  1350. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1351. {
  1352. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1353. }
  1354. else
  1355. {
  1356. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1357. }
  1358. }
  1359. if (CAN1->TSR & (CAN_TSR_RQCP1))
  1360. {
  1361. state = CAN1->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1362. CAN1->TSR |= CAN_TSR_RQCP1;
  1363. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1364. {
  1365. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1366. }
  1367. else
  1368. {
  1369. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1370. }
  1371. }
  1372. if (CAN1->TSR & (CAN_TSR_RQCP2))
  1373. {
  1374. state = CAN1->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1375. CAN1->TSR |= CAN_TSR_RQCP2;
  1376. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1377. {
  1378. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1379. }
  1380. else
  1381. {
  1382. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1383. }
  1384. }
  1385. rt_interrupt_leave();
  1386. }
  1387. void CAN1_SCE_IRQHandler(void)
  1388. {
  1389. rt_uint32_t errtype;
  1390. errtype = CAN1->ESR;
  1391. rt_interrupt_enter();
  1392. if (errtype & 0x70 && bxcan1.status.lasterrtype == (errtype & 0x70))
  1393. {
  1394. switch ((errtype & 0x70) >> 4)
  1395. {
  1396. case RT_CAN_BUS_BIT_PAD_ERR:
  1397. bxcan1.status.bitpaderrcnt++;
  1398. break;
  1399. case RT_CAN_BUS_FORMAT_ERR:
  1400. bxcan1.status.formaterrcnt++;
  1401. break;
  1402. case RT_CAN_BUS_ACK_ERR:
  1403. bxcan1.status.ackerrcnt++;
  1404. break;
  1405. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1406. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1407. bxcan1.status.biterrcnt++;
  1408. break;
  1409. case RT_CAN_BUS_CRC_ERR:
  1410. bxcan1.status.crcerrcnt++;
  1411. break;
  1412. }
  1413. bxcan1.status.lasterrtype = errtype & 0x70;
  1414. CAN1->ESR &= ~0x70;
  1415. }
  1416. bxcan1.status.rcverrcnt = errtype >> 24;
  1417. bxcan1.status.snderrcnt = (errtype >> 16 & 0xFF);
  1418. bxcan1.status.errcode = errtype & 0x07;
  1419. CAN1->MSR |= CAN_MSR_ERRI;
  1420. rt_interrupt_leave();
  1421. }
  1422. #endif /*USING_BXCAN1*/
  1423. #ifdef USING_BXCAN2
  1424. static struct stm_bxcan bxcan2data =
  1425. {
  1426. CAN2,
  1427. (void *) &CAN1->sFilterRegister[BX_CAN2_FMRSTART],
  1428. CAN2_TX_IRQn,
  1429. CAN2_RX0_IRQn,
  1430. CAN2_RX1_IRQn,
  1431. CAN2_SCE_IRQn,
  1432. {
  1433. 0,
  1434. }
  1435. {0, 0},
  1436. BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART,
  1437. 7,
  1438. {
  1439. {
  1440. 0,
  1441. 0,
  1442. 2,
  1443. 24,
  1444. },
  1445. {
  1446. 0,
  1447. 0,
  1448. 2,
  1449. 24,
  1450. },
  1451. },
  1452. };
  1453. struct rt_can_device bxcan2;
  1454. void CAN2_RX0_IRQHandler(void)
  1455. {
  1456. rt_interrupt_enter();
  1457. if (CAN2->RF0R & 0x03)
  1458. {
  1459. if ((CAN2->RF0R & CAN_RF0R_FOVR0) != 0)
  1460. {
  1461. CAN2->RF0R = CAN_RF0R_FOVR0;
  1462. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1463. }
  1464. else
  1465. {
  1466. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 0 << 8);
  1467. }
  1468. CAN2->RF0R |= CAN_RF0R_RFOM0;
  1469. }
  1470. rt_interrupt_leave();
  1471. }
  1472. void CAN2_RX1_IRQHandler(void)
  1473. {
  1474. rt_interrupt_enter();
  1475. if (CAN2->RF1R & 0x03)
  1476. {
  1477. if ((CAN2->RF1R & CAN_RF1R_FOVR1) != 0)
  1478. {
  1479. CAN2->RF1R = CAN_RF1R_FOVR1;
  1480. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1481. }
  1482. else
  1483. {
  1484. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 1 << 8);
  1485. }
  1486. CAN2->RF1R |= CAN_RF1R_RFOM1;
  1487. }
  1488. rt_interrupt_leave();
  1489. }
  1490. void CAN2_TX_IRQHandler(void)
  1491. {
  1492. rt_uint32_t state;
  1493. rt_interrupt_enter();
  1494. if (CAN2->TSR & (CAN_TSR_RQCP0))
  1495. {
  1496. state = CAN2->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1497. CAN2->TSR |= CAN_TSR_RQCP0;
  1498. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1499. {
  1500. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1501. }
  1502. else
  1503. {
  1504. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1505. }
  1506. }
  1507. if (CAN2->TSR & (CAN_TSR_RQCP1))
  1508. {
  1509. state = CAN2->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1510. CAN2->TSR |= CAN_TSR_RQCP1;
  1511. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1512. {
  1513. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1514. }
  1515. else
  1516. {
  1517. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1518. }
  1519. }
  1520. if (CAN2->TSR & (CAN_TSR_RQCP2))
  1521. {
  1522. state = CAN2->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1523. CAN2->TSR |= CAN_TSR_RQCP2;
  1524. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1525. {
  1526. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1527. }
  1528. else
  1529. {
  1530. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1531. }
  1532. }
  1533. rt_interrupt_leave();
  1534. }
  1535. void CAN2_SCE_IRQHandler(void)
  1536. {
  1537. rt_uint32_t errtype;
  1538. errtype = CAN2->ESR;
  1539. rt_interrupt_enter();
  1540. if (errtype & 0x70 && bxcan2.status.lasterrtype == (errtype & 0x70))
  1541. {
  1542. switch ((errtype & 0x70) >> 4)
  1543. {
  1544. case RT_CAN_BUS_BIT_PAD_ERR:
  1545. bxcan2.status.bitpaderrcnt++;
  1546. break;
  1547. case RT_CAN_BUS_FORMAT_ERR:
  1548. bxcan2.status.formaterrcnt++;
  1549. break;
  1550. case RT_CAN_BUS_ACK_ERR:
  1551. bxcan2.status.ackerrcnt++;
  1552. break;
  1553. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1554. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1555. bxcan2.status.biterrcnt++;
  1556. break;
  1557. case RT_CAN_BUS_CRC_ERR:
  1558. bxcan2.status.crcerrcnt++;
  1559. break;
  1560. }
  1561. bxcan2.status.lasterrtype = errtype & 0x70;
  1562. CAN2->ESR &= ~0x70;
  1563. }
  1564. bxcan2.status.rcverrcnt = errtype >> 24;
  1565. bxcan2.status.snderrcnt = (errtype >> 16 & 0xFF);
  1566. bxcan2.status.errcode = errtype & 0x07;
  1567. CAN2->MSR |= CAN_MSR_ERRI;
  1568. rt_interrupt_leave();
  1569. }
  1570. #endif /*USING_BXCAN2*/
  1571. int stm32_bxcan_init(void)
  1572. {
  1573. #ifdef USING_BXCAN1
  1574. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  1575. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1576. CAN_DeInit(CAN1);
  1577. bxcan1.config.baud_rate = CAN1MBaud;
  1578. bxcan1.config.msgboxsz = 16;
  1579. bxcan1.config.sndboxnumber = 3;
  1580. bxcan1.config.mode = RT_CAN_MODE_NORMAL;
  1581. bxcan1.config.privmode = 0;
  1582. bxcan1.config.ticks = 50;
  1583. #ifdef RT_CAN_USING_HDR
  1584. bxcan1.config.maxhdr = BX_CAN2_FMRSTART * 4;
  1585. #endif
  1586. rt_hw_can_register(&bxcan1, "bxcan1", &canops, &bxcan1data);
  1587. #endif
  1588. #ifdef USING_BXCAN2
  1589. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
  1590. #ifndef USING_BXCAN1
  1591. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1592. #endif
  1593. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  1594. CAN_DeInit(CAN2);
  1595. bxcan2.config.baud_rate = CAN1MBaud;
  1596. bxcan2.config.msgboxsz = 16;
  1597. bxcan2.config.sndboxnumber = 3;
  1598. bxcan2.config.mode = RT_CAN_MODE_NORMAL;
  1599. bxcan2.config.privmode = 0;
  1600. bxcan2.config.ticks = 50;
  1601. #ifdef RT_CAN_USING_HDR
  1602. bxcan2.config.maxhdr = (BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART) * 4;
  1603. #endif
  1604. rt_hw_can_register(&bxcan2, "bxcan2", &canops, &bxcan2data);
  1605. #endif
  1606. return RT_EOK;
  1607. }
  1608. INIT_BOARD_EXPORT(stm32_bxcan_init);
  1609. #endif /*RT_USING_CAN*/