fsl_flexcan.c 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. * of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. * list of conditions and the following disclaimer in the documentation and/or
  13. * other materials provided with the distribution.
  14. *
  15. * o Neither the name of the copyright holder nor the names of its
  16. * contributors may be used to endorse or promote products derived from this
  17. * software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. #include "fsl_flexcan.h"
  31. /*******************************************************************************
  32. * Definitons
  33. ******************************************************************************/
  34. #define FLEXCAN_TIME_QUANTA_NUM (10)
  35. /*! @brief FlexCAN Internal State. */
  36. enum _flexcan_state
  37. {
  38. kFLEXCAN_StateIdle = 0x0, /*!< MB/RxFIFO idle.*/
  39. kFLEXCAN_StateRxData = 0x1, /*!< MB receiving.*/
  40. kFLEXCAN_StateRxRemote = 0x2, /*!< MB receiving remote reply.*/
  41. kFLEXCAN_StateTxData = 0x3, /*!< MB transmitting.*/
  42. kFLEXCAN_StateTxRemote = 0x4, /*!< MB transmitting remote request.*/
  43. kFLEXCAN_StateRxFifo = 0x5, /*!< RxFIFO receiving.*/
  44. };
  45. /*! @brief FlexCAN message buffer CODE for Rx buffers. */
  46. enum _flexcan_mb_code_rx
  47. {
  48. kFLEXCAN_RxMbInactive = 0x0, /*!< MB is not active.*/
  49. kFLEXCAN_RxMbFull = 0x2, /*!< MB is full.*/
  50. kFLEXCAN_RxMbEmpty = 0x4, /*!< MB is active and empty.*/
  51. kFLEXCAN_RxMbOverrun = 0x6, /*!< MB is overwritten into a full buffer.*/
  52. kFLEXCAN_RxMbBusy = 0x8, /*!< FlexCAN is updating the contents of the MB.*/
  53. /*! The CPU must not access the MB.*/
  54. kFLEXCAN_RxMbRanswer = 0xA, /*!< A frame was configured to recognize a Remote Request Frame */
  55. /*! and transmit a Response Frame in return.*/
  56. kFLEXCAN_RxMbNotUsed = 0xF, /*!< Not used.*/
  57. };
  58. /*! @brief FlexCAN message buffer CODE FOR Tx buffers. */
  59. enum _flexcan_mb_code_tx
  60. {
  61. kFLEXCAN_TxMbInactive = 0x8, /*!< MB is not active.*/
  62. kFLEXCAN_TxMbAbort = 0x9, /*!< MB is aborted.*/
  63. kFLEXCAN_TxMbDataOrRemote = 0xC, /*!< MB is a TX Data Frame(when MB RTR = 0) or */
  64. /*!< MB is a TX Remote Request Frame (when MB RTR = 1).*/
  65. kFLEXCAN_TxMbTanswer = 0xE, /*!< MB is a TX Response Request Frame from */
  66. /*! an incoming Remote Request Frame.*/
  67. kFLEXCAN_TxMbNotUsed = 0xF, /*!< Not used.*/
  68. };
  69. /* Typedef for interrupt handler. */
  70. typedef void (*flexcan_isr_t)(CAN_Type *base, flexcan_handle_t *handle);
  71. /*******************************************************************************
  72. * Prototypes
  73. ******************************************************************************/
  74. /*!
  75. * @brief Get the FlexCAN instance from peripheral base address.
  76. *
  77. * @param base FlexCAN peripheral base address.
  78. * @return FlexCAN instance.
  79. */
  80. uint32_t FLEXCAN_GetInstance(CAN_Type *base);
  81. /*!
  82. * @brief Enter FlexCAN Freeze Mode.
  83. *
  84. * This function makes the FlexCAN work under Freeze Mode.
  85. *
  86. * @param base FlexCAN peripheral base address.
  87. */
  88. static void FLEXCAN_EnterFreezeMode(CAN_Type *base);
  89. /*!
  90. * @brief Exit FlexCAN Freeze Mode.
  91. *
  92. * This function makes the FlexCAN leave Freeze Mode.
  93. *
  94. * @param base FlexCAN peripheral base address.
  95. */
  96. static void FLEXCAN_ExitFreezeMode(CAN_Type *base);
  97. #if !defined(NDEBUG)
  98. /*!
  99. * @brief Check if Message Buffer is occupied by Rx FIFO.
  100. *
  101. * This function check if Message Buffer is occupied by Rx FIFO.
  102. *
  103. * @param base FlexCAN peripheral base address.
  104. * @param mbIdx The FlexCAN Message Buffer index.
  105. */
  106. static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx);
  107. #endif
  108. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  109. /*!
  110. * @brief Get the first valid Message buffer ID of give FlexCAN instance.
  111. *
  112. * This function is a helper function for Errata 5641 workaround.
  113. *
  114. * @param base FlexCAN peripheral base address.
  115. * @return The first valid Message Buffer Number.
  116. */
  117. static uint32_t FLEXCAN_GetFirstValidMb(CAN_Type *base);
  118. #endif
  119. /*!
  120. * @brief Check if Message Buffer interrupt is enabled.
  121. *
  122. * This function check if Message Buffer interrupt is enabled.
  123. *
  124. * @param base FlexCAN peripheral base address.
  125. * @param mbIdx The FlexCAN Message Buffer index.
  126. */
  127. static bool FLEXCAN_IsMbIntEnabled(CAN_Type *base, uint8_t mbIdx);
  128. /*!
  129. * @brief Reset the FlexCAN Instance.
  130. *
  131. * Restores the FlexCAN module to reset state, notice that this function
  132. * will set all the registers to reset state so the FlexCAN module can not work
  133. * after calling this API.
  134. *
  135. * @param base FlexCAN peripheral base address.
  136. */
  137. static void FLEXCAN_Reset(CAN_Type *base);
  138. /*!
  139. * @brief Set Baud Rate of FlexCAN.
  140. *
  141. * This function set the baud rate of FlexCAN.
  142. *
  143. * @param base FlexCAN peripheral base address.
  144. * @param sourceClock_Hz Source Clock in Hz.
  145. * @param baudRate_Bps Baud Rate in Bps.
  146. */
  147. static void FLEXCAN_SetBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps);
  148. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  149. /*!
  150. * @brief Set Baud Rate of FlexCAN FD frame.
  151. *
  152. * This function set the baud rate of FlexCAN FD frame.
  153. *
  154. * @param base FlexCAN peripheral base address.
  155. * @param sourceClock_Hz Source Clock in Hz.
  156. * @param baudRateFD_Bps FD frame Baud Rate in Bps.
  157. */
  158. static void FLEXCAN_SetFDBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRateFD_Bps);
  159. #endif
  160. /*******************************************************************************
  161. * Variables
  162. ******************************************************************************/
  163. /* Array of FlexCAN peripheral base address. */
  164. static CAN_Type *const s_flexcanBases[] = CAN_BASE_PTRS;
  165. /* Array of FlexCAN IRQ number. */
  166. static const IRQn_Type s_flexcanRxWarningIRQ[] = CAN_Rx_Warning_IRQS;
  167. static const IRQn_Type s_flexcanTxWarningIRQ[] = CAN_Tx_Warning_IRQS;
  168. static const IRQn_Type s_flexcanWakeUpIRQ[] = CAN_Wake_Up_IRQS;
  169. static const IRQn_Type s_flexcanErrorIRQ[] = CAN_Error_IRQS;
  170. static const IRQn_Type s_flexcanBusOffIRQ[] = CAN_Bus_Off_IRQS;
  171. static const IRQn_Type s_flexcanMbIRQ[] = CAN_ORed_Message_buffer_IRQS;
  172. /* Array of FlexCAN handle. */
  173. static flexcan_handle_t *s_flexcanHandle[ARRAY_SIZE(s_flexcanBases)];
  174. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  175. /* Array of FlexCAN clock name. */
  176. static const clock_ip_name_t s_flexcanClock[] = FLEXCAN_CLOCKS;
  177. #if defined(FLEXCAN_PERIPH_CLOCKS)
  178. /* Array of FlexCAN serial clock name. */
  179. static const clock_ip_name_t s_flexcanPeriphClock[] = FLEXCAN_PERIPH_CLOCKS;
  180. #endif /* FLEXCAN_PERIPH_CLOCKS */
  181. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  182. /* FlexCAN ISR for transactional APIs. */
  183. static flexcan_isr_t s_flexcanIsr;
  184. /*******************************************************************************
  185. * Code
  186. ******************************************************************************/
  187. uint32_t FLEXCAN_GetInstance(CAN_Type *base)
  188. {
  189. uint32_t instance;
  190. /* Find the instance index from base address mappings. */
  191. for (instance = 0; instance < ARRAY_SIZE(s_flexcanBases); instance++)
  192. {
  193. if (s_flexcanBases[instance] == base)
  194. {
  195. break;
  196. }
  197. }
  198. assert(instance < ARRAY_SIZE(s_flexcanBases));
  199. return instance;
  200. }
  201. static void FLEXCAN_EnterFreezeMode(CAN_Type *base)
  202. {
  203. /* Set Freeze, Halt bits. */
  204. base->MCR |= CAN_MCR_HALT_MASK;
  205. /* Wait until the FlexCAN Module enter freeze mode. */
  206. while (!(base->MCR & CAN_MCR_FRZACK_MASK))
  207. {
  208. }
  209. }
  210. static void FLEXCAN_ExitFreezeMode(CAN_Type *base)
  211. {
  212. /* Clear Freeze, Halt bits. */
  213. base->MCR &= ~CAN_MCR_HALT_MASK;
  214. /* Wait until the FlexCAN Module exit freeze mode. */
  215. while (base->MCR & CAN_MCR_FRZACK_MASK)
  216. {
  217. }
  218. }
  219. #if !defined(NDEBUG)
  220. static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx)
  221. {
  222. uint8_t lastOccupiedMb;
  223. /* Is Rx FIFO enabled? */
  224. if (base->MCR & CAN_MCR_RFEN_MASK)
  225. {
  226. /* Get RFFN value. */
  227. lastOccupiedMb = ((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT);
  228. /* Calculate the number of last Message Buffer occupied by Rx FIFO. */
  229. lastOccupiedMb = ((lastOccupiedMb + 1) * 2) + 5;
  230. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  231. if (mbIdx <= (lastOccupiedMb + 1))
  232. #else
  233. if (mbIdx <= lastOccupiedMb)
  234. #endif
  235. {
  236. return true;
  237. }
  238. else
  239. {
  240. return false;
  241. }
  242. }
  243. else
  244. {
  245. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  246. if (0 == mbIdx)
  247. {
  248. return true;
  249. }
  250. else
  251. {
  252. return false;
  253. }
  254. #else
  255. return false;
  256. #endif
  257. }
  258. }
  259. #endif
  260. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  261. static uint32_t FLEXCAN_GetFirstValidMb(CAN_Type *base)
  262. {
  263. uint32_t firstValidMbNum;
  264. if (base->MCR & CAN_MCR_RFEN_MASK)
  265. {
  266. firstValidMbNum = ((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT);
  267. firstValidMbNum = ((firstValidMbNum + 1) * 2) + 6;
  268. }
  269. else
  270. {
  271. firstValidMbNum = 0;
  272. }
  273. return firstValidMbNum;
  274. }
  275. #endif
  276. static bool FLEXCAN_IsMbIntEnabled(CAN_Type *base, uint8_t mbIdx)
  277. {
  278. /* Assertion. */
  279. assert(mbIdx < FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base));
  280. #if (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  281. if (mbIdx < 32)
  282. {
  283. #endif
  284. if (base->IMASK1 & ((uint32_t)(1 << mbIdx)))
  285. {
  286. return true;
  287. }
  288. else
  289. {
  290. return false;
  291. }
  292. #if (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  293. }
  294. else
  295. {
  296. if (base->IMASK2 & ((uint32_t)(1 << (mbIdx - 32))))
  297. {
  298. return true;
  299. }
  300. else
  301. {
  302. return false;
  303. }
  304. }
  305. #endif
  306. }
  307. static void FLEXCAN_Reset(CAN_Type *base)
  308. {
  309. /* The module must should be first exit from low power
  310. * mode, and then soft reset can be applied.
  311. */
  312. assert(!(base->MCR & CAN_MCR_MDIS_MASK));
  313. uint8_t i;
  314. #if (FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT != 0)
  315. /* De-assert DOZE Enable Bit. */
  316. base->MCR &= ~CAN_MCR_DOZE_MASK;
  317. #endif
  318. /* Wait until FlexCAN exit from any Low Power Mode. */
  319. while (base->MCR & CAN_MCR_LPMACK_MASK)
  320. {
  321. }
  322. /* Assert Soft Reset Signal. */
  323. base->MCR |= CAN_MCR_SOFTRST_MASK;
  324. /* Wait until FlexCAN reset completes. */
  325. while (base->MCR & CAN_MCR_SOFTRST_MASK)
  326. {
  327. }
  328. /* Reset MCR rigister. */
  329. #if (defined(FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER) && FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER)
  330. base->MCR |= CAN_MCR_WRNEN_MASK | CAN_MCR_WAKSRC_MASK |
  331. CAN_MCR_MAXMB(FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1);
  332. #else
  333. base->MCR |= CAN_MCR_WRNEN_MASK | CAN_MCR_MAXMB(FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1);
  334. #endif
  335. /* Reset CTRL1 and CTRL2 rigister. */
  336. base->CTRL1 = CAN_CTRL1_SMP_MASK;
  337. base->CTRL2 = CAN_CTRL2_TASD(0x16) | CAN_CTRL2_RRS_MASK | CAN_CTRL2_EACEN_MASK;
  338. /* Clean all individual Rx Mask of Message Buffers. */
  339. for (i = 0; i < FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); i++)
  340. {
  341. base->RXIMR[i] = 0x3FFFFFFF;
  342. }
  343. /* Clean Global Mask of Message Buffers. */
  344. base->RXMGMASK = 0x3FFFFFFF;
  345. /* Clean Global Mask of Message Buffer 14. */
  346. base->RX14MASK = 0x3FFFFFFF;
  347. /* Clean Global Mask of Message Buffer 15. */
  348. base->RX15MASK = 0x3FFFFFFF;
  349. /* Clean Global Mask of Rx FIFO. */
  350. base->RXFGMASK = 0x3FFFFFFF;
  351. /* Clean all Message Buffer CS fields. */
  352. for (i = 0; i < FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); i++)
  353. {
  354. base->MB[i].CS = 0x0;
  355. }
  356. }
  357. static void FLEXCAN_SetBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Bps)
  358. {
  359. flexcan_timing_config_t timingConfig;
  360. uint32_t priDiv = baudRate_Bps * FLEXCAN_TIME_QUANTA_NUM;
  361. /* Assertion: Desired baud rate is too high. */
  362. assert(baudRate_Bps <= 1000000U);
  363. /* Assertion: Source clock should greater than baud rate * FLEXCAN_TIME_QUANTA_NUM. */
  364. assert(priDiv <= sourceClock_Hz);
  365. if (0 == priDiv)
  366. {
  367. priDiv = 1;
  368. }
  369. priDiv = (sourceClock_Hz / priDiv) - 1;
  370. /* Desired baud rate is too low. */
  371. if (priDiv > 0xFF)
  372. {
  373. priDiv = 0xFF;
  374. }
  375. /* FlexCAN timing setting formula:
  376. * FLEXCAN_TIME_QUANTA_NUM = 1 + (PSEG1 + 1) + (PSEG2 + 1) + (PROPSEG + 1);
  377. */
  378. timingConfig.preDivider = priDiv;
  379. timingConfig.phaseSeg1 = 3;
  380. timingConfig.phaseSeg2 = 2;
  381. timingConfig.propSeg = 1;
  382. timingConfig.rJumpwidth = 1;
  383. /* Update actual timing characteristic. */
  384. FLEXCAN_SetTimingConfig(base, &timingConfig);
  385. }
  386. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  387. static void FLEXCAN_SetFDBaudRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t baudRateFD_Bps)
  388. {
  389. flexcan_timing_config_t timingConfig;
  390. uint32_t priDiv = baudRateFD_Bps * FLEXCAN_TIME_QUANTA_NUM;
  391. /* Assertion: Desired baud rate is too high. */
  392. assert(baudRateFD_Bps <= 1000000U);
  393. /* Assertion: Source clock should greater than baud rate * FLEXCAN_TIME_QUANTA_NUM. */
  394. assert(priDiv <= sourceClock_Hz);
  395. if (0 == priDiv)
  396. {
  397. priDiv = 1;
  398. }
  399. priDiv = (sourceClock_Hz / priDiv) - 1;
  400. /* Desired baud rate is too low. */
  401. if (priDiv > 0xFF)
  402. {
  403. priDiv = 0xFF;
  404. }
  405. /* FlexCAN timing setting formula:
  406. * FLEXCAN_TIME_QUANTA_NUM = 1 + (PSEG1 + 1) + (PSEG2 + 1) + (PROPSEG + 1);
  407. */
  408. timingConfig.preDivider = priDiv;
  409. timingConfig.phaseSeg1 = 3;
  410. timingConfig.phaseSeg2 = 2;
  411. timingConfig.propSeg = 1;
  412. timingConfig.rJumpwidth = 1;
  413. /* Update actual timing characteristic. */
  414. FLEXCAN_SetFDTimingConfig(base, &timingConfig);
  415. }
  416. #endif
  417. void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *config, uint32_t sourceClock_Hz)
  418. {
  419. uint32_t mcrTemp;
  420. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  421. uint32_t instance;
  422. #endif
  423. /* Assertion. */
  424. assert(config);
  425. assert((config->maxMbNum > 0) && (config->maxMbNum <= FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)));
  426. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  427. instance = FLEXCAN_GetInstance(base);
  428. /* Enable FlexCAN clock. */
  429. CLOCK_EnableClock(s_flexcanClock[instance]);
  430. #if defined(FLEXCAN_PERIPH_CLOCKS)
  431. /* Enable FlexCAN serial clock. */
  432. CLOCK_EnableClock(s_flexcanPeriphClock[instance]);
  433. #endif /* FLEXCAN_PERIPH_CLOCKS */
  434. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  435. #if (!defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE)) || !FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE
  436. /* Disable FlexCAN Module. */
  437. FLEXCAN_Enable(base, false);
  438. /* Protocol-Engine clock source selection, This bit must be set
  439. * when FlexCAN Module in Disable Mode.
  440. */
  441. base->CTRL1 = (kFLEXCAN_ClkSrcOsc == config->clkSrc) ? base->CTRL1 & ~CAN_CTRL1_CLKSRC_MASK :
  442. base->CTRL1 | CAN_CTRL1_CLKSRC_MASK;
  443. #endif /* FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE */
  444. /* Enable FlexCAN Module for configuartion. */
  445. FLEXCAN_Enable(base, true);
  446. /* Reset to known status. */
  447. FLEXCAN_Reset(base);
  448. /* Save current MCR value and enable to enter Freeze mode(enabled by default). */
  449. mcrTemp = base->MCR;
  450. /* Set the maximum number of Message Buffers */
  451. mcrTemp = (mcrTemp & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB(config->maxMbNum - 1);
  452. /* Enable Loop Back Mode? */
  453. base->CTRL1 = (config->enableLoopBack) ? base->CTRL1 | CAN_CTRL1_LPB_MASK : base->CTRL1 & ~CAN_CTRL1_LPB_MASK;
  454. /* Enable Self Wake Up Mode? */
  455. mcrTemp = (config->enableSelfWakeup) ? mcrTemp | CAN_MCR_SLFWAK_MASK : mcrTemp & ~CAN_MCR_SLFWAK_MASK;
  456. /* Enable Individual Rx Masking? */
  457. mcrTemp = (config->enableIndividMask) ? mcrTemp | CAN_MCR_IRMQ_MASK : mcrTemp & ~CAN_MCR_IRMQ_MASK;
  458. #if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT)
  459. /* Enable Doze Mode? */
  460. mcrTemp = (config->enableDoze) ? mcrTemp | CAN_MCR_DOZE_MASK : mcrTemp & ~CAN_MCR_DOZE_MASK;
  461. #endif
  462. /* Save MCR Configuation. */
  463. base->MCR = mcrTemp;
  464. /* Baud Rate Configuration.*/
  465. FLEXCAN_SetBaudRate(base, sourceClock_Hz, config->baudRate);
  466. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  467. FLEXCAN_SetFDBaudRate(base, sourceClock_Hz, config->baudRateFD);
  468. #endif
  469. }
  470. void FLEXCAN_Deinit(CAN_Type *base)
  471. {
  472. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  473. uint32_t instance;
  474. #endif
  475. /* Reset all Register Contents. */
  476. FLEXCAN_Reset(base);
  477. /* Disable FlexCAN module. */
  478. FLEXCAN_Enable(base, false);
  479. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  480. instance = FLEXCAN_GetInstance(base);
  481. #if defined(FLEXCAN_PERIPH_CLOCKS)
  482. /* Disable FlexCAN serial clock. */
  483. CLOCK_DisableClock(s_flexcanPeriphClock[instance]);
  484. #endif /* FLEXCAN_PERIPH_CLOCKS */
  485. /* Disable FlexCAN clock. */
  486. CLOCK_DisableClock(s_flexcanClock[instance]);
  487. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  488. }
  489. void FLEXCAN_GetDefaultConfig(flexcan_config_t *config)
  490. {
  491. /* Assertion. */
  492. assert(config);
  493. /* Initialize FlexCAN Module config struct with default value. */
  494. #if (!defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE)) || !FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE
  495. config->clkSrc = kFLEXCAN_ClkSrcOsc;
  496. #endif /* FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE */
  497. config->baudRate = 1000000U;
  498. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  499. config->baudRateFD = 1000000U;
  500. #endif
  501. config->maxMbNum = 16;
  502. config->enableLoopBack = false;
  503. config->enableSelfWakeup = false;
  504. config->enableIndividMask = false;
  505. #if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT)
  506. config->enableDoze = false;
  507. #endif
  508. }
  509. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  510. void FLEXCAN_FDEnable(CAN_Type *base, flexcan_mb_size_t dataSize, bool brs)
  511. {
  512. if (brs)
  513. {
  514. base->FDCTRL &= CAN_FDCTRL_FDRATE_MASK;
  515. }
  516. else
  517. {
  518. base->FDCTRL &= ~CAN_FDCTRL_FDRATE_MASK;
  519. }
  520. /* Enter Freeze Mode. */
  521. FLEXCAN_EnterFreezeMode(base);
  522. base->MCR |= CAN_MCR_FDEN_MASK;
  523. base->FDCTRL |= CAN_FDCTRL_MBDSR0(dataSize);
  524. /* Exit Freeze Mode. */
  525. FLEXCAN_ExitFreezeMode(base);
  526. }
  527. #endif
  528. void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config)
  529. {
  530. /* Assertion. */
  531. assert(config);
  532. /* Enter Freeze Mode. */
  533. FLEXCAN_EnterFreezeMode(base);
  534. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  535. /* Cleaning previous Timing Setting. */
  536. base->CBT &= ~(CAN_CBT_EPRESDIV_MASK | CAN_CBT_ERJW_MASK | CAN_CBT_EPSEG1_MASK | CAN_CBT_EPSEG2_MASK |
  537. CAN_CBT_EPROPSEG_MASK);
  538. /* Updating Timing Setting according to configuration structure. */
  539. base->CBT |=
  540. (CAN_CBT_EPRESDIV(config->preDivider) | CAN_CBT_ERJW(config->rJumpwidth) | CAN_CBT_EPSEG1(config->phaseSeg1) |
  541. CAN_CBT_EPSEG2(config->phaseSeg2) | CAN_CBT_EPROPSEG(config->propSeg));
  542. #else
  543. /* Cleaning previous Timing Setting. */
  544. base->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_RJW_MASK | CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK |
  545. CAN_CTRL1_PROPSEG_MASK);
  546. /* Updating Timing Setting according to configuration structure. */
  547. base->CTRL1 |=
  548. (CAN_CTRL1_PRESDIV(config->preDivider) | CAN_CTRL1_RJW(config->rJumpwidth) |
  549. CAN_CTRL1_PSEG1(config->phaseSeg1) | CAN_CTRL1_PSEG2(config->phaseSeg2) | CAN_CTRL1_PROPSEG(config->propSeg));
  550. #endif
  551. /* Exit Freeze Mode. */
  552. FLEXCAN_ExitFreezeMode(base);
  553. }
  554. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  555. void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config)
  556. {
  557. /* Assertion. */
  558. assert(config);
  559. /* Enter Freeze Mode. */
  560. FLEXCAN_EnterFreezeMode(base);
  561. /* Cleaning previous Timing Setting. */
  562. base->FDCBT &= ~(CAN_FDCBT_FPRESDIV_MASK | CAN_FDCBT_FRJW_MASK | CAN_FDCBT_FPSEG1_MASK | CAN_FDCBT_FPSEG2_MASK |
  563. CAN_FDCBT_FPROPSEG_MASK);
  564. /* Updating Timing Setting according to configuration structure. */
  565. base->FDCBT |= (CAN_FDCBT_FPRESDIV(config->preDivider) | CAN_FDCBT_FRJW(config->rJumpwidth) |
  566. CAN_FDCBT_FPSEG1(config->phaseSeg1) | CAN_FDCBT_FPSEG2(config->phaseSeg2) |
  567. CAN_FDCBT_FPROPSEG(config->propSeg));
  568. /* Exit Freeze Mode. */
  569. FLEXCAN_ExitFreezeMode(base);
  570. }
  571. #endif
  572. void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask)
  573. {
  574. /* Enter Freeze Mode. */
  575. FLEXCAN_EnterFreezeMode(base);
  576. /* Setting Rx Message Buffer Global Mask value. */
  577. base->RXMGMASK = mask;
  578. base->RX14MASK = mask;
  579. base->RX15MASK = mask;
  580. /* Exit Freeze Mode. */
  581. FLEXCAN_ExitFreezeMode(base);
  582. }
  583. void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask)
  584. {
  585. /* Enter Freeze Mode. */
  586. FLEXCAN_EnterFreezeMode(base);
  587. /* Setting Rx FIFO Global Mask value. */
  588. base->RXFGMASK = mask;
  589. /* Exit Freeze Mode. */
  590. FLEXCAN_ExitFreezeMode(base);
  591. }
  592. void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask)
  593. {
  594. assert(maskIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  595. /* Enter Freeze Mode. */
  596. FLEXCAN_EnterFreezeMode(base);
  597. /* Setting Rx Individual Mask value. */
  598. base->RXIMR[maskIdx] = mask;
  599. /* Exit Freeze Mode. */
  600. FLEXCAN_ExitFreezeMode(base);
  601. }
  602. void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable)
  603. {
  604. /* Assertion. */
  605. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  606. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  607. /* Inactivate Message Buffer. */
  608. if (enable)
  609. {
  610. base->MB[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  611. }
  612. else
  613. {
  614. base->MB[mbIdx].CS = 0;
  615. }
  616. /* Clean Message Buffer content. */
  617. base->MB[mbIdx].ID = 0x0;
  618. base->MB[mbIdx].WORD0 = 0x0;
  619. base->MB[mbIdx].WORD1 = 0x0;
  620. }
  621. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  622. void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable)
  623. {
  624. /* Assertion. */
  625. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  626. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  627. uint8_t cnt = 0;
  628. uint32_t dataSize;
  629. dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT;
  630. /* Inactivate Message Buffer. */
  631. if (enable)
  632. {
  633. switch (dataSize)
  634. {
  635. case kFLEXCAN_8BperMB:
  636. base->MB_8B[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  637. break;
  638. case kFLEXCAN_16BperMB:
  639. base->MB_16B[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  640. break;
  641. case kFLEXCAN_32BperMB:
  642. base->MB_32B[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  643. break;
  644. case kFLEXCAN_64BperMB:
  645. base->MB_64B[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  646. break;
  647. default:
  648. break;
  649. }
  650. }
  651. else
  652. {
  653. switch (dataSize)
  654. {
  655. case kFLEXCAN_8BperMB:
  656. base->MB_8B[mbIdx].CS = 0;
  657. break;
  658. case kFLEXCAN_16BperMB:
  659. base->MB_16B[mbIdx].CS = 0;
  660. break;
  661. case kFLEXCAN_32BperMB:
  662. base->MB_32B[mbIdx].CS = 0;
  663. break;
  664. case kFLEXCAN_64BperMB:
  665. base->MB_64B[mbIdx].CS = 0;
  666. break;
  667. default:
  668. break;
  669. }
  670. }
  671. /* Clean ID and Message Buffer content. */
  672. switch (dataSize)
  673. {
  674. case kFLEXCAN_8BperMB:
  675. base->MB_8B[mbIdx].ID = 0x0;
  676. for (cnt = 0; cnt < 2; cnt++)
  677. {
  678. base->MB_8B[mbIdx].WORD[cnt] = 0x0;
  679. }
  680. break;
  681. case kFLEXCAN_16BperMB:
  682. base->MB_16B[mbIdx].ID = 0x0;
  683. for (cnt = 0; cnt < 4; cnt++)
  684. {
  685. base->MB_16B[mbIdx].WORD[cnt] = 0x0;
  686. }
  687. break;
  688. case kFLEXCAN_32BperMB:
  689. base->MB_32B[mbIdx].ID = 0x0;
  690. for (cnt = 0; cnt < 8; cnt++)
  691. {
  692. base->MB_32B[mbIdx].WORD[cnt] = 0x0;
  693. }
  694. break;
  695. case kFLEXCAN_64BperMB:
  696. base->MB_64B[mbIdx].ID = 0x0;
  697. for (cnt = 0; cnt < 16; cnt++)
  698. {
  699. base->MB_64B[mbIdx].WORD[cnt] = 0x0;
  700. }
  701. break;
  702. default:
  703. break;
  704. }
  705. }
  706. #endif
  707. void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable)
  708. {
  709. /* Assertion. */
  710. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  711. assert(((config) || (false == enable)));
  712. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  713. uint32_t cs_temp = 0;
  714. /* Inactivate Message Buffer. */
  715. base->MB[mbIdx].CS = 0;
  716. /* Clean Message Buffer content. */
  717. base->MB[mbIdx].ID = 0x0;
  718. base->MB[mbIdx].WORD0 = 0x0;
  719. base->MB[mbIdx].WORD1 = 0x0;
  720. if (enable)
  721. {
  722. /* Setup Message Buffer ID. */
  723. base->MB[mbIdx].ID = config->id;
  724. /* Setup Message Buffer format. */
  725. if (kFLEXCAN_FrameFormatExtend == config->format)
  726. {
  727. cs_temp |= CAN_CS_IDE_MASK;
  728. }
  729. /* Setup Message Buffer type. */
  730. if (kFLEXCAN_FrameTypeRemote == config->type)
  731. {
  732. cs_temp |= CAN_CS_RTR_MASK;
  733. }
  734. /* Activate Rx Message Buffer. */
  735. cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty);
  736. base->MB[mbIdx].CS = cs_temp;
  737. }
  738. }
  739. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  740. void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable)
  741. {
  742. /* Assertion. */
  743. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  744. assert(((config) || (false == enable)));
  745. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  746. uint32_t cs_temp = 0;
  747. uint8_t cnt = 0;
  748. uint32_t dataSize;
  749. dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT;
  750. /* Inactivate Message Buffer and clean ID, Message Buffer content. */
  751. switch (dataSize)
  752. {
  753. case kFLEXCAN_8BperMB:
  754. base->MB_8B[mbIdx].CS = 0;
  755. base->MB_8B[mbIdx].ID = 0x0;
  756. for (cnt = 0; cnt < 2; cnt++)
  757. {
  758. base->MB_8B[mbIdx].WORD[cnt] = 0x0;
  759. }
  760. break;
  761. case kFLEXCAN_16BperMB:
  762. base->MB_16B[mbIdx].CS = 0;
  763. base->MB_16B[mbIdx].ID = 0x0;
  764. for (cnt = 0; cnt < 4; cnt++)
  765. {
  766. base->MB_16B[mbIdx].WORD[cnt] = 0x0;
  767. }
  768. break;
  769. case kFLEXCAN_32BperMB:
  770. base->MB_32B[mbIdx].CS = 0;
  771. base->MB_32B[mbIdx].ID = 0x0;
  772. for (cnt = 0; cnt < 8; cnt++)
  773. {
  774. base->MB_32B[mbIdx].WORD[cnt] = 0x0;
  775. }
  776. break;
  777. case kFLEXCAN_64BperMB:
  778. base->MB_64B[mbIdx].CS = 0;
  779. base->MB_64B[mbIdx].ID = 0x0;
  780. for (cnt = 0; cnt < 16; cnt++)
  781. {
  782. base->MB_64B[mbIdx].WORD[cnt] = 0x0;
  783. }
  784. break;
  785. default:
  786. break;
  787. }
  788. if (enable)
  789. {
  790. /* Setup Message Buffer ID. */
  791. switch (dataSize)
  792. {
  793. case kFLEXCAN_8BperMB:
  794. base->MB_8B[mbIdx].ID = config->id;
  795. break;
  796. case kFLEXCAN_16BperMB:
  797. base->MB_16B[mbIdx].ID = config->id;
  798. break;
  799. case kFLEXCAN_32BperMB:
  800. base->MB_32B[mbIdx].ID = config->id;
  801. break;
  802. case kFLEXCAN_64BperMB:
  803. base->MB_64B[mbIdx].ID = config->id;
  804. break;
  805. default:
  806. break;
  807. }
  808. /* Setup Message Buffer format. */
  809. if (kFLEXCAN_FrameFormatExtend == config->format)
  810. {
  811. cs_temp |= CAN_CS_IDE_MASK;
  812. }
  813. /* Activate Rx Message Buffer. */
  814. cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty);
  815. switch (dataSize)
  816. {
  817. case kFLEXCAN_8BperMB:
  818. base->MB_8B[mbIdx].CS = cs_temp;
  819. break;
  820. case kFLEXCAN_16BperMB:
  821. base->MB_16B[mbIdx].CS = cs_temp;
  822. break;
  823. case kFLEXCAN_32BperMB:
  824. base->MB_32B[mbIdx].CS = cs_temp;
  825. break;
  826. case kFLEXCAN_64BperMB:
  827. base->MB_64B[mbIdx].CS = cs_temp;
  828. break;
  829. default:
  830. break;
  831. }
  832. }
  833. }
  834. #endif
  835. void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *config, bool enable)
  836. {
  837. /* Assertion. */
  838. assert((config) || (false == enable));
  839. volatile uint32_t *idFilterRegion = (volatile uint32_t *)(&base->MB[6].CS);
  840. uint8_t setup_mb, i, rffn = 0;
  841. /* Enter Freeze Mode. */
  842. FLEXCAN_EnterFreezeMode(base);
  843. if (enable)
  844. {
  845. assert(config->idFilterNum <= 128);
  846. /* Get the setup_mb value. */
  847. setup_mb = (base->MCR & CAN_MCR_MAXMB_MASK) >> CAN_MCR_MAXMB_SHIFT;
  848. setup_mb = (setup_mb < FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)) ?
  849. setup_mb :
  850. FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base);
  851. /* Determine RFFN value. */
  852. for (i = 0; i <= 0xF; i++)
  853. {
  854. if ((8 * (i + 1)) >= config->idFilterNum)
  855. {
  856. rffn = i;
  857. assert(((setup_mb - 8) - (2 * rffn)) > 0);
  858. base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_RFFN_MASK) | CAN_CTRL2_RFFN(rffn);
  859. break;
  860. }
  861. }
  862. }
  863. else
  864. {
  865. rffn = (base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT;
  866. }
  867. /* Clean ID filter table occuyied Message Buffer Region. */
  868. rffn = (rffn + 1) * 8;
  869. for (i = 0; i < rffn; i++)
  870. {
  871. idFilterRegion[i] = 0x0;
  872. }
  873. if (enable)
  874. {
  875. /* Disable unused Rx FIFO Filter. */
  876. for (i = config->idFilterNum; i < rffn; i++)
  877. {
  878. idFilterRegion[i] = 0xFFFFFFFFU;
  879. }
  880. /* Copy ID filter table to Message Buffer Region. */
  881. for (i = 0; i < config->idFilterNum; i++)
  882. {
  883. idFilterRegion[i] = config->idFilterTable[i];
  884. }
  885. /* Setup ID Fitlter Type. */
  886. switch (config->idFilterType)
  887. {
  888. case kFLEXCAN_RxFifoFilterTypeA:
  889. base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x0);
  890. break;
  891. case kFLEXCAN_RxFifoFilterTypeB:
  892. base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x1);
  893. break;
  894. case kFLEXCAN_RxFifoFilterTypeC:
  895. base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x2);
  896. break;
  897. case kFLEXCAN_RxFifoFilterTypeD:
  898. /* All frames rejected. */
  899. base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x3);
  900. break;
  901. default:
  902. break;
  903. }
  904. /* Setting Message Reception Priority. */
  905. base->CTRL2 = (config->priority == kFLEXCAN_RxFifoPrioHigh) ? base->CTRL2 & ~CAN_CTRL2_MRP_MASK :
  906. base->CTRL2 | CAN_CTRL2_MRP_MASK;
  907. /* Enable Rx Message FIFO. */
  908. base->MCR |= CAN_MCR_RFEN_MASK;
  909. }
  910. else
  911. {
  912. /* Disable Rx Message FIFO. */
  913. base->MCR &= ~CAN_MCR_RFEN_MASK;
  914. /* Clean MB0 ~ MB5. */
  915. FLEXCAN_SetRxMbConfig(base, 0, NULL, false);
  916. FLEXCAN_SetRxMbConfig(base, 1, NULL, false);
  917. FLEXCAN_SetRxMbConfig(base, 2, NULL, false);
  918. FLEXCAN_SetRxMbConfig(base, 3, NULL, false);
  919. FLEXCAN_SetRxMbConfig(base, 4, NULL, false);
  920. FLEXCAN_SetRxMbConfig(base, 5, NULL, false);
  921. }
  922. /* Exit Freeze Mode. */
  923. FLEXCAN_ExitFreezeMode(base);
  924. }
  925. #if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA)
  926. void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable)
  927. {
  928. if (enable)
  929. {
  930. /* Enter Freeze Mode. */
  931. FLEXCAN_EnterFreezeMode(base);
  932. /* Enable FlexCAN DMA. */
  933. base->MCR |= CAN_MCR_DMA_MASK;
  934. /* Exit Freeze Mode. */
  935. FLEXCAN_ExitFreezeMode(base);
  936. }
  937. else
  938. {
  939. /* Enter Freeze Mode. */
  940. FLEXCAN_EnterFreezeMode(base);
  941. /* Disable FlexCAN DMA. */
  942. base->MCR &= ~CAN_MCR_DMA_MASK;
  943. /* Exit Freeze Mode. */
  944. FLEXCAN_ExitFreezeMode(base);
  945. }
  946. }
  947. #endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */
  948. status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *txFrame)
  949. {
  950. /* Assertion. */
  951. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  952. assert(txFrame);
  953. assert(txFrame->length <= 8);
  954. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  955. uint32_t cs_temp = 0;
  956. /* Check if Message Buffer is available. */
  957. if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (base->MB[mbIdx].CS & CAN_CS_CODE_MASK))
  958. {
  959. /* Inactive Tx Message Buffer. */
  960. base->MB[mbIdx].CS = (base->MB[mbIdx].CS & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  961. /* Fill Message ID field. */
  962. base->MB[mbIdx].ID = txFrame->id;
  963. /* Fill Message Format field. */
  964. if (kFLEXCAN_FrameFormatExtend == txFrame->format)
  965. {
  966. cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK;
  967. }
  968. /* Fill Message Type field. */
  969. if (kFLEXCAN_FrameTypeRemote == txFrame->type)
  970. {
  971. cs_temp |= CAN_CS_RTR_MASK;
  972. }
  973. cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(txFrame->length);
  974. /* Load Message Payload. */
  975. base->MB[mbIdx].WORD0 = txFrame->dataWord0;
  976. base->MB[mbIdx].WORD1 = txFrame->dataWord1;
  977. /* Activate Tx Message Buffer. */
  978. base->MB[mbIdx].CS = cs_temp;
  979. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  980. base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  981. base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  982. #endif
  983. return kStatus_Success;
  984. }
  985. else
  986. {
  987. /* Tx Message Buffer is activated, return immediately. */
  988. return kStatus_Fail;
  989. }
  990. }
  991. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  992. status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *txFrame)
  993. {
  994. /* Assertion. */
  995. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  996. assert(txFrame);
  997. assert(txFrame->length <= 15);
  998. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  999. uint32_t cs_temp = 0;
  1000. uint8_t cnt = 0;
  1001. uint32_t can_cs = 0;
  1002. uint32_t dataSize;
  1003. dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT;
  1004. switch (dataSize)
  1005. {
  1006. case kFLEXCAN_8BperMB:
  1007. can_cs = base->MB_8B[mbIdx].CS;
  1008. break;
  1009. case kFLEXCAN_16BperMB:
  1010. can_cs = base->MB_16B[mbIdx].CS;
  1011. break;
  1012. case kFLEXCAN_32BperMB:
  1013. can_cs = base->MB_32B[mbIdx].CS;
  1014. break;
  1015. case kFLEXCAN_64BperMB:
  1016. can_cs = base->MB_64B[mbIdx].CS;
  1017. break;
  1018. default:
  1019. break;
  1020. }
  1021. /* Check if Message Buffer is available. */
  1022. if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (can_cs & CAN_CS_CODE_MASK))
  1023. {
  1024. /* Inactive Tx Message Buffer and Fill Message ID field. */
  1025. switch (dataSize)
  1026. {
  1027. case kFLEXCAN_8BperMB:
  1028. base->MB_8B[mbIdx].CS = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1029. base->MB_8B[mbIdx].ID = txFrame->id;
  1030. break;
  1031. case kFLEXCAN_16BperMB:
  1032. base->MB_16B[mbIdx].CS = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1033. base->MB_16B[mbIdx].ID = txFrame->id;
  1034. break;
  1035. case kFLEXCAN_32BperMB:
  1036. base->MB_32B[mbIdx].CS = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1037. base->MB_32B[mbIdx].ID = txFrame->id;
  1038. break;
  1039. case kFLEXCAN_64BperMB:
  1040. base->MB_64B[mbIdx].CS = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1041. base->MB_64B[mbIdx].ID = txFrame->id;
  1042. break;
  1043. default:
  1044. break;
  1045. }
  1046. /* Fill Message Format field. */
  1047. if (kFLEXCAN_FrameFormatExtend == txFrame->format)
  1048. {
  1049. cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK;
  1050. }
  1051. cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(txFrame->length) | CAN_CS_EDL(1);
  1052. /* Load Message Payload and Activate Tx Message Buffer. */
  1053. switch (dataSize)
  1054. {
  1055. case kFLEXCAN_8BperMB:
  1056. for (cnt = 0; cnt < 2; cnt++)
  1057. {
  1058. base->MB_8B[mbIdx].WORD[cnt] = txFrame->dataWord[cnt];
  1059. }
  1060. base->MB_8B[mbIdx].CS = cs_temp;
  1061. break;
  1062. case kFLEXCAN_16BperMB:
  1063. for (cnt = 0; cnt < 4; cnt++)
  1064. {
  1065. base->MB_16B[mbIdx].WORD[cnt] = txFrame->dataWord[cnt];
  1066. }
  1067. base->MB_16B[mbIdx].CS = cs_temp;
  1068. break;
  1069. case kFLEXCAN_32BperMB:
  1070. for (cnt = 0; cnt < 8; cnt++)
  1071. {
  1072. base->MB_32B[mbIdx].WORD[cnt] = txFrame->dataWord[cnt];
  1073. }
  1074. base->MB_32B[mbIdx].CS = cs_temp;
  1075. break;
  1076. case kFLEXCAN_64BperMB:
  1077. for (cnt = 0; cnt < 16; cnt++)
  1078. {
  1079. base->MB_64B[mbIdx].WORD[cnt] = txFrame->dataWord[cnt];
  1080. }
  1081. base->MB_64B[mbIdx].CS = cs_temp;
  1082. break;
  1083. default:
  1084. break;
  1085. }
  1086. #if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641)
  1087. base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1088. base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive);
  1089. #endif
  1090. return kStatus_Success;
  1091. }
  1092. else
  1093. {
  1094. /* Tx Message Buffer is activated, return immediately. */
  1095. return kStatus_Fail;
  1096. }
  1097. }
  1098. #endif
  1099. status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame)
  1100. {
  1101. /* Assertion. */
  1102. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1103. assert(rxFrame);
  1104. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1105. uint32_t cs_temp;
  1106. uint8_t rx_code;
  1107. /* Read CS field of Rx Message Buffer to lock Message Buffer. */
  1108. cs_temp = base->MB[mbIdx].CS;
  1109. /* Get Rx Message Buffer Code field. */
  1110. rx_code = (cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT;
  1111. /* Check to see if Rx Message Buffer is full. */
  1112. if ((kFLEXCAN_RxMbFull == rx_code) || (kFLEXCAN_RxMbOverrun == rx_code))
  1113. {
  1114. /* Store Message ID. */
  1115. rxFrame->id = base->MB[mbIdx].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK);
  1116. /* Get the message ID and format. */
  1117. rxFrame->format = (cs_temp & CAN_CS_IDE_MASK) ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard;
  1118. /* Get the message type. */
  1119. rxFrame->type = (cs_temp & CAN_CS_RTR_MASK) ? kFLEXCAN_FrameTypeRemote : kFLEXCAN_FrameTypeData;
  1120. /* Get the message length. */
  1121. rxFrame->length = (cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT;
  1122. /* Store Message Payload. */
  1123. rxFrame->dataWord0 = base->MB[mbIdx].WORD0;
  1124. rxFrame->dataWord1 = base->MB[mbIdx].WORD1;
  1125. /* Read free-running timer to unlock Rx Message Buffer. */
  1126. (void)base->TIMER;
  1127. if (kFLEXCAN_RxMbFull == rx_code)
  1128. {
  1129. return kStatus_Success;
  1130. }
  1131. else
  1132. {
  1133. return kStatus_FLEXCAN_RxOverflow;
  1134. }
  1135. }
  1136. else
  1137. {
  1138. /* Read free-running timer to unlock Rx Message Buffer. */
  1139. (void)base->TIMER;
  1140. return kStatus_Fail;
  1141. }
  1142. }
  1143. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1144. status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *rxFrame)
  1145. {
  1146. /* Assertion. */
  1147. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1148. assert(rxFrame);
  1149. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1150. uint32_t cs_temp;
  1151. uint8_t rx_code;
  1152. uint8_t cnt = 0;
  1153. uint32_t can_id = 0;
  1154. uint32_t dataSize;
  1155. dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT;
  1156. cs_temp = base->MB[mbIdx].CS;
  1157. /* Read CS field of Rx Message Buffer to lock Message Buffer. */
  1158. switch (dataSize)
  1159. {
  1160. case kFLEXCAN_8BperMB:
  1161. cs_temp = base->MB_8B[mbIdx].CS;
  1162. can_id = base->MB_8B[mbIdx].ID;
  1163. break;
  1164. case kFLEXCAN_16BperMB:
  1165. cs_temp = base->MB_16B[mbIdx].CS;
  1166. can_id = base->MB_16B[mbIdx].ID;
  1167. break;
  1168. case kFLEXCAN_32BperMB:
  1169. cs_temp = base->MB_32B[mbIdx].CS;
  1170. can_id = base->MB_32B[mbIdx].ID;
  1171. break;
  1172. case kFLEXCAN_64BperMB:
  1173. cs_temp = base->MB_64B[mbIdx].CS;
  1174. can_id = base->MB_64B[mbIdx].ID;
  1175. break;
  1176. default:
  1177. break;
  1178. }
  1179. /* Get Rx Message Buffer Code field. */
  1180. rx_code = (cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT;
  1181. /* Check to see if Rx Message Buffer is full. */
  1182. if ((kFLEXCAN_RxMbFull == rx_code) || (kFLEXCAN_RxMbOverrun == rx_code))
  1183. {
  1184. /* Store Message ID. */
  1185. rxFrame->id = can_id & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK);
  1186. /* Get the message ID and format. */
  1187. rxFrame->format = (cs_temp & CAN_CS_IDE_MASK) ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard;
  1188. /* Get the message type. */
  1189. rxFrame->type = (cs_temp & CAN_CS_RTR_MASK) ? kFLEXCAN_FrameTypeRemote : kFLEXCAN_FrameTypeData;
  1190. /* Get the message length. */
  1191. rxFrame->length = (cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT;
  1192. /* Store Message Payload. */
  1193. switch (dataSize)
  1194. {
  1195. case kFLEXCAN_8BperMB:
  1196. for (cnt = 0; cnt < 2; cnt++)
  1197. {
  1198. rxFrame->dataWord[cnt] = base->MB_8B[mbIdx].WORD[cnt];
  1199. }
  1200. break;
  1201. case kFLEXCAN_16BperMB:
  1202. for (cnt = 0; cnt < 4; cnt++)
  1203. {
  1204. rxFrame->dataWord[cnt] = base->MB_16B[mbIdx].WORD[cnt];
  1205. }
  1206. break;
  1207. case kFLEXCAN_32BperMB:
  1208. for (cnt = 0; cnt < 8; cnt++)
  1209. {
  1210. rxFrame->dataWord[cnt] = base->MB_32B[mbIdx].WORD[cnt];
  1211. }
  1212. break;
  1213. case kFLEXCAN_64BperMB:
  1214. for (cnt = 0; cnt < 16; cnt++)
  1215. {
  1216. rxFrame->dataWord[cnt] = base->MB_64B[mbIdx].WORD[cnt];
  1217. }
  1218. break;
  1219. default:
  1220. break;
  1221. }
  1222. /* Read free-running timer to unlock Rx Message Buffer. */
  1223. (void)base->TIMER;
  1224. if (kFLEXCAN_RxMbFull == rx_code)
  1225. {
  1226. return kStatus_Success;
  1227. }
  1228. else
  1229. {
  1230. return kStatus_FLEXCAN_RxOverflow;
  1231. }
  1232. }
  1233. else
  1234. {
  1235. /* Read free-running timer to unlock Rx Message Buffer. */
  1236. (void)base->TIMER;
  1237. return kStatus_Fail;
  1238. }
  1239. }
  1240. #endif
  1241. status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *rxFrame)
  1242. {
  1243. /* Assertion. */
  1244. assert(rxFrame);
  1245. uint32_t cs_temp;
  1246. /* Check if Rx FIFO is Enabled. */
  1247. if (base->MCR & CAN_MCR_RFEN_MASK)
  1248. {
  1249. /* Read CS field of Rx Message Buffer to lock Message Buffer. */
  1250. cs_temp = base->MB[0].CS;
  1251. /* Read data from Rx FIFO output port. */
  1252. /* Store Message ID. */
  1253. rxFrame->id = base->MB[0].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK);
  1254. /* Get the message ID and format. */
  1255. rxFrame->format = (cs_temp & CAN_CS_IDE_MASK) ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard;
  1256. /* Get the message type. */
  1257. rxFrame->type = (cs_temp & CAN_CS_RTR_MASK) ? kFLEXCAN_FrameTypeRemote : kFLEXCAN_FrameTypeData;
  1258. /* Get the message length. */
  1259. rxFrame->length = (cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT;
  1260. /* Store Message Payload. */
  1261. rxFrame->dataWord0 = base->MB[0].WORD0;
  1262. rxFrame->dataWord1 = base->MB[0].WORD1;
  1263. /* Store ID Filter Hit Index. */
  1264. rxFrame->idhit = (uint8_t)(base->RXFIR & CAN_RXFIR_IDHIT_MASK);
  1265. /* Read free-running timer to unlock Rx Message Buffer. */
  1266. (void)base->TIMER;
  1267. return kStatus_Success;
  1268. }
  1269. else
  1270. {
  1271. return kStatus_Fail;
  1272. }
  1273. }
  1274. status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *txFrame)
  1275. {
  1276. /* Write Tx Message Buffer to initiate a data sending. */
  1277. if (kStatus_Success == FLEXCAN_WriteTxMb(base, mbIdx, txFrame))
  1278. {
  1279. /* Wait until CAN Message send out. */
  1280. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1281. while (!FLEXCAN_GetMbStatusFlags(base, (uint64_t)1 << mbIdx))
  1282. #else
  1283. while (!FLEXCAN_GetMbStatusFlags(base, 1 << mbIdx))
  1284. #endif
  1285. {
  1286. }
  1287. /* Clean Tx Message Buffer Flag. */
  1288. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1289. FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1 << mbIdx);
  1290. #else
  1291. FLEXCAN_ClearMbStatusFlags(base, 1 << mbIdx);
  1292. #endif
  1293. return kStatus_Success;
  1294. }
  1295. else
  1296. {
  1297. return kStatus_Fail;
  1298. }
  1299. }
  1300. status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame)
  1301. {
  1302. /* Wait until Rx Message Buffer non-empty. */
  1303. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1304. while (!FLEXCAN_GetMbStatusFlags(base, (uint64_t)1 << mbIdx))
  1305. #else
  1306. while (!FLEXCAN_GetMbStatusFlags(base, 1 << mbIdx))
  1307. #endif
  1308. {
  1309. }
  1310. /* Clean Rx Message Buffer Flag. */
  1311. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1312. FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1 << mbIdx);
  1313. #else
  1314. FLEXCAN_ClearMbStatusFlags(base, 1 << mbIdx);
  1315. #endif
  1316. /* Read Received CAN Message. */
  1317. return FLEXCAN_ReadRxMb(base, mbIdx, rxFrame);
  1318. }
  1319. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1320. status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *txFrame)
  1321. {
  1322. /* Write Tx Message Buffer to initiate a data sending. */
  1323. if (kStatus_Success == FLEXCAN_WriteFDTxMb(base, mbIdx, txFrame))
  1324. {
  1325. /* Wait until CAN Message send out. */
  1326. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1327. while (!FLEXCAN_GetMbStatusFlags(base, (uint64_t)1 << mbIdx))
  1328. #else
  1329. while (!FLEXCAN_GetMbStatusFlags(base, 1 << mbIdx))
  1330. #endif
  1331. {
  1332. }
  1333. /* Clean Tx Message Buffer Flag. */
  1334. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1335. FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1 << mbIdx);
  1336. #else
  1337. FLEXCAN_ClearMbStatusFlags(base, 1 << mbIdx);
  1338. #endif
  1339. return kStatus_Success;
  1340. }
  1341. else
  1342. {
  1343. return kStatus_Fail;
  1344. }
  1345. }
  1346. status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *rxFrame)
  1347. {
  1348. /* Wait until Rx Message Buffer non-empty. */
  1349. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1350. while (!FLEXCAN_GetMbStatusFlags(base, (uint64_t)1 << mbIdx))
  1351. #else
  1352. while (!FLEXCAN_GetMbStatusFlags(base, 1 << mbIdx))
  1353. #endif
  1354. {
  1355. }
  1356. /* Clean Rx Message Buffer Flag. */
  1357. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1358. FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1 << mbIdx);
  1359. #else
  1360. FLEXCAN_ClearMbStatusFlags(base, 1 << mbIdx);
  1361. #endif
  1362. /* Read Received CAN Message. */
  1363. return FLEXCAN_ReadFDRxMb(base, mbIdx, rxFrame);
  1364. }
  1365. #endif
  1366. status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *rxFrame)
  1367. {
  1368. status_t rxFifoStatus;
  1369. /* Wait until Rx FIFO non-empty. */
  1370. while (!FLEXCAN_GetMbStatusFlags(base, kFLEXCAN_RxFifoFrameAvlFlag))
  1371. {
  1372. }
  1373. /* */
  1374. rxFifoStatus = FLEXCAN_ReadRxFifo(base, rxFrame);
  1375. /* Clean Rx Fifo available flag. */
  1376. FLEXCAN_ClearMbStatusFlags(base, kFLEXCAN_RxFifoFrameAvlFlag);
  1377. return rxFifoStatus;
  1378. }
  1379. void FLEXCAN_TransferCreateHandle(CAN_Type *base,
  1380. flexcan_handle_t *handle,
  1381. flexcan_transfer_callback_t callback,
  1382. void *userData)
  1383. {
  1384. assert(handle);
  1385. uint8_t instance;
  1386. /* Clean FlexCAN transfer handle. */
  1387. memset(handle, 0, sizeof(*handle));
  1388. /* Get instance from peripheral base address. */
  1389. instance = FLEXCAN_GetInstance(base);
  1390. /* Save the context in global variables to support the double weak mechanism. */
  1391. s_flexcanHandle[instance] = handle;
  1392. /* Register Callback function. */
  1393. handle->callback = callback;
  1394. handle->userData = userData;
  1395. s_flexcanIsr = FLEXCAN_TransferHandleIRQ;
  1396. /* We Enable Error & Status interrupt here, because this interrupt just
  1397. * report current status of FlexCAN module through Callback function.
  1398. * It is insignificance without a available callback function.
  1399. */
  1400. if (handle->callback != NULL)
  1401. {
  1402. FLEXCAN_EnableInterrupts(base, kFLEXCAN_BusOffInterruptEnable | kFLEXCAN_ErrorInterruptEnable |
  1403. kFLEXCAN_RxWarningInterruptEnable | kFLEXCAN_TxWarningInterruptEnable |
  1404. kFLEXCAN_WakeUpInterruptEnable);
  1405. }
  1406. else
  1407. {
  1408. FLEXCAN_DisableInterrupts(base, kFLEXCAN_BusOffInterruptEnable | kFLEXCAN_ErrorInterruptEnable |
  1409. kFLEXCAN_RxWarningInterruptEnable | kFLEXCAN_TxWarningInterruptEnable |
  1410. kFLEXCAN_WakeUpInterruptEnable);
  1411. }
  1412. /* Enable interrupts in NVIC. */
  1413. EnableIRQ((IRQn_Type)(s_flexcanRxWarningIRQ[instance]));
  1414. EnableIRQ((IRQn_Type)(s_flexcanTxWarningIRQ[instance]));
  1415. EnableIRQ((IRQn_Type)(s_flexcanWakeUpIRQ[instance]));
  1416. EnableIRQ((IRQn_Type)(s_flexcanErrorIRQ[instance]));
  1417. EnableIRQ((IRQn_Type)(s_flexcanBusOffIRQ[instance]));
  1418. EnableIRQ((IRQn_Type)(s_flexcanMbIRQ[instance]));
  1419. }
  1420. status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
  1421. {
  1422. /* Assertion. */
  1423. assert(handle);
  1424. assert(xfer);
  1425. assert(xfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1426. assert(!FLEXCAN_IsMbOccupied(base, xfer->mbIdx));
  1427. /* Check if Message Buffer is idle. */
  1428. if (kFLEXCAN_StateIdle == handle->mbState[xfer->mbIdx])
  1429. {
  1430. /* Distinguish transmit type. */
  1431. if (kFLEXCAN_FrameTypeRemote == xfer->frame->type)
  1432. {
  1433. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateTxRemote;
  1434. /* Register user Frame buffer to receive remote Frame. */
  1435. handle->mbFrameBuf[xfer->mbIdx] = xfer->frame;
  1436. }
  1437. else
  1438. {
  1439. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateTxData;
  1440. }
  1441. if (kStatus_Success == FLEXCAN_WriteTxMb(base, xfer->mbIdx, xfer->frame))
  1442. {
  1443. /* Enable Message Buffer Interrupt. */
  1444. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1445. FLEXCAN_EnableMbInterrupts(base, (uint64_t)1 << xfer->mbIdx);
  1446. #else
  1447. FLEXCAN_EnableMbInterrupts(base, 1 << xfer->mbIdx);
  1448. #endif
  1449. return kStatus_Success;
  1450. }
  1451. else
  1452. {
  1453. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateIdle;
  1454. return kStatus_Fail;
  1455. }
  1456. }
  1457. else
  1458. {
  1459. return kStatus_FLEXCAN_TxBusy;
  1460. }
  1461. }
  1462. status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
  1463. {
  1464. /* Assertion. */
  1465. assert(handle);
  1466. assert(xfer);
  1467. assert(xfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1468. assert(!FLEXCAN_IsMbOccupied(base, xfer->mbIdx));
  1469. /* Check if Message Buffer is idle. */
  1470. if (kFLEXCAN_StateIdle == handle->mbState[xfer->mbIdx])
  1471. {
  1472. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateRxData;
  1473. /* Register Message Buffer. */
  1474. handle->mbFrameBuf[xfer->mbIdx] = xfer->frame;
  1475. /* Enable Message Buffer Interrupt. */
  1476. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1477. FLEXCAN_EnableMbInterrupts(base, (uint64_t)1 << xfer->mbIdx);
  1478. #else
  1479. FLEXCAN_EnableMbInterrupts(base, 1 << xfer->mbIdx);
  1480. #endif
  1481. return kStatus_Success;
  1482. }
  1483. else
  1484. {
  1485. return kStatus_FLEXCAN_RxBusy;
  1486. }
  1487. }
  1488. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1489. status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
  1490. {
  1491. /* Assertion. */
  1492. assert(handle);
  1493. assert(xfer);
  1494. assert(xfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1495. assert(!FLEXCAN_IsMbOccupied(base, xfer->mbIdx));
  1496. /* Check if Message Buffer is idle. */
  1497. if (kFLEXCAN_StateIdle == handle->mbState[xfer->mbIdx])
  1498. {
  1499. /* Distinguish transmit type. */
  1500. if (kFLEXCAN_FrameTypeRemote == xfer->frame->type)
  1501. {
  1502. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateTxRemote;
  1503. /* Register user Frame buffer to receive remote Frame. */
  1504. handle->mbFDFrameBuf[xfer->mbIdx] = xfer->framefd;
  1505. }
  1506. else
  1507. {
  1508. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateTxData;
  1509. }
  1510. if (kStatus_Success == FLEXCAN_WriteFDTxMb(base, xfer->mbIdx, xfer->framefd))
  1511. {
  1512. /* Enable Message Buffer Interrupt. */
  1513. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1514. FLEXCAN_EnableMbInterrupts(base, (uint64_t)1 << xfer->mbIdx);
  1515. #else
  1516. FLEXCAN_EnableMbInterrupts(base, 1 << xfer->mbIdx);
  1517. #endif
  1518. return kStatus_Success;
  1519. }
  1520. else
  1521. {
  1522. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateIdle;
  1523. return kStatus_Fail;
  1524. }
  1525. }
  1526. else
  1527. {
  1528. return kStatus_FLEXCAN_TxBusy;
  1529. }
  1530. }
  1531. status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
  1532. {
  1533. /* Assertion. */
  1534. assert(handle);
  1535. assert(xfer);
  1536. assert(xfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1537. assert(!FLEXCAN_IsMbOccupied(base, xfer->mbIdx));
  1538. /* Check if Message Buffer is idle. */
  1539. if (kFLEXCAN_StateIdle == handle->mbState[xfer->mbIdx])
  1540. {
  1541. handle->mbState[xfer->mbIdx] = kFLEXCAN_StateRxData;
  1542. /* Register Message Buffer. */
  1543. handle->mbFDFrameBuf[xfer->mbIdx] = xfer->framefd;
  1544. /* Enable Message Buffer Interrupt. */
  1545. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1546. FLEXCAN_EnableMbInterrupts(base, (uint64_t)1 << xfer->mbIdx);
  1547. #else
  1548. FLEXCAN_EnableMbInterrupts(base, 1 << xfer->mbIdx);
  1549. #endif
  1550. return kStatus_Success;
  1551. }
  1552. else
  1553. {
  1554. return kStatus_FLEXCAN_RxBusy;
  1555. }
  1556. }
  1557. #endif
  1558. status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_fifo_transfer_t *xfer)
  1559. {
  1560. /* Assertion. */
  1561. assert(handle);
  1562. assert(xfer);
  1563. /* Check if Message Buffer is idle. */
  1564. if (kFLEXCAN_StateIdle == handle->rxFifoState)
  1565. {
  1566. handle->rxFifoState = kFLEXCAN_StateRxFifo;
  1567. /* Register Message Buffer. */
  1568. handle->rxFifoFrameBuf = xfer->frame;
  1569. /* Enable Message Buffer Interrupt. */
  1570. FLEXCAN_EnableMbInterrupts(
  1571. base, kFLEXCAN_RxFifoOverflowFlag | kFLEXCAN_RxFifoWarningFlag | kFLEXCAN_RxFifoFrameAvlFlag);
  1572. return kStatus_Success;
  1573. }
  1574. else
  1575. {
  1576. return kStatus_FLEXCAN_RxFifoBusy;
  1577. }
  1578. }
  1579. void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
  1580. {
  1581. /* Assertion. */
  1582. assert(handle);
  1583. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1584. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1585. /* Disable Message Buffer Interrupt. */
  1586. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1587. FLEXCAN_DisableMbInterrupts(base, (uint64_t)1 << mbIdx);
  1588. #else
  1589. FLEXCAN_DisableMbInterrupts(base, 1 << mbIdx);
  1590. #endif
  1591. /* Un-register handle. */
  1592. handle->mbFrameBuf[mbIdx] = 0x0;
  1593. /* Clean Message Buffer. */
  1594. FLEXCAN_SetTxMbConfig(base, mbIdx, true);
  1595. handle->mbState[mbIdx] = kFLEXCAN_StateIdle;
  1596. }
  1597. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1598. void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
  1599. {
  1600. /* Assertion. */
  1601. assert(handle);
  1602. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1603. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1604. /* Disable Message Buffer Interrupt. */
  1605. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1606. FLEXCAN_DisableMbInterrupts(base, (uint64_t)1 << mbIdx);
  1607. #else
  1608. FLEXCAN_DisableMbInterrupts(base, 1 << mbIdx);
  1609. #endif
  1610. /* Un-register handle. */
  1611. handle->mbFDFrameBuf[mbIdx] = 0x0;
  1612. /* Clean Message Buffer. */
  1613. FLEXCAN_SetFDTxMbConfig(base, mbIdx, true);
  1614. handle->mbState[mbIdx] = kFLEXCAN_StateIdle;
  1615. }
  1616. void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
  1617. {
  1618. /* Assertion. */
  1619. assert(handle);
  1620. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1621. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1622. /* Disable Message Buffer Interrupt. */
  1623. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1624. FLEXCAN_DisableMbInterrupts(base, (uint64_t)1 << mbIdx);
  1625. #else
  1626. FLEXCAN_DisableMbInterrupts(base, 1 << mbIdx);
  1627. #endif
  1628. /* Un-register handle. */
  1629. handle->mbFDFrameBuf[mbIdx] = 0x0;
  1630. handle->mbState[mbIdx] = kFLEXCAN_StateIdle;
  1631. }
  1632. #endif
  1633. void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
  1634. {
  1635. /* Assertion. */
  1636. assert(handle);
  1637. assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK));
  1638. assert(!FLEXCAN_IsMbOccupied(base, mbIdx));
  1639. /* Disable Message Buffer Interrupt. */
  1640. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1641. FLEXCAN_DisableMbInterrupts(base, (uint64_t)1 << mbIdx);
  1642. #else
  1643. FLEXCAN_DisableMbInterrupts(base, 1 << mbIdx);
  1644. #endif
  1645. /* Un-register handle. */
  1646. handle->mbFrameBuf[mbIdx] = 0x0;
  1647. handle->mbState[mbIdx] = kFLEXCAN_StateIdle;
  1648. }
  1649. void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle)
  1650. {
  1651. /* Assertion. */
  1652. assert(handle);
  1653. /* Check if Rx FIFO is enabled. */
  1654. if (base->MCR & CAN_MCR_RFEN_MASK)
  1655. {
  1656. /* Disable Rx Message FIFO Interrupts. */
  1657. FLEXCAN_DisableMbInterrupts(
  1658. base, kFLEXCAN_RxFifoOverflowFlag | kFLEXCAN_RxFifoWarningFlag | kFLEXCAN_RxFifoFrameAvlFlag);
  1659. /* Un-register handle. */
  1660. handle->rxFifoFrameBuf = 0x0;
  1661. }
  1662. handle->rxFifoState = kFLEXCAN_StateIdle;
  1663. }
  1664. void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle)
  1665. {
  1666. /* Assertion. */
  1667. assert(handle);
  1668. status_t status = kStatus_FLEXCAN_UnHandled;
  1669. uint32_t result;
  1670. /* Store Current FlexCAN Module Error and Status. */
  1671. result = base->ESR1;
  1672. do
  1673. {
  1674. /* Solve FlexCAN Error and Status Interrupt. */
  1675. if (result & (kFLEXCAN_TxWarningIntFlag | kFLEXCAN_RxWarningIntFlag | kFLEXCAN_BusOffIntFlag |
  1676. kFLEXCAN_ErrorIntFlag | kFLEXCAN_WakeUpIntFlag))
  1677. {
  1678. status = kStatus_FLEXCAN_ErrorStatus;
  1679. /* Clear FlexCAN Error and Status Interrupt. */
  1680. FLEXCAN_ClearStatusFlags(base, kFLEXCAN_TxWarningIntFlag | kFLEXCAN_RxWarningIntFlag |
  1681. kFLEXCAN_BusOffIntFlag | kFLEXCAN_ErrorIntFlag | kFLEXCAN_WakeUpIntFlag);
  1682. }
  1683. /* Solve FlexCAN Rx FIFO & Message Buffer Interrupt. */
  1684. else
  1685. {
  1686. /* For this implementation, we solve the Message with lowest MB index first. */
  1687. for (result = 0; result < FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); result++)
  1688. {
  1689. /* Get the lowest unhandled Message Buffer */
  1690. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1691. if ((FLEXCAN_GetMbStatusFlags(base, (uint64_t)1 << result)) && (FLEXCAN_IsMbIntEnabled(base, result)))
  1692. #else
  1693. if ((FLEXCAN_GetMbStatusFlags(base, 1 << result)) && (FLEXCAN_IsMbIntEnabled(base, result)))
  1694. #endif
  1695. {
  1696. break;
  1697. }
  1698. }
  1699. /* Does not find Message to deal with. */
  1700. if (result == FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base))
  1701. {
  1702. break;
  1703. }
  1704. /* Solve Rx FIFO interrupt. */
  1705. if ((kFLEXCAN_StateIdle != handle->rxFifoState) && ((1 << result) <= kFLEXCAN_RxFifoOverflowFlag))
  1706. {
  1707. switch (1 << result)
  1708. {
  1709. case kFLEXCAN_RxFifoOverflowFlag:
  1710. status = kStatus_FLEXCAN_RxFifoOverflow;
  1711. break;
  1712. case kFLEXCAN_RxFifoWarningFlag:
  1713. status = kStatus_FLEXCAN_RxFifoWarning;
  1714. break;
  1715. case kFLEXCAN_RxFifoFrameAvlFlag:
  1716. status = FLEXCAN_ReadRxFifo(base, handle->rxFifoFrameBuf);
  1717. if (kStatus_Success == status)
  1718. {
  1719. status = kStatus_FLEXCAN_RxFifoIdle;
  1720. }
  1721. FLEXCAN_TransferAbortReceiveFifo(base, handle);
  1722. break;
  1723. default:
  1724. status = kStatus_FLEXCAN_UnHandled;
  1725. break;
  1726. }
  1727. }
  1728. else
  1729. {
  1730. /* Get current State of Message Buffer. */
  1731. switch (handle->mbState[result])
  1732. {
  1733. /* Solve Rx Data Frame. */
  1734. case kFLEXCAN_StateRxData:
  1735. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1736. status = FLEXCAN_ReadFDRxMb(base, result, handle->mbFDFrameBuf[result]);
  1737. #else
  1738. status = FLEXCAN_ReadRxMb(base, result, handle->mbFrameBuf[result]);
  1739. #endif
  1740. if (kStatus_Success == status)
  1741. {
  1742. status = kStatus_FLEXCAN_RxIdle;
  1743. }
  1744. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1745. FLEXCAN_TransferFDAbortReceive(base, handle, result);
  1746. #else
  1747. FLEXCAN_TransferAbortReceive(base, handle, result);
  1748. #endif
  1749. break;
  1750. /* Solve Rx Remote Frame. */
  1751. case kFLEXCAN_StateRxRemote:
  1752. status = FLEXCAN_ReadRxMb(base, result, handle->mbFrameBuf[result]);
  1753. if (kStatus_Success == status)
  1754. {
  1755. status = kStatus_FLEXCAN_RxIdle;
  1756. }
  1757. FLEXCAN_TransferAbortReceive(base, handle, result);
  1758. break;
  1759. /* Solve Tx Data Frame. */
  1760. case kFLEXCAN_StateTxData:
  1761. status = kStatus_FLEXCAN_TxIdle;
  1762. #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
  1763. FLEXCAN_TransferFDAbortSend(base, handle, result);
  1764. #else
  1765. FLEXCAN_TransferAbortSend(base, handle, result);
  1766. #endif
  1767. break;
  1768. /* Solve Tx Remote Frame. */
  1769. case kFLEXCAN_StateTxRemote:
  1770. handle->mbState[result] = kFLEXCAN_StateRxRemote;
  1771. status = kStatus_FLEXCAN_TxSwitchToRx;
  1772. break;
  1773. default:
  1774. status = kStatus_FLEXCAN_UnHandled;
  1775. break;
  1776. }
  1777. }
  1778. /* Clear resolved Message Buffer IRQ. */
  1779. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1780. FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1 << result);
  1781. #else
  1782. FLEXCAN_ClearMbStatusFlags(base, 1 << result);
  1783. #endif
  1784. }
  1785. /* Calling Callback Function if has one. */
  1786. if (handle->callback != NULL)
  1787. {
  1788. handle->callback(base, handle, status, result, handle->userData);
  1789. }
  1790. /* Reset return status */
  1791. status = kStatus_FLEXCAN_UnHandled;
  1792. /* Store Current FlexCAN Module Error and Status. */
  1793. result = base->ESR1;
  1794. }
  1795. #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
  1796. while ((0 != FLEXCAN_GetMbStatusFlags(base, 0xFFFFFFFFFFFFFFFFU)) ||
  1797. (0 != (result & (kFLEXCAN_TxWarningIntFlag | kFLEXCAN_RxWarningIntFlag | kFLEXCAN_BusOffIntFlag |
  1798. kFLEXCAN_ErrorIntFlag | kFLEXCAN_WakeUpIntFlag))));
  1799. #else
  1800. while ((0 != FLEXCAN_GetMbStatusFlags(base, 0xFFFFFFFFU)) ||
  1801. (0 != (result & (kFLEXCAN_TxWarningIntFlag | kFLEXCAN_RxWarningIntFlag | kFLEXCAN_BusOffIntFlag |
  1802. kFLEXCAN_ErrorIntFlag | kFLEXCAN_WakeUpIntFlag))));
  1803. #endif
  1804. }
  1805. #if defined(CAN0)
  1806. void CAN0_DriverIRQHandler(void)
  1807. {
  1808. assert(s_flexcanHandle[0]);
  1809. s_flexcanIsr(CAN0, s_flexcanHandle[0]);
  1810. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1811. exception return operation might vector to incorrect interrupt */
  1812. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1813. __DSB();
  1814. #endif
  1815. }
  1816. #endif
  1817. #if defined(CAN1)
  1818. void CAN1_DriverIRQHandler(void)
  1819. {
  1820. assert(s_flexcanHandle[1]);
  1821. s_flexcanIsr(CAN1, s_flexcanHandle[1]);
  1822. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1823. exception return operation might vector to incorrect interrupt */
  1824. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1825. __DSB();
  1826. #endif
  1827. }
  1828. #endif
  1829. #if defined(CAN2)
  1830. void CAN2_DriverIRQHandler(void)
  1831. {
  1832. assert(s_flexcanHandle[2]);
  1833. s_flexcanIsr(CAN2, s_flexcanHandle[2]);
  1834. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1835. exception return operation might vector to incorrect interrupt */
  1836. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1837. __DSB();
  1838. #endif
  1839. }
  1840. #endif
  1841. #if defined(CAN3)
  1842. void CAN3_DriverIRQHandler(void)
  1843. {
  1844. assert(s_flexcanHandle[3]);
  1845. s_flexcanIsr(CAN3, s_flexcanHandle[3]);
  1846. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1847. exception return operation might vector to incorrect interrupt */
  1848. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1849. __DSB();
  1850. #endif
  1851. }
  1852. #endif
  1853. #if defined(CAN4)
  1854. void CAN4_DriverIRQHandler(void)
  1855. {
  1856. assert(s_flexcanHandle[4]);
  1857. s_flexcanIsr(CAN4, s_flexcanHandle[4]);
  1858. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1859. exception return operation might vector to incorrect interrupt */
  1860. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1861. __DSB();
  1862. #endif
  1863. }
  1864. #endif
  1865. #if defined(DMA__CAN0)
  1866. void DMA_FLEXCAN0_INT_DriverIRQHandler(void)
  1867. {
  1868. assert(s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]);
  1869. s_flexcanIsr(DMA__CAN0, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]);
  1870. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1871. exception return operation might vector to incorrect interrupt */
  1872. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1873. __DSB();
  1874. #endif
  1875. }
  1876. #endif
  1877. #if defined(DMA__CAN1)
  1878. void DMA_FLEXCAN1_INT_DriverIRQHandler(void)
  1879. {
  1880. assert(s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]);
  1881. s_flexcanIsr(DMA__CAN1, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]);
  1882. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1883. exception return operation might vector to incorrect interrupt */
  1884. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1885. __DSB();
  1886. #endif
  1887. }
  1888. #endif
  1889. #if defined(DMA__CAN2)
  1890. void DMA_FLEXCAN2_INT_DriverIRQHandler(void)
  1891. {
  1892. assert(s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]);
  1893. s_flexcanIsr(DMA__CAN2, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]);
  1894. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  1895. exception return operation might vector to incorrect interrupt */
  1896. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  1897. __DSB();
  1898. #endif
  1899. }
  1900. #endif