can_regdef.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /**
  2. * @section License
  3. *
  4. * The MIT License (MIT)
  5. *
  6. * Copyright (c) 2017, Thomas Barth, barth-dev.de
  7. *
  8. * Permission is hereby granted, free of charge, to any person
  9. * obtaining a copy of this software and associated documentation
  10. * files (the "Software"), to deal in the Software without
  11. * restriction, including without limitation the rights to use, copy,
  12. * modify, merge, publish, distribute, sublicense, and/or sell copies
  13. * of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be
  17. * included in all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  20. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  21. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  22. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  23. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  24. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  25. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  26. * SOFTWARE.
  27. */
  28. #ifndef __DRIVERS_CAN_REGDEF_H_
  29. #define __DRIVERS_CAN_REGDEF_H_
  30. #include "CAN.h" //CAN_FIR_t
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. /** \brief Start address of CAN registers */
  35. #define MODULE_CAN ((volatile CAN_Module_t *) 0x3ff6b000)
  36. /** \brief Get standard message ID */
  37. #define _CAN_GET_STD_ID \
  38. (((uint32_t) MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.STD.ID[0] << 3) | (MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.STD.ID[1] >> 5))
  39. /** \brief Get extended message ID */
  40. #define _CAN_GET_EXT_ID \
  41. (((uint32_t) MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[0] << 21) | \
  42. (MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[1] << 13) | (MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[2] << 5) | \
  43. (MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[3] >> 3))
  44. /** \brief Set standard message ID */
  45. #define _CAN_SET_STD_ID(x) \
  46. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.STD.ID[0] = ((x) >> 3); \
  47. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.STD.ID[1] = ((x) << 5);
  48. /** \brief Set extended message ID */
  49. #define _CAN_SET_EXT_ID(x) \
  50. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[0] = ((x) >> 21); \
  51. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[1] = ((x) >> 13); \
  52. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[2] = ((x) >> 5); \
  53. MODULE_CAN->MBX_CTRL.FCTRL.TX_RX.EXT.ID[3] = ((x) << 3);
  54. /** \brief Interrupt status register */
  55. typedef enum {
  56. __CAN_IRQ_RX = BIT(0), /**< \brief RX Interrupt */
  57. __CAN_IRQ_TX = BIT(1), /**< \brief TX Interrupt */
  58. __CAN_IRQ_ERR = BIT(2), /**< \brief Error Interrupt */
  59. __CAN_IRQ_DATA_OVERRUN = BIT(3), /**< \brief Data Overrun Interrupt */
  60. __CAN_IRQ_WAKEUP = BIT(4), /**< \brief Wakeup Interrupt */
  61. __CAN_IRQ_ERR_PASSIVE = BIT(5), /**< \brief Passive Error Interrupt */
  62. __CAN_IRQ_ARB_LOST = BIT(6), /**< \brief Arbitration lost interrupt */
  63. __CAN_IRQ_BUS_ERR = BIT(7), /**< \brief Bus error Interrupt */
  64. } __CAN_IRQ_t;
  65. /** \brief OCMODE options. */
  66. typedef enum {
  67. __CAN_OC_BOM = 0b00, /**< \brief bi-phase output mode */
  68. __CAN_OC_TOM = 0b01, /**< \brief test output mode */
  69. __CAN_OC_NOM = 0b10, /**< \brief normal output mode */
  70. __CAN_OC_COM = 0b11, /**< \brief clock output mode */
  71. } __CAN_OCMODE_t;
  72. /**
  73. * CAN controller (SJA1000).
  74. */
  75. typedef struct {
  76. union {
  77. uint32_t U; /**< \brief Unsigned access */
  78. struct {
  79. unsigned int RM : 1; /**< \brief MOD.0 Reset Mode */
  80. unsigned int LOM : 1; /**< \brief MOD.1 Listen Only Mode */
  81. unsigned int STM : 1; /**< \brief MOD.2 Self Test Mode */
  82. unsigned int AFM : 1; /**< \brief MOD.3 Acceptance Filter Mode */
  83. unsigned int SM : 1; /**< \brief MOD.4 Sleep Mode */
  84. unsigned int reserved_27 : 27; /**< \brief \internal Reserved */
  85. } B;
  86. } MOD;
  87. union {
  88. uint32_t U; /**< \brief Unsigned access */
  89. struct {
  90. unsigned int TR : 1; /**< \brief CMR.0 Transmission Request */
  91. unsigned int AT : 1; /**< \brief CMR.1 Abort Transmission */
  92. unsigned int RRB : 1; /**< \brief CMR.2 Release Receive Buffer */
  93. unsigned int CDO : 1; /**< \brief CMR.3 Clear Data Overrun */
  94. unsigned int GTS : 1; /**< \brief CMR.4 Go To Sleep */
  95. unsigned int reserved_27 : 27; /**< \brief \internal Reserved */
  96. } B;
  97. } CMR;
  98. union {
  99. uint32_t U; /**< \brief Unsigned access */
  100. struct {
  101. unsigned int RBS : 1; /**< \brief SR.0 Receive Buffer Status */
  102. unsigned int DOS : 1; /**< \brief SR.1 Data Overrun Status */
  103. unsigned int TBS : 1; /**< \brief SR.2 Transmit Buffer Status */
  104. unsigned int TCS : 1; /**< \brief SR.3 Transmission Complete Status */
  105. unsigned int RS : 1; /**< \brief SR.4 Receive Status */
  106. unsigned int TS : 1; /**< \brief SR.5 Transmit Status */
  107. unsigned int ES : 1; /**< \brief SR.6 Error Status */
  108. unsigned int BS : 1; /**< \brief SR.7 Bus Status */
  109. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  110. } B;
  111. } SR;
  112. union {
  113. uint32_t U; /**< \brief Unsigned access */
  114. struct {
  115. unsigned int RI : 1; /**< \brief IR.0 Receive Interrupt */
  116. unsigned int TI : 1; /**< \brief IR.1 Transmit Interrupt */
  117. unsigned int EI : 1; /**< \brief IR.2 Error Interrupt */
  118. unsigned int DOI : 1; /**< \brief IR.3 Data Overrun Interrupt */
  119. unsigned int WUI : 1; /**< \brief IR.4 Wake-Up Interrupt */
  120. unsigned int EPI : 1; /**< \brief IR.5 Error Passive Interrupt */
  121. unsigned int ALI : 1; /**< \brief IR.6 Arbitration Lost Interrupt */
  122. unsigned int BEI : 1; /**< \brief IR.7 Bus Error Interrupt */
  123. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  124. } B;
  125. } IR;
  126. union {
  127. uint32_t U; /**< \brief Unsigned access */
  128. struct {
  129. unsigned int RIE : 1; /**< \brief IER.0 Receive Interrupt Enable */
  130. unsigned int TIE : 1; /**< \brief IER.1 Transmit Interrupt Enable */
  131. unsigned int EIE : 1; /**< \brief IER.2 Error Interrupt Enable */
  132. unsigned int DOIE : 1; /**< \brief IER.3 Data Overrun Interrupt Enable */
  133. unsigned int WUIE : 1; /**< \brief IER.4 Wake-Up Interrupt Enable */
  134. unsigned int EPIE : 1; /**< \brief IER.5 Error Passive Interrupt Enable */
  135. unsigned int ALIE : 1; /**< \brief IER.6 Arbitration Lost Interrupt Enable */
  136. unsigned int BEIE : 1; /**< \brief IER.7 Bus Error Interrupt Enable */
  137. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  138. } B;
  139. } IER;
  140. uint32_t RESERVED0;
  141. union {
  142. uint32_t U; /**< \brief Unsigned access */
  143. struct {
  144. unsigned int BRP : 6; /**< \brief BTR0[5:0] Baud Rate Prescaler */
  145. unsigned int SJW : 2; /**< \brief BTR0[7:6] Synchronization Jump Width*/
  146. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  147. } B;
  148. } BTR0;
  149. union {
  150. uint32_t U; /**< \brief Unsigned access */
  151. struct {
  152. unsigned int TSEG1 : 4; /**< \brief BTR1[3:0] Timing Segment 1 */
  153. unsigned int TSEG2 : 3; /**< \brief BTR1[6:4] Timing Segment 2*/
  154. unsigned int SAM : 1; /**< \brief BTR1.7 Sampling*/
  155. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  156. } B;
  157. } BTR1;
  158. union {
  159. uint32_t U; /**< \brief Unsigned access */
  160. struct {
  161. unsigned int OCMODE : 2; /**< \brief OCR[1:0] Output Control Mode, see # */
  162. unsigned int OCPOL0 : 1; /**< \brief OCR.2 Output Control Polarity 0 */
  163. unsigned int OCTN0 : 1; /**< \brief OCR.3 Output Control Transistor N0 */
  164. unsigned int OCTP0 : 1; /**< \brief OCR.4 Output Control Transistor P0 */
  165. unsigned int OCPOL1 : 1; /**< \brief OCR.5 Output Control Polarity 1 */
  166. unsigned int OCTN1 : 1; /**< \brief OCR.6 Output Control Transistor N1 */
  167. unsigned int OCTP1 : 1; /**< \brief OCR.7 Output Control Transistor P1 */
  168. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  169. } B;
  170. } OCR;
  171. uint32_t RESERVED1[2];
  172. union {
  173. uint32_t U; /**< \brief Unsigned access */
  174. struct {
  175. unsigned int ALC : 8; /**< \brief ALC[7:0] Arbitration Lost Capture */
  176. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  177. } B;
  178. } ALC;
  179. union {
  180. uint32_t U; /**< \brief Unsigned access */
  181. struct {
  182. unsigned int ECC : 8; /**< \brief ECC[7:0] Error Code Capture */
  183. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  184. } B;
  185. } ECC;
  186. union {
  187. uint32_t U; /**< \brief Unsigned access */
  188. struct {
  189. unsigned int EWLR : 8; /**< \brief EWLR[7:0] Error Warning Limit */
  190. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  191. } B;
  192. } EWLR;
  193. union {
  194. uint32_t U; /**< \brief Unsigned access */
  195. struct {
  196. unsigned int RXERR : 8; /**< \brief RXERR[7:0] Receive Error Counter */
  197. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  198. } B;
  199. } RXERR;
  200. union {
  201. uint32_t U; /**< \brief Unsigned access */
  202. struct {
  203. unsigned int TXERR : 8; /**< \brief TXERR[7:0] Transmit Error Counter */
  204. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  205. } B;
  206. } TXERR;
  207. union {
  208. struct {
  209. uint32_t CODE[4]; /**< \brief Acceptance Message ID */
  210. uint32_t MASK[4]; /**< \brief Acceptance Mask */
  211. uint32_t RESERVED2[5];
  212. } ACC; /**< \brief Acceptance filtering */
  213. struct {
  214. CAN_FIR_t FIR; /**< \brief Frame information record */
  215. union {
  216. struct {
  217. uint32_t ID[2]; /**< \brief Standard frame message-ID*/
  218. uint32_t data[8]; /**< \brief Standard frame payload */
  219. uint32_t reserved[2];
  220. } STD; /**< \brief Standard frame format */
  221. struct {
  222. uint32_t ID[4]; /**< \brief Extended frame message-ID*/
  223. uint32_t data[8]; /**< \brief Extended frame payload */
  224. } EXT; /**< \brief Extended frame format */
  225. } TX_RX; /**< \brief RX/TX interface */
  226. } FCTRL; /**< \brief Function control regs */
  227. } MBX_CTRL; /**< \brief Mailbox control */
  228. union {
  229. uint32_t U; /**< \brief Unsigned access */
  230. struct {
  231. unsigned int RMC : 8; /**< \brief RMC[7:0] RX Message Counter */
  232. unsigned int reserved_24 : 24; /**< \brief \internal Reserved Enable */
  233. } B;
  234. } RMC;
  235. union {
  236. uint32_t U; /**< \brief Unsigned access */
  237. struct {
  238. unsigned int RBSA : 8; /**< \brief RBSA[7:0] RX Buffer Start Address */
  239. unsigned int reserved_24 : 24; /**< \brief \internal Reserved Enable */
  240. } B;
  241. } RBSA;
  242. union {
  243. uint32_t U; /**< \brief Unsigned access */
  244. struct {
  245. unsigned int COD : 3; /**< \brief CDR[2:0] CLKOUT frequency selector based of fOSC*/
  246. unsigned int COFF : 1; /**< \brief CDR.3 CLKOUT off*/
  247. unsigned int reserved_1 : 1; /**< \brief \internal Reserved */
  248. unsigned int
  249. RXINTEN : 1; /**< \brief CDR.5 This bit allows the TX1 output to be used as a dedicated receive interrupt
  250. output*/
  251. unsigned int
  252. CBP : 1; /**< \brief CDR.6 allows to bypass the CAN input comparator and is only possible in reset mode.*/
  253. unsigned int
  254. CAN_M : 1; /**< \brief CDR.7 If CDR.7 is at logic 0 the CAN controller operates in BasicCAN mode. If set to
  255. logic 1 the CAN controller operates in PeliCAN mode. Write access is only possible in reset
  256. mode*/
  257. unsigned int reserved_24 : 24; /**< \brief \internal Reserved */
  258. } B;
  259. } CDR;
  260. uint32_t IRAM[2];
  261. } CAN_Module_t;
  262. #ifdef __cplusplus
  263. }
  264. #endif
  265. #endif /* __DRIVERS_CAN_REGDEF_H_ */