nu_can.h 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. /**************************************************************************//**
  2. * @file can.h
  3. * @version V2.00
  4. * @brief N9H30 Series CAN Driver Header File
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
  8. ******************************************************************************/
  9. #ifndef __NU_CAN_H__
  10. #define __NU_CAN_H__
  11. #include "N9H30.h"
  12. /** @addtogroup Standard_Driver Standard Driver
  13. @{
  14. */
  15. /** @addtogroup CAN_Driver CAN Driver
  16. @{
  17. */
  18. /** @addtogroup CAN_EXPORTED_CONSTANTS CAN Exported Constants
  19. @{
  20. */
  21. /*---------------------------------------------------------------------------------------------------------*/
  22. /* CAN Test Mode Constant Definitions */
  23. /*---------------------------------------------------------------------------------------------------------*/
  24. #define CAN_NORMAL_MODE 0ul /*!< CAN select normal mode \hideinitializer */
  25. #define CAN_BASIC_MODE 1ul /*!< CAN select basic mode \hideinitializer */
  26. /*---------------------------------------------------------------------------------------------------------*/
  27. /* Message ID Type Constant Definitions */
  28. /*---------------------------------------------------------------------------------------------------------*/
  29. #define CAN_STD_ID 0ul /*!< CAN select standard ID \hideinitializer */
  30. #define CAN_EXT_ID 1ul /*!< CAN select extended ID \hideinitializer */
  31. /*---------------------------------------------------------------------------------------------------------*/
  32. /* Message Frame Type Constant Definitions */
  33. /*---------------------------------------------------------------------------------------------------------*/
  34. #define CAN_REMOTE_FRAME 0ul /*!< CAN frame select remote frame \hideinitializer */
  35. #define CAN_DATA_FRAME 1ul /*!< CAN frame select data frame \hideinitializer */
  36. /*@}*/ /* end of group CAN_EXPORTED_CONSTANTS */
  37. typedef struct
  38. {
  39. __IO uint32_t CREQ; /*!< [0x0020] IFn Command Request Register */
  40. __IO uint32_t CMASK; /*!< [0x0024] IFn Command Mask Register */
  41. __IO uint32_t MASK1; /*!< [0x0028] IFn Mask 1 Register */
  42. __IO uint32_t MASK2; /*!< [0x002c] IFn Mask 2 Register */
  43. __IO uint32_t ARB1; /*!< [0x0030] IFn Arbitration 1 Register */
  44. __IO uint32_t ARB2; /*!< [0x0034] IFn Arbitration 2 Register */
  45. __IO uint32_t MCON; /*!< [0x0038] IFn Message Control Register */
  46. __IO uint32_t DAT_A1; /*!< [0x003c] IFn Data A1 Register */
  47. __IO uint32_t DAT_A2; /*!< [0x0040] IFn Data A2 Register */
  48. __IO uint32_t DAT_B1; /*!< [0x0044] IFn Data B1 Register */
  49. __IO uint32_t DAT_B2; /*!< [0x0048] IFn Data B2 Register */
  50. __I uint32_t RESERVE0[13];
  51. } CAN_IF_T;
  52. typedef struct
  53. {
  54. __IO uint32_t CON; /*!< [0x0000] Control Register */
  55. __IO uint32_t STATUS; /*!< [0x0004] Status Register */
  56. __I uint32_t ERR; /*!< [0x0008] Error Counter Register */
  57. __IO uint32_t BTIME; /*!< [0x000c] Bit Timing Register */
  58. __I uint32_t IIDR; /*!< [0x0010] Interrupt Identifier Register */
  59. __IO uint32_t TEST; /*!< [0x0014] Test Register */
  60. __IO uint32_t BRPE; /*!< [0x0018] Baud Rate Prescaler Extension Register */
  61. __I uint32_t RESERVE0[1];
  62. __IO CAN_IF_T IF[2];
  63. __I uint32_t RESERVE2[8];
  64. __I uint32_t TXREQ1; /*!< [0x0100] Transmission Request Register 1 */
  65. __I uint32_t TXREQ2; /*!< [0x0104] Transmission Request Register 2 */
  66. __I uint32_t RESERVE3[6];
  67. __I uint32_t NDAT1; /*!< [0x0120] New Data Register 1 */
  68. __I uint32_t NDAT2; /*!< [0x0124] New Data Register 2 */
  69. __I uint32_t RESERVE4[6];
  70. __I uint32_t IPND1; /*!< [0x0140] Interrupt Pending Register 1 */
  71. __I uint32_t IPND2; /*!< [0x0144] Interrupt Pending Register 2 */
  72. __I uint32_t RESERVE5[6];
  73. __I uint32_t MVLD1; /*!< [0x0160] Message Valid Register 1 */
  74. __I uint32_t MVLD2; /*!< [0x0164] Message Valid Register 2 */
  75. __IO uint32_t WU_EN; /*!< [0x0168] Wake-up Enable Control Register */
  76. __IO uint32_t WU_STATUS; /*!< [0x016c] Wake-up Status Register */
  77. } CAN_T;
  78. #define CAN_CON_INIT_Pos (0) /*!< CAN_T::CON: Init Position */
  79. #define CAN_CON_INIT_Msk (0x1ul << CAN_CON_INIT_Pos) /*!< CAN_T::CON: Init Mask */
  80. #define CAN_CON_IE_Pos (1) /*!< CAN_T::CON: IE Position */
  81. #define CAN_CON_IE_Msk (0x1ul << CAN_CON_IE_Pos) /*!< CAN_T::CON: IE Mask */
  82. #define CAN_CON_SIE_Pos (2) /*!< CAN_T::CON: SIE Position */
  83. #define CAN_CON_SIE_Msk (0x1ul << CAN_CON_SIE_Pos) /*!< CAN_T::CON: SIE Mask */
  84. #define CAN_CON_EIE_Pos (3) /*!< CAN_T::CON: EIE Position */
  85. #define CAN_CON_EIE_Msk (0x1ul << CAN_CON_EIE_Pos) /*!< CAN_T::CON: EIE Mask */
  86. #define CAN_CON_DAR_Pos (5) /*!< CAN_T::CON: DAR Position */
  87. #define CAN_CON_DAR_Msk (0x1ul << CAN_CON_DAR_Pos) /*!< CAN_T::CON: DAR Mask */
  88. #define CAN_CON_CCE_Pos (6) /*!< CAN_T::CON: CCE Position */
  89. #define CAN_CON_CCE_Msk (0x1ul << CAN_CON_CCE_Pos) /*!< CAN_T::CON: CCE Mask */
  90. #define CAN_CON_TEST_Pos (7) /*!< CAN_T::CON: Test Position */
  91. #define CAN_CON_TEST_Msk (0x1ul << CAN_CON_TEST_Pos) /*!< CAN_T::CON: Test Mask */
  92. #define CAN_STATUS_LEC_Pos (0) /*!< CAN_T::STATUS: LEC Position */
  93. #define CAN_STATUS_LEC_Msk (0x7ul << CAN_STATUS_LEC_Pos) /*!< CAN_T::STATUS: LEC Mask */
  94. #define CAN_STATUS_TXOK_Pos (3) /*!< CAN_T::STATUS: TxOK Position */
  95. #define CAN_STATUS_TXOK_Msk (0x1ul << CAN_STATUS_TXOK_Pos) /*!< CAN_T::STATUS: TxOK Mask */
  96. #define CAN_STATUS_RXOK_Pos (4) /*!< CAN_T::STATUS: RxOK Position */
  97. #define CAN_STATUS_RXOK_Msk (0x1ul << CAN_STATUS_RXOK_Pos) /*!< CAN_T::STATUS: RxOK Mask */
  98. #define CAN_STATUS_EPASS_Pos (5) /*!< CAN_T::STATUS: EPass Position */
  99. #define CAN_STATUS_EPASS_Msk (0x1ul << CAN_STATUS_EPASS_Pos) /*!< CAN_T::STATUS: EPass Mask */
  100. #define CAN_STATUS_EWARN_Pos (6) /*!< CAN_T::STATUS: EWarn Position */
  101. #define CAN_STATUS_EWARN_Msk (0x1ul << CAN_STATUS_EWARN_Pos) /*!< CAN_T::STATUS: EWarn Mask */
  102. #define CAN_STATUS_BOFF_Pos (7) /*!< CAN_T::STATUS: BOff Position */
  103. #define CAN_STATUS_BOFF_Msk (0x1ul << CAN_STATUS_BOFF_Pos) /*!< CAN_T::STATUS: BOff Mask */
  104. #define CAN_ERR_TEC_Pos (0) /*!< CAN_T::ERR: TEC Position */
  105. #define CAN_ERR_TEC_Msk (0xfful << CAN_ERR_TEC_Pos) /*!< CAN_T::ERR: TEC Mask */
  106. #define CAN_ERR_REC_Pos (8) /*!< CAN_T::ERR: REC Position */
  107. #define CAN_ERR_REC_Msk (0x7ful << CAN_ERR_REC_Pos) /*!< CAN_T::ERR: REC Mask */
  108. #define CAN_ERR_RP_Pos (15) /*!< CAN_T::ERR: RP Position */
  109. #define CAN_ERR_RP_Msk (0x1ul << CAN_ERR_RP_Pos) /*!< CAN_T::ERR: RP Mask */
  110. #define CAN_BTIME_BRP_Pos (0) /*!< CAN_T::BTIME: BRP Position */
  111. #define CAN_BTIME_BRP_Msk (0x3ful << CAN_BTIME_BRP_Pos) /*!< CAN_T::BTIME: BRP Mask */
  112. #define CAN_BTIME_SJW_Pos (6) /*!< CAN_T::BTIME: SJW Position */
  113. #define CAN_BTIME_SJW_Msk (0x3ul << CAN_BTIME_SJW_Pos) /*!< CAN_T::BTIME: SJW Mask */
  114. #define CAN_BTIME_TSEG1_Pos (8) /*!< CAN_T::BTIME: TSeg1 Position */
  115. #define CAN_BTIME_TSEG1_Msk (0xful << CAN_BTIME_TSEG1_Pos) /*!< CAN_T::BTIME: TSeg1 Mask */
  116. #define CAN_BTIME_TSEG2_Pos (12) /*!< CAN_T::BTIME: TSeg2 Position */
  117. #define CAN_BTIME_TSEG2_Msk (0x7ul << CAN_BTIME_TSEG2_Pos) /*!< CAN_T::BTIME: TSeg2 Mask */
  118. #define CAN_IIDR_INTID_Pos (0) /*!< CAN_T::IIDR: IntId Position */
  119. #define CAN_IIDR_INTID_Msk (0xfffful << CAN_IIDR_INTID_Pos) /*!< CAN_T::IIDR: IntId Mask */
  120. #define CAN_TEST_BASIC_Pos (2) /*!< CAN_T::TEST: Basic Position */
  121. #define CAN_TEST_BASIC_Msk (0x1ul << CAN_TEST_BASIC_Pos) /*!< CAN_T::TEST: Basic Mask */
  122. #define CAN_TEST_SILENT_Pos (3) /*!< CAN_T::TEST: Silent Position */
  123. #define CAN_TEST_SILENT_Msk (0x1ul << CAN_TEST_SILENT_Pos) /*!< CAN_T::TEST: Silent Mask */
  124. #define CAN_TEST_LBACK_Pos (4) /*!< CAN_T::TEST: LBack Position */
  125. #define CAN_TEST_LBACK_Msk (0x1ul << CAN_TEST_LBACK_Pos) /*!< CAN_T::TEST: LBack Mask */
  126. #define CAN_TEST_Tx_Pos (5) /*!< CAN_T::TEST: Tx Position */
  127. #define CAN_TEST_Tx_Msk (0x3ul << CAN_TEST_Tx_Pos) /*!< CAN_T::TEST: Tx Mask */
  128. #define CAN_TEST_Rx_Pos (7) /*!< CAN_T::TEST: Rx Position */
  129. #define CAN_TEST_Rx_Msk (0x1ul << CAN_TEST_Rx_Pos) /*!< CAN_T::TEST: Rx Mask */
  130. #define CAN_BRPE_BRPE_Pos (0) /*!< CAN_T::BRPE: BRPE Position */
  131. #define CAN_BRPE_BRPE_Msk (0xful << CAN_BRPE_BRPE_Pos) /*!< CAN_T::BRPE: BRPE Mask */
  132. #define CAN_IF_CREQ_MSGNUM_Pos (0) /*!< CAN_IF_T::CREQ: MessageNumber Position*/
  133. #define CAN_IF_CREQ_MSGNUM_Msk (0x3ful << CAN_IF_CREQ_MSGNUM_Pos) /*!< CAN_IF_T::CREQ: MessageNumber Mask */
  134. #define CAN_IF_CREQ_BUSY_Pos (15) /*!< CAN_IF_T::CREQ: Busy Position */
  135. #define CAN_IF_CREQ_BUSY_Msk (0x1ul << CAN_IF_CREQ_BUSY_Pos) /*!< CAN_IF_T::CREQ: Busy Mask */
  136. #define CAN_IF_CMASK_DATAB_Pos (0) /*!< CAN_IF_T::CMASK: DAT_B Position */
  137. #define CAN_IF_CMASK_DATAB_Msk (0x1ul << CAN_IF_CMASK_DATAB_Pos) /*!< CAN_IF_T::CMASK: DAT_B Mask */
  138. #define CAN_IF_CMASK_DATAA_Pos (1) /*!< CAN_IF_T::CMASK: DAT_A Position */
  139. #define CAN_IF_CMASK_DATAA_Msk (0x1ul << CAN_IF_CMASK_DATAA_Pos) /*!< CAN_IF_T::CMASK: DAT_A Mask */
  140. #define CAN_IF_CMASK_TXRQSTNEWDAT_Pos (2) /*!< CAN_IF_T::CMASK: TxRqst_NewDat Position*/
  141. #define CAN_IF_CMASK_TXRQSTNEWDAT_Msk (0x1ul << CAN_IF_CMASK_TXRQSTNEWDAT_Pos) /*!< CAN_IF_T::CMASK: TxRqst_NewDat Mask */
  142. #define CAN_IF_CMASK_CLRINTPND_Pos (3) /*!< CAN_IF_T::CMASK: ClrIntPnd Position */
  143. #define CAN_IF_CMASK_CLRINTPND_Msk (0x1ul << CAN_IF_CMASK_CLRINTPND_Pos) /*!< CAN_IF_T::CMASK: ClrIntPnd Mask */
  144. #define CAN_IF_CMASK_CONTROL_Pos (4) /*!< CAN_IF_T::CMASK: Control Position */
  145. #define CAN_IF_CMASK_CONTROL_Msk (0x1ul << CAN_IF_CMASK_CONTROL_Pos) /*!< CAN_IF_T::CMASK: Control Mask */
  146. #define CAN_IF_CMASK_ARB_Pos (5) /*!< CAN_IF_T::CMASK: Arb Position */
  147. #define CAN_IF_CMASK_ARB_Msk (0x1ul << CAN_IF_CMASK_ARB_Pos) /*!< CAN_IF_T::CMASK: Arb Mask */
  148. #define CAN_IF_CMASK_MASK_Pos (6) /*!< CAN_IF_T::CMASK: Mask Position */
  149. #define CAN_IF_CMASK_MASK_Msk (0x1ul << CAN_IF_CMASK_MASK_Pos) /*!< CAN_IF_T::CMASK: Mask Mask */
  150. #define CAN_IF_CMASK_WRRD_Pos (7) /*!< CAN_IF_T::CMASK: WR_RD Position */
  151. #define CAN_IF_CMASK_WRRD_Msk (0x1ul << CAN_IF_CMASK_WRRD_Pos) /*!< CAN_IF_T::CMASK: WR_RD Mask */
  152. #define CAN_IF_MASK1_Msk_Pos (0) /*!< CAN_IF_T::MASK1: Msk Position */
  153. #define CAN_IF_MASK1_Msk_Msk (0xfffful << CAN_IF_MASK1_Msk_Pos) /*!< CAN_IF_T::MASK1: Msk Mask */
  154. #define CAN_IF_MASK2_Msk_Pos (0) /*!< CAN_IF_T::MASK2: Msk Position */
  155. #define CAN_IF_MASK2_Msk_Msk (0x1ffful << CAN_IF_MASK2_Msk_Pos) /*!< CAN_IF_T::MASK2: Msk Mask */
  156. #define CAN_IF_MASK2_MDIR_Pos (14) /*!< CAN_IF_T::MASK2: MDir Position */
  157. #define CAN_IF_MASK2_MDIR_Msk (0x1ul << CAN_IF_MASK2_MDIR_Pos) /*!< CAN_IF_T::MASK2: MDir Mask */
  158. #define CAN_IF_MASK2_MXTD_Pos (15) /*!< CAN_IF_T::MASK2: MXtd Position */
  159. #define CAN_IF_MASK2_MXTD_Msk (0x1ul << CAN_IF_MASK2_MXTD_Pos) /*!< CAN_IF_T::MASK2: MXtd Mask */
  160. #define CAN_IF_ARB1_ID_Pos (0) /*!< CAN_IF_T::ARB1: ID Position */
  161. #define CAN_IF_ARB1_ID_Msk (0xfffful << CAN_IF_ARB1_ID_Pos) /*!< CAN_IF_T::ARB1: ID Mask */
  162. #define CAN_IF_ARB2_ID_Pos (0) /*!< CAN_IF_T::ARB2: ID Position */
  163. #define CAN_IF_ARB2_ID_Msk (0x1ffful << CAN_IF_ARB2_ID_Pos) /*!< CAN_IF_T::ARB2: ID Mask */
  164. #define CAN_IF_ARB2_DIR_Pos (13) /*!< CAN_IF_T::ARB2: Dir Position */
  165. #define CAN_IF_ARB2_DIR_Msk (0x1ul << CAN_IF_ARB2_DIR_Pos) /*!< CAN_IF_T::ARB2: Dir Mask */
  166. #define CAN_IF_ARB2_XTD_Pos (14) /*!< CAN_IF_T::ARB2: Xtd Position */
  167. #define CAN_IF_ARB2_XTD_Msk (0x1ul << CAN_IF_ARB2_XTD_Pos) /*!< CAN_IF_T::ARB2: Xtd Mask */
  168. #define CAN_IF_ARB2_MSGVAL_Pos (15) /*!< CAN_IF_T::ARB2: MsgVal Position */
  169. #define CAN_IF_ARB2_MSGVAL_Msk (0x1ul << CAN_IF_ARB2_MSGVAL_Pos) /*!< CAN_IF_T::ARB2: MsgVal Mask */
  170. #define CAN_IF_MCON_DLC_Pos (0) /*!< CAN_IF_T::MCON: DLC Position */
  171. #define CAN_IF_MCON_DLC_Msk (0xful << CAN_IF_MCON_DLC_Pos) /*!< CAN_IF_T::MCON: DLC Mask */
  172. #define CAN_IF_MCON_EOB_Pos (7) /*!< CAN_IF_T::MCON: EoB Position */
  173. #define CAN_IF_MCON_EOB_Msk (0x1ul << CAN_IF_MCON_EOB_Pos) /*!< CAN_IF_T::MCON: EoB Mask */
  174. #define CAN_IF_MCON_TxRqst_Pos (8) /*!< CAN_IF_T::MCON: TxRqst Position */
  175. #define CAN_IF_MCON_TxRqst_Msk (0x1ul << CAN_IF_MCON_TxRqst_Pos) /*!< CAN_IF_T::MCON: TxRqst Mask */
  176. #define CAN_IF_MCON_RmtEn_Pos (9) /*!< CAN_IF_T::MCON: RmtEn Position */
  177. #define CAN_IF_MCON_RmtEn_Msk (0x1ul << CAN_IF_MCON_RmtEn_Pos) /*!< CAN_IF_T::MCON: RmtEn Mask */
  178. #define CAN_IF_MCON_RXIE_Pos (10) /*!< CAN_IF_T::MCON: RxIE Position */
  179. #define CAN_IF_MCON_RXIE_Msk (0x1ul << CAN_IF_MCON_RXIE_Pos) /*!< CAN_IF_T::MCON: RxIE Mask */
  180. #define CAN_IF_MCON_TXIE_Pos (11) /*!< CAN_IF_T::MCON: TxIE Position */
  181. #define CAN_IF_MCON_TXIE_Msk (0x1ul << CAN_IF_MCON_TXIE_Pos) /*!< CAN_IF_T::MCON: TxIE Mask */
  182. #define CAN_IF_MCON_UMASK_Pos (12) /*!< CAN_IF_T::MCON: UMask Position */
  183. #define CAN_IF_MCON_UMASK_Msk (0x1ul << CAN_IF_MCON_UMASK_Pos) /*!< CAN_IF_T::MCON: UMask Mask */
  184. #define CAN_IF_MCON_IntPnd_Pos (13) /*!< CAN_IF_T::MCON: IntPnd Position */
  185. #define CAN_IF_MCON_IntPnd_Msk (0x1ul << CAN_IF_MCON_IntPnd_Pos) /*!< CAN_IF_T::MCON: IntPnd Mask */
  186. #define CAN_IF_MCON_MsgLst_Pos (14) /*!< CAN_IF_T::MCON: MsgLst Position */
  187. #define CAN_IF_MCON_MsgLst_Msk (0x1ul << CAN_IF_MCON_MsgLst_Pos) /*!< CAN_IF_T::MCON: MsgLst Mask */
  188. #define CAN_IF_MCON_NEWDAT_Pos (15) /*!< CAN_IF_T::MCON: NewDat Position */
  189. #define CAN_IF_MCON_NEWDAT_Msk (0x1ul << CAN_IF_MCON_NEWDAT_Pos) /*!< CAN_IF_T::MCON: NewDat Mask */
  190. #define CAN_IF_DAT_A1_DATA0_Pos (0) /*!< CAN_IF_T::DAT_A1: Data_0_ Position */
  191. #define CAN_IF_DAT_A1_DATA0_Msk (0xfful << CAN_IF_DAT_A1_DATA0_Pos) /*!< CAN_IF_T::DAT_A1: Data_0_ Mask */
  192. #define CAN_IF_DAT_A1_DATA1_Pos (8) /*!< CAN_IF_T::DAT_A1: Data_1_ Position */
  193. #define CAN_IF_DAT_A1_DATA1_Msk (0xfful << CAN_IF_DAT_A1_DATA1_Pos) /*!< CAN_IF_T::DAT_A1: Data_1_ Mask */
  194. #define CAN_IF_DAT_A2_DATA2_Pos (0) /*!< CAN_IF_T::DAT_A2: Data_2_ Position */
  195. #define CAN_IF_DAT_A2_DATA2_Msk (0xfful << CAN_IF_DAT_A2_DATA2_Pos) /*!< CAN_IF_T::DAT_A2: Data_2_ Mask */
  196. #define CAN_IF_DAT_A2_DATA3_Pos (8) /*!< CAN_IF_T::DAT_A2: Data_3_ Position */
  197. #define CAN_IF_DAT_A2_DATA3_Msk (0xfful << CAN_IF_DAT_A2_DATA3_Pos) /*!< CAN_IF_T::DAT_A2: Data_3_ Mask */
  198. #define CAN_IF_DAT_B1_DATA4_Pos (0) /*!< CAN_IF_T::DAT_B1: Data_4_ Position */
  199. #define CAN_IF_DAT_B1_DATA4_Msk (0xfful << CAN_IF_DAT_B1_DATA4_Pos) /*!< CAN_IF_T::DAT_B1: Data_4_ Mask */
  200. #define CAN_IF_DAT_B1_DATA5_Pos (8) /*!< CAN_IF_T::DAT_B1: Data_5_ Position */
  201. #define CAN_IF_DAT_B1_DATA5_Msk (0xfful << CAN_IF_DAT_B1_DATA5_Pos) /*!< CAN_IF_T::DAT_B1: Data_5_ Mask */
  202. #define CAN_IF_DAT_B2_DATA6_Pos (0) /*!< CAN_IF_T::DAT_B2: Data_6_ Position */
  203. #define CAN_IF_DAT_B2_DATA6_Msk (0xfful << CAN_IF_DAT_B2_DATA6_Pos) /*!< CAN_IF_T::DAT_B2: Data_6_ Mask */
  204. #define CAN_IF_DAT_B2_DATA7_Pos (8) /*!< CAN_IF_T::DAT_B2: Data_7_ Position */
  205. #define CAN_IF_DAT_B2_DATA7_Msk (0xfful << CAN_IF_DAT_B2_DATA7_Pos) /*!< CAN_IF_T::DAT_B2: Data_7_ Mask */
  206. #define CAN_TXREQ1_TXRQST16_1_Pos (0) /*!< CAN_T::TXREQ1: TxRqst16_1 Position */
  207. #define CAN_TXREQ1_TXRQST16_1_Msk (0xfffful << CAN_TXREQ1_TXRQST16_1_Pos) /*!< CAN_T::TXREQ1: TxRqst16_1 Mask */
  208. #define CAN_TXREQ2_TXRQST32_17_Pos (0) /*!< CAN_T::TXREQ2: TxRqst32_17 Position */
  209. #define CAN_TXREQ2_TXRQST32_17_Msk (0xfffful << CAN_TXREQ2_TXRQST32_17_Pos) /*!< CAN_T::TXREQ2: TxRqst32_17 Mask */
  210. #define CAN_NDAT1_NewData16_1_Pos (0) /*!< CAN_T::NDAT1: NewData16_1 Position */
  211. #define CAN_NDAT1_NewData16_1_Msk (0xfffful << CAN_NDAT1_NewData16_1_Pos) /*!< CAN_T::NDAT1: NewData16_1 Mask */
  212. #define CAN_NDAT2_NewData32_17_Pos (0) /*!< CAN_T::NDAT2: NewData32_17 Position */
  213. #define CAN_NDAT2_NewData32_17_Msk (0xfffful << CAN_NDAT2_NewData32_17_Pos) /*!< CAN_T::NDAT2: NewData32_17 Mask */
  214. #define CAN_IPND1_IntPnd16_1_Pos (0) /*!< CAN_T::IPND1: IntPnd16_1 Position */
  215. #define CAN_IPND1_IntPnd16_1_Msk (0xfffful << CAN_IPND1_IntPnd16_1_Pos) /*!< CAN_T::IPND1: IntPnd16_1 Mask */
  216. #define CAN_IPND2_IntPnd32_17_Pos (0) /*!< CAN_T::IPND2: IntPnd32_17 Position */
  217. #define CAN_IPND2_IntPnd32_17_Msk (0xfffful << CAN_IPND2_IntPnd32_17_Pos) /*!< CAN_T::IPND2: IntPnd32_17 Mask */
  218. #define CAN_MVLD1_MsgVal16_1_Pos (0) /*!< CAN_T::MVLD1: MsgVal16_1 Position */
  219. #define CAN_MVLD1_MsgVal16_1_Msk (0xfffful << CAN_MVLD1_MsgVal16_1_Pos) /*!< CAN_T::MVLD1: MsgVal16_1 Mask */
  220. #define CAN_MVLD2_MsgVal32_17_Pos (0) /*!< CAN_T::MVLD2: MsgVal32_17 Position */
  221. #define CAN_MVLD2_MsgVal32_17_Msk (0xfffful << CAN_MVLD2_MsgVal32_17_Pos) /*!< CAN_T::MVLD2: MsgVal32_17 Mask */
  222. #define CAN_WU_EN_WAKUP_EN_Pos (0) /*!< CAN_T::WU_EN: WAKUP_EN Position */
  223. #define CAN_WU_EN_WAKUP_EN_Msk (0x1ul << CAN_WU_EN_WAKUP_EN_Pos) /*!< CAN_T::WU_EN: WAKUP_EN Mask */
  224. #define CAN_WU_STATUS_WAKUP_STS_Pos (0) /*!< CAN_T::WU_STATUS: WAKUP_STS Position */
  225. #define CAN_WU_STATUS_WAKUP_STS_Msk (0x1ul << CAN_WU_STATUS_WAKUP_STS_Pos) /*!< CAN_T::WU_STATUS: WAKUP_STS Mask */
  226. #define CAN0 ((CAN_T *) CAN0_BA)
  227. #define CAN1 ((CAN_T *) CAN1_BA)
  228. /** @addtogroup CAN_EXPORTED_STRUCTS CAN Exported Structs
  229. @{
  230. */
  231. /**
  232. * @details CAN message structure
  233. */
  234. typedef struct
  235. {
  236. uint32_t IdType; /*!< ID type */
  237. uint32_t FrameType; /*!< Frame type */
  238. uint32_t Id; /*!< Message ID */
  239. uint8_t DLC; /*!< Data length */
  240. uint8_t Data[8]; /*!< Data */
  241. } STR_CANMSG_T;
  242. /**
  243. * @details CAN mask message structure
  244. */
  245. typedef struct
  246. {
  247. uint8_t u8Xtd; /*!< Extended ID */
  248. uint8_t u8Dir; /*!< Direction */
  249. uint32_t u32Id; /*!< Message ID */
  250. uint8_t u8IdType; /*!< ID type*/
  251. } STR_CANMASK_T;
  252. /*@}*/ /* end of group CAN_EXPORTED_STRUCTS */
  253. /** @cond HIDDEN_SYMBOLS */
  254. #define MSG(id) (id)
  255. /** @endcond HIDDEN_SYMBOLS */
  256. /** @addtogroup CAN_EXPORTED_FUNCTIONS CAN Exported Functions
  257. @{
  258. */
  259. /**
  260. * @brief Get interrupt status.
  261. *
  262. * @param[in] can The base address of can module.
  263. *
  264. * @return CAN module status register value.
  265. *
  266. * @details Status Interrupt is generated by bits BOff (CAN_STATUS[7]), EWarn (CAN_STATUS[6]),
  267. * EPass (CAN_STATUS[5]), RxOk (CAN_STATUS[4]), TxOk (CAN_STATUS[3]), and LEC (CAN_STATUS[2:0]).
  268. * \hideinitializer
  269. */
  270. #define CAN_GET_INT_STATUS(can) ((can)->STATUS)
  271. /**
  272. * @brief Get specified interrupt pending status.
  273. *
  274. * @param[in] can The base address of can module.
  275. *
  276. * @return The source of the interrupt.
  277. *
  278. * @details If several interrupts are pending, the CAN Interrupt Register will point to the pending interrupt
  279. * with the highest priority, disregarding their chronological order.
  280. * \hideinitializer
  281. */
  282. #define CAN_GET_INT_PENDING_STATUS(can) ((can)->IIDR)
  283. /**
  284. * @brief Disable wake-up function.
  285. *
  286. * @param[in] can The base address of can module.
  287. *
  288. * @return None
  289. *
  290. * @details The macro is used to disable wake-up function.
  291. * \hideinitializer
  292. */
  293. #define CAN_DISABLE_WAKEUP(can) ((can)->WU_EN = 0ul)
  294. /**
  295. * @brief Enable wake-up function.
  296. *
  297. * @param[in] can The base address of can module.
  298. *
  299. * @return None
  300. *
  301. * @details User can wake-up system when there is a falling edge in the CAN_Rx pin.
  302. * \hideinitializer
  303. */
  304. #define CAN_ENABLE_WAKEUP(can) ((can)->WU_EN = CAN_WU_EN_WAKUP_EN_Msk)
  305. /**
  306. * @brief Get specified Message Object new data into bit value.
  307. *
  308. * @param[in] can The base address of can module.
  309. * @param[in] u32MsgNum Specified Message Object number, valid value are from 0 to 31.
  310. *
  311. * @return Specified Message Object new data into bit value.
  312. *
  313. * @details The NewDat bit (CAN_IFn_MCON[15]) of a specific Message Object can be set/reset by the software through the IFn Message Interface Registers
  314. * or by the Message Handler after reception of a Data Frame or after a successful transmission.
  315. * \hideinitializer
  316. */
  317. #define CAN_GET_NEW_DATA_IN_BIT(can, u32MsgNum) ((u32MsgNum) < 16 ? (can)->NDAT1 & (1 << (u32MsgNum)) : (can)->NDAT2 & (1 << ((u32MsgNum)-16)))
  318. /*---------------------------------------------------------------------------------------------------------*/
  319. /* Define CAN functions prototype */
  320. /*---------------------------------------------------------------------------------------------------------*/
  321. uint32_t CAN_SetBaudRate(CAN_T *tCAN, uint32_t u32BaudRate);
  322. uint32_t CAN_Open(CAN_T *tCAN, uint32_t u32BaudRate, uint32_t u32Mode);
  323. void CAN_Close(CAN_T *tCAN);
  324. void CAN_CLR_INT_PENDING_BIT(CAN_T *tCAN, uint8_t u32MsgNum);
  325. void CAN_EnableInt(CAN_T *tCAN, uint32_t u32Mask);
  326. void CAN_DisableInt(CAN_T *tCAN, uint32_t u32Mask);
  327. int32_t CAN_Transmit(CAN_T *tCAN, uint32_t u32MsgNum, STR_CANMSG_T *pCanMsg);
  328. int32_t CAN_Receive(CAN_T *tCAN, uint32_t u32MsgNum, STR_CANMSG_T *pCanMsg);
  329. int32_t CAN_SetMultiRxMsg(CAN_T *tCAN, uint32_t u32MsgNum, uint32_t u32MsgCount, uint32_t u32IDType, uint32_t u32ID);
  330. int32_t CAN_SetRxMsg(CAN_T *tCAN, uint32_t u32MsgNum, uint32_t u32IDType, uint32_t u32ID);
  331. int32_t CAN_SetRxMsgAndMsk(CAN_T *tCAN, uint32_t u32MsgNum, uint32_t u32IDType, uint32_t u32ID, uint32_t u32IDMask);
  332. int32_t CAN_SetTxMsg(CAN_T *tCAN, uint32_t u32MsgNum, STR_CANMSG_T *pCanMsg);
  333. int32_t CAN_TriggerTxMsg(CAN_T *tCAN, uint32_t u32MsgNum);
  334. int32_t CAN_BasicSendMsg(CAN_T *tCAN, STR_CANMSG_T *pCanMsg);
  335. int32_t CAN_BasicReceiveMsg(CAN_T *tCAN, STR_CANMSG_T *pCanMsg);
  336. void CAN_EnterInitMode(CAN_T *tCAN, uint8_t u8Mask);
  337. void CAN_EnterTestMode(CAN_T *tCAN, uint8_t u8TestMask);
  338. void CAN_LeaveTestMode(CAN_T *tCAN);
  339. uint32_t CAN_GetCANBitRate(CAN_T *tCAN);
  340. uint32_t CAN_IsNewDataReceived(CAN_T *tCAN, uint8_t u8MsgObj);
  341. void CAN_LeaveInitMode(CAN_T *tCAN);
  342. int32_t CAN_SetRxMsgObjAndMsk(CAN_T *tCAN, uint8_t u8MsgObj, uint8_t u8idType, uint32_t u32id, uint32_t u32idmask, uint8_t u8singleOrFifoLast);
  343. int32_t CAN_SetRxMsgObj(CAN_T *tCAN, uint8_t u8MsgObj, uint8_t u8idType, uint32_t u32id, uint8_t u8singleOrFifoLast);
  344. void CAN_WaitMsg(CAN_T *tCAN);
  345. int32_t CAN_ReadMsgObj(CAN_T *tCAN, uint8_t u8MsgObj, uint8_t u8Release, STR_CANMSG_T *pCanMsg);
  346. /*@}*/ /* end of group CAN_EXPORTED_FUNCTIONS */
  347. /*@}*/ /* end of group CAN_Driver */
  348. /*@}*/ /* end of group Standard_Driver */
  349. #endif /*__NU_CAN_H__ */
  350. /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/