mcp_can_dfs.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. /*
  2. mcp_can_dfs.h
  3. 2012 Copyright (c) Seeed Technology Inc. All right reserved.
  4. 2017 Copyright (c) Cory J. Fowler All Rights Reserved.
  5. Author:Loovee
  6. Contributor: Cory J. Fowler
  7. 2017-09-25
  8. This library is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU Lesser General Public
  10. License as published by the Free Software Foundation; either
  11. version 2.1 of the License, or (at your option) any later version.
  12. This library is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. Lesser General Public License for more details.
  16. You should have received a copy of the GNU Lesser General Public
  17. License along with this library; if not, write to the Free Software
  18. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-
  19. 1301 USA
  20. */
  21. #ifndef _MCP2515DFS_H_
  22. #define _MCP2515DFS_H_
  23. #include <Arduino.h>
  24. #include <SPI.h>
  25. #include <inttypes.h>
  26. #ifndef INT32U
  27. #define INT32U unsigned long
  28. #endif
  29. #ifndef INT8U
  30. #define INT8U byte
  31. #endif
  32. // if print debug information
  33. #define DEBUG_MODE 1
  34. /*
  35. * Begin mt
  36. */
  37. #define TIMEOUTVALUE 50
  38. #define MCP_SIDH 0
  39. #define MCP_SIDL 1
  40. #define MCP_EID8 2
  41. #define MCP_EID0 3
  42. #define MCP_TXB_EXIDE_M 0x08 /* In TXBnSIDL */
  43. #define MCP_DLC_MASK 0x0F /* 4 LSBits */
  44. #define MCP_RTR_MASK 0x40 /* (1<<6) Bit 6 */
  45. #define MCP_RXB_RX_ANY 0x60
  46. #define MCP_RXB_RX_EXT 0x40
  47. #define MCP_RXB_RX_STD 0x20
  48. #define MCP_RXB_RX_STDEXT 0x00
  49. #define MCP_RXB_RX_MASK 0x60
  50. #define MCP_RXB_BUKT_MASK (1<<2)
  51. /*
  52. ** Bits in the TXBnCTRL registers.
  53. */
  54. #define MCP_TXB_TXBUFE_M 0x80
  55. #define MCP_TXB_ABTF_M 0x40
  56. #define MCP_TXB_MLOA_M 0x20
  57. #define MCP_TXB_TXERR_M 0x10
  58. #define MCP_TXB_TXREQ_M 0x08
  59. #define MCP_TXB_TXIE_M 0x04
  60. #define MCP_TXB_TXP10_M 0x03
  61. #define MCP_TXB_RTR_M 0x40 /* In TXBnDLC */
  62. #define MCP_RXB_IDE_M 0x08 /* In RXBnSIDL */
  63. #define MCP_RXB_RTR_M 0x40 /* In RXBnDLC */
  64. #define MCP_STAT_RXIF_MASK (0x03)
  65. #define MCP_STAT_RX0IF (1<<0)
  66. #define MCP_STAT_RX1IF (1<<1)
  67. #define MCP_EFLG_RX1OVR (1<<7)
  68. #define MCP_EFLG_RX0OVR (1<<6)
  69. #define MCP_EFLG_TXBO (1<<5)
  70. #define MCP_EFLG_TXEP (1<<4)
  71. #define MCP_EFLG_RXEP (1<<3)
  72. #define MCP_EFLG_TXWAR (1<<2)
  73. #define MCP_EFLG_RXWAR (1<<1)
  74. #define MCP_EFLG_EWARN (1<<0)
  75. #define MCP_EFLG_ERRORMASK (0xF8) /* 5 MS-Bits */
  76. #define MCP_BxBFS_MASK 0x30
  77. #define MCP_BxBFE_MASK 0x0C
  78. #define MCP_BxBFM_MASK 0x03
  79. #define MCP_BxRTS_MASK 0x38
  80. #define MCP_BxRTSM_MASK 0x07
  81. /*
  82. * Define MCP2515 register addresses
  83. */
  84. #define MCP_RXF0SIDH 0x00
  85. #define MCP_RXF0SIDL 0x01
  86. #define MCP_RXF0EID8 0x02
  87. #define MCP_RXF0EID0 0x03
  88. #define MCP_RXF1SIDH 0x04
  89. #define MCP_RXF1SIDL 0x05
  90. #define MCP_RXF1EID8 0x06
  91. #define MCP_RXF1EID0 0x07
  92. #define MCP_RXF2SIDH 0x08
  93. #define MCP_RXF2SIDL 0x09
  94. #define MCP_RXF2EID8 0x0A
  95. #define MCP_RXF2EID0 0x0B
  96. #define MCP_BFPCTRL 0x0C
  97. #define MCP_TXRTSCTRL 0x0D
  98. #define MCP_CANSTAT 0x0E
  99. #define MCP_CANCTRL 0x0F
  100. #define MCP_RXF3SIDH 0x10
  101. #define MCP_RXF3SIDL 0x11
  102. #define MCP_RXF3EID8 0x12
  103. #define MCP_RXF3EID0 0x13
  104. #define MCP_RXF4SIDH 0x14
  105. #define MCP_RXF4SIDL 0x15
  106. #define MCP_RXF4EID8 0x16
  107. #define MCP_RXF4EID0 0x17
  108. #define MCP_RXF5SIDH 0x18
  109. #define MCP_RXF5SIDL 0x19
  110. #define MCP_RXF5EID8 0x1A
  111. #define MCP_RXF5EID0 0x1B
  112. #define MCP_TEC 0x1C
  113. #define MCP_REC 0x1D
  114. #define MCP_RXM0SIDH 0x20
  115. #define MCP_RXM0SIDL 0x21
  116. #define MCP_RXM0EID8 0x22
  117. #define MCP_RXM0EID0 0x23
  118. #define MCP_RXM1SIDH 0x24
  119. #define MCP_RXM1SIDL 0x25
  120. #define MCP_RXM1EID8 0x26
  121. #define MCP_RXM1EID0 0x27
  122. #define MCP_CNF3 0x28
  123. #define MCP_CNF2 0x29
  124. #define MCP_CNF1 0x2A
  125. #define MCP_CANINTE 0x2B
  126. #define MCP_CANINTF 0x2C
  127. #define MCP_EFLG 0x2D
  128. #define MCP_TXB0CTRL 0x30
  129. #define MCP_TXB1CTRL 0x40
  130. #define MCP_TXB2CTRL 0x50
  131. #define MCP_RXB0CTRL 0x60
  132. #define MCP_RXB0SIDH 0x61
  133. #define MCP_RXB1CTRL 0x70
  134. #define MCP_RXB1SIDH 0x71
  135. #define MCP_TX_INT 0x1C /* Enable all transmit interrup ts */
  136. #define MCP_TX01_INT 0x0C /* Enable TXB0 and TXB1 interru pts */
  137. #define MCP_RX_INT 0x03 /* Enable receive interrupts */
  138. #define MCP_NO_INT 0x00 /* Disable all interrupts */
  139. #define MCP_TX01_MASK 0x14
  140. #define MCP_TX_MASK 0x54
  141. /*
  142. * Define SPI Instruction Set
  143. */
  144. #define MCP_WRITE 0x02
  145. #define MCP_READ 0x03
  146. #define MCP_BITMOD 0x05
  147. #define MCP_LOAD_TX0 0x40
  148. #define MCP_LOAD_TX1 0x42
  149. #define MCP_LOAD_TX2 0x44
  150. #define MCP_RTS_TX0 0x81
  151. #define MCP_RTS_TX1 0x82
  152. #define MCP_RTS_TX2 0x84
  153. #define MCP_RTS_ALL 0x87
  154. #define MCP_READ_RX0 0x90
  155. #define MCP_READ_RX1 0x94
  156. #define MCP_READ_STATUS 0xA0
  157. #define MCP_RX_STATUS 0xB0
  158. #define MCP_RESET 0xC0
  159. /*
  160. * CANCTRL Register Values
  161. */
  162. #define MCP_NORMAL 0x00
  163. #define MCP_SLEEP 0x20
  164. #define MCP_LOOPBACK 0x40
  165. #define MCP_LISTENONLY 0x60
  166. #define MODE_CONFIG 0x80
  167. #define MODE_POWERUP 0xE0
  168. #define MODE_MASK 0xE0
  169. #define ABORT_TX 0x10
  170. #define MODE_ONESHOT 0x08
  171. #define CLKOUT_ENABLE 0x04
  172. #define CLKOUT_DISABLE 0x00
  173. #define CLKOUT_PS1 0x00
  174. #define CLKOUT_PS2 0x01
  175. #define CLKOUT_PS4 0x02
  176. #define CLKOUT_PS8 0x03
  177. /*
  178. * CNF1 Register Values
  179. */
  180. #define SJW1 0x00
  181. #define SJW2 0x40
  182. #define SJW3 0x80
  183. #define SJW4 0xC0
  184. /*
  185. * CNF2 Register Values
  186. */
  187. #define BTLMODE 0x80
  188. #define SAMPLE_1X 0x00
  189. #define SAMPLE_3X 0x40
  190. /*
  191. * CNF3 Register Values
  192. */
  193. #define SOF_ENABLE 0x80
  194. #define SOF_DISABLE 0x00
  195. #define WAKFIL_ENABLE 0x40
  196. #define WAKFIL_DISABLE 0x00
  197. /*
  198. * CANINTF Register Bits
  199. */
  200. #define MCP_RX0IF 0x01
  201. #define MCP_RX1IF 0x02
  202. #define MCP_TX0IF 0x04
  203. #define MCP_TX1IF 0x08
  204. #define MCP_TX2IF 0x10
  205. #define MCP_ERRIF 0x20
  206. #define MCP_WAKIF 0x40
  207. #define MCP_MERRF 0x80
  208. /*
  209. * Speed 8M
  210. */
  211. #define MCP_8MHz_1000kBPS_CFG1 (0x00)
  212. #define MCP_8MHz_1000kBPS_CFG2 (0xC0) /* Enabled SAM bit */
  213. #define MCP_8MHz_1000kBPS_CFG3 (0x80) /* Sample point at 75% */
  214. #define MCP_8MHz_500kBPS_CFG1 (0x00)
  215. #define MCP_8MHz_500kBPS_CFG2 (0xD1) /* Enabled SAM bit */
  216. #define MCP_8MHz_500kBPS_CFG3 (0x81) /* Sample point at 75% */
  217. #define MCP_8MHz_250kBPS_CFG1 (0x80) /* Increased SJW */
  218. #define MCP_8MHz_250kBPS_CFG2 (0xE5) /* Enabled SAM bit */
  219. #define MCP_8MHz_250kBPS_CFG3 (0x83) /* Sample point at 75% */
  220. #define MCP_8MHz_200kBPS_CFG1 (0x80) /* Increased SJW */
  221. #define MCP_8MHz_200kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  222. #define MCP_8MHz_200kBPS_CFG3 (0x84) /* Sample point at 75% */
  223. #define MCP_8MHz_125kBPS_CFG1 (0x81) /* Increased SJW */
  224. #define MCP_8MHz_125kBPS_CFG2 (0xE5) /* Enabled SAM bit */
  225. #define MCP_8MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */
  226. #define MCP_8MHz_100kBPS_CFG1 (0x81) /* Increased SJW */
  227. #define MCP_8MHz_100kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  228. #define MCP_8MHz_100kBPS_CFG3 (0x84) /* Sample point at 75% */
  229. #define MCP_8MHz_80kBPS_CFG1 (0x84) /* Increased SJW */
  230. #define MCP_8MHz_80kBPS_CFG2 (0xD3) /* Enabled SAM bit */
  231. #define MCP_8MHz_80kBPS_CFG3 (0x81) /* Sample point at 75% */
  232. #define MCP_8MHz_50kBPS_CFG1 (0x84) /* Increased SJW */
  233. #define MCP_8MHz_50kBPS_CFG2 (0xE5) /* Enabled SAM bit */
  234. #define MCP_8MHz_50kBPS_CFG3 (0x83) /* Sample point at 75% */
  235. #define MCP_8MHz_40kBPS_CFG1 (0x84) /* Increased SJW */
  236. #define MCP_8MHz_40kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  237. #define MCP_8MHz_40kBPS_CFG3 (0x84) /* Sample point at 75% */
  238. #define MCP_8MHz_33k3BPS_CFG1 (0x85) /* Increased SJW */
  239. #define MCP_8MHz_33k3BPS_CFG2 (0xF6) /* Enabled SAM bit */
  240. #define MCP_8MHz_33k3BPS_CFG3 (0x84) /* Sample point at 75% */
  241. #define MCP_8MHz_31k25BPS_CFG1 (0x87) /* Increased SJW */
  242. #define MCP_8MHz_31k25BPS_CFG2 (0xE5) /* Enabled SAM bit */
  243. #define MCP_8MHz_31k25BPS_CFG3 (0x83) /* Sample point at 75% */
  244. #define MCP_8MHz_20kBPS_CFG1 (0x89) /* Increased SJW */
  245. #define MCP_8MHz_20kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  246. #define MCP_8MHz_20kBPS_CFG3 (0x84) /* Sample point at 75% */
  247. #define MCP_8MHz_10kBPS_CFG1 (0x93) /* Increased SJW */
  248. #define MCP_8MHz_10kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  249. #define MCP_8MHz_10kBPS_CFG3 (0x84) /* Sample point at 75% */
  250. #define MCP_8MHz_5kBPS_CFG1 (0xA7) /* Increased SJW */
  251. #define MCP_8MHz_5kBPS_CFG2 (0xF6) /* Enabled SAM bit */
  252. #define MCP_8MHz_5kBPS_CFG3 (0x84) /* Sample point at 75% */
  253. /*
  254. * speed 16M
  255. */
  256. #define MCP_16MHz_1000kBPS_CFG1 (0x00)
  257. #define MCP_16MHz_1000kBPS_CFG2 (0xCA)
  258. #define MCP_16MHz_1000kBPS_CFG3 (0x81) /* Sample point at 75% */
  259. #define MCP_16MHz_500kBPS_CFG1 (0x40) /* Increased SJW */
  260. #define MCP_16MHz_500kBPS_CFG2 (0xE5)
  261. #define MCP_16MHz_500kBPS_CFG3 (0x83) /* Sample point at 75% */
  262. #define MCP_16MHz_250kBPS_CFG1 (0x41)
  263. #define MCP_16MHz_250kBPS_CFG2 (0xE5)
  264. #define MCP_16MHz_250kBPS_CFG3 (0x83) /* Sample point at 75% */
  265. #define MCP_16MHz_200kBPS_CFG1 (0x41) /* Increased SJW */
  266. #define MCP_16MHz_200kBPS_CFG2 (0xF6)
  267. #define MCP_16MHz_200kBPS_CFG3 (0x84) /* Sample point at 75% */
  268. #define MCP_16MHz_125kBPS_CFG1 (0x43) /* Increased SJW */
  269. #define MCP_16MHz_125kBPS_CFG2 (0xE5)
  270. #define MCP_16MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */
  271. #define MCP_16MHz_100kBPS_CFG1 (0x44) /* Increased SJW */
  272. #define MCP_16MHz_100kBPS_CFG2 (0xE5)
  273. #define MCP_16MHz_100kBPS_CFG3 (0x83) /* Sample point at 75% */
  274. #define MCP_16MHz_80kBPS_CFG1 (0x44) /* Increased SJW */
  275. #define MCP_16MHz_80kBPS_CFG2 (0xF6)
  276. #define MCP_16MHz_80kBPS_CFG3 (0x84) /* Sample point at 75% */
  277. #define MCP_16MHz_50kBPS_CFG1 (0x47) /* Increased SJW */
  278. #define MCP_16MHz_50kBPS_CFG2 (0xF6)
  279. #define MCP_16MHz_50kBPS_CFG3 (0x84) /* Sample point at 75% */
  280. #define MCP_16MHz_40kBPS_CFG1 (0x49) /* Increased SJW */
  281. #define MCP_16MHz_40kBPS_CFG2 (0xF6)
  282. #define MCP_16MHz_40kBPS_CFG3 (0x84) /* Sample point at 75% */
  283. #define MCP_16MHz_33k3BPS_CFG1 (0x4E)
  284. #define MCP_16MHz_33k3BPS_CFG2 (0xE5)
  285. #define MCP_16MHz_33k3BPS_CFG3 (0x83) /* Sample point at 75% */
  286. #define MCP_16MHz_20kBPS_CFG1 (0x53) /* Increased SJW */
  287. #define MCP_16MHz_20kBPS_CFG2 (0xF6)
  288. #define MCP_16MHz_20kBPS_CFG3 (0x84) /* Sample point at 75% */
  289. #define MCP_16MHz_10kBPS_CFG1 (0x67) /* Increased SJW */
  290. #define MCP_16MHz_10kBPS_CFG2 (0xF6)
  291. #define MCP_16MHz_10kBPS_CFG3 (0x84) /* Sample point at 75% */
  292. #define MCP_16MHz_5kBPS_CFG1 (0x3F)
  293. #define MCP_16MHz_5kBPS_CFG2 (0xFF)
  294. #define MCP_16MHz_5kBPS_CFG3 (0x87) /* Sample point at 68% */
  295. /*
  296. * speed 20M
  297. */
  298. #define MCP_20MHz_1000kBPS_CFG1 (0x00)
  299. #define MCP_20MHz_1000kBPS_CFG2 (0xD9)
  300. #define MCP_20MHz_1000kBPS_CFG3 (0x82) /* Sample point at 80% */
  301. #define MCP_20MHz_500kBPS_CFG1 (0x40) /* Increased SJW */
  302. #define MCP_20MHz_500kBPS_CFG2 (0xF6)
  303. #define MCP_20MHz_500kBPS_CFG3 (0x84) /* Sample point at 75% */
  304. #define MCP_20MHz_250kBPS_CFG1 (0x41) /* Increased SJW */
  305. #define MCP_20MHz_250kBPS_CFG2 (0xF6)
  306. #define MCP_20MHz_250kBPS_CFG3 (0x84) /* Sample point at 75% */
  307. #define MCP_20MHz_200kBPS_CFG1 (0x44) /* Increased SJW */
  308. #define MCP_20MHz_200kBPS_CFG2 (0xD3)
  309. #define MCP_20MHz_200kBPS_CFG3 (0x81) /* Sample point at 80% */
  310. #define MCP_20MHz_125kBPS_CFG1 (0x44) /* Increased SJW */
  311. #define MCP_20MHz_125kBPS_CFG2 (0xE5)
  312. #define MCP_20MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */
  313. #define MCP_20MHz_100kBPS_CFG1 (0x44) /* Increased SJW */
  314. #define MCP_20MHz_100kBPS_CFG2 (0xF6)
  315. #define MCP_20MHz_100kBPS_CFG3 (0x84) /* Sample point at 75% */
  316. #define MCP_20MHz_80kBPS_CFG1 (0xC4) /* Increased SJW */
  317. #define MCP_20MHz_80kBPS_CFG2 (0xFF)
  318. #define MCP_20MHz_80kBPS_CFG3 (0x87) /* Sample point at 68% */
  319. #define MCP_20MHz_50kBPS_CFG1 (0x49) /* Increased SJW */
  320. #define MCP_20MHz_50kBPS_CFG2 (0xF6)
  321. #define MCP_20MHz_50kBPS_CFG3 (0x84) /* Sample point at 75% */
  322. #define MCP_20MHz_40kBPS_CFG1 (0x18)
  323. #define MCP_20MHz_40kBPS_CFG2 (0xD3)
  324. #define MCP_20MHz_40kBPS_CFG3 (0x81) /* Sample point at 80% */
  325. #define MCPDEBUG (0)
  326. #define MCPDEBUG_TXBUF (0)
  327. #define MCP_N_TXBUFFERS (3)
  328. #define MCP_RXBUF_0 (MCP_RXB0SIDH)
  329. #define MCP_RXBUF_1 (MCP_RXB1SIDH)
  330. #define MCP2515_SELECT() digitalWrite(MCPCS, LOW)
  331. #define MCP2515_UNSELECT() digitalWrite(MCPCS, HIGH)
  332. #define MCP2515_OK (0)
  333. #define MCP2515_FAIL (1)
  334. #define MCP_ALLTXBUSY (2)
  335. #define CANDEBUG 1
  336. #define CANUSELOOP 0
  337. #define CANSENDTIMEOUT (200) /* milliseconds */
  338. /*
  339. * initial value of gCANAutoProcess
  340. */
  341. #define CANAUTOPROCESS (1)
  342. #define CANAUTOON (1)
  343. #define CANAUTOOFF (0)
  344. #define CAN_STDID (0)
  345. #define CAN_EXTID (1)
  346. #define CANDEFAULTIDENT (0x55CC)
  347. #define CANDEFAULTIDENTEXT (CAN_EXTID)
  348. #define MCP_STDEXT 0 /* Standard and Extended */
  349. #define MCP_STD 1 /* Standard IDs ONLY */
  350. #define MCP_EXT 2 /* Extended IDs ONLY */
  351. #define MCP_ANY 3 /* Disables Masks and Filters */
  352. #define MCP_20MHZ 0
  353. #define MCP_16MHZ 1
  354. #define MCP_8MHZ 2
  355. #define CAN_4K096BPS 0
  356. #define CAN_5KBPS 1
  357. #define CAN_10KBPS 2
  358. #define CAN_20KBPS 3
  359. #define CAN_31K25BPS 4
  360. #define CAN_33K3BPS 5
  361. #define CAN_40KBPS 6
  362. #define CAN_50KBPS 7
  363. #define CAN_80KBPS 8
  364. #define CAN_100KBPS 9
  365. #define CAN_125KBPS 10
  366. #define CAN_200KBPS 11
  367. #define CAN_250KBPS 12
  368. #define CAN_500KBPS 13
  369. #define CAN_1000KBPS 14
  370. #define CAN_OK (0)
  371. #define CAN_FAILINIT (1)
  372. #define CAN_FAILTX (2)
  373. #define CAN_MSGAVAIL (3)
  374. #define CAN_NOMSG (4)
  375. #define CAN_CTRLERROR (5)
  376. #define CAN_GETTXBFTIMEOUT (6)
  377. #define CAN_SENDMSGTIMEOUT (7)
  378. #define CAN_FAIL (0xff)
  379. #define CAN_MAX_CHAR_IN_MESSAGE (8)
  380. #endif
  381. /*********************************************************************************************************
  382. END FILE
  383. *********************************************************************************************************/