mcp2515.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. --[[
  2. @module mcp2515
  3. @summary mcp2515 CAN协议控制器驱动
  4. @version 1.0
  5. @date 2022.07.08
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local mcp2515 = require "mcp2515"
  11. -- mcp2515 mcu
  12. -- csk spi_sck
  13. -- si spi_mosi
  14. -- so spi_miso
  15. -- cs spi_cs
  16. -- int gpio
  17. sys.subscribe("mcp2515", function(len,buff,config)
  18. print("mcp2515", len,buff:byte(1,len))
  19. for k, v in pairs(config) do
  20. print(k,v)
  21. end
  22. end)
  23. sys.taskInit(function()
  24. local mcp2515_spi= 0
  25. local mcp2515_cs= pin.PB04
  26. local mcp2515_int= pin.PB01
  27. spi_mcp2515 = spi.setup(mcp2515_spi,nil,0,0,8,10*1000*1000,spi.MSB,1,0)
  28. mcp2515.init(mcp2515_spi,mcp2515_cs,mcp2515_int,mcp2515.CAN_500Kbps)
  29. mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,数据帧
  30. mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,数据帧
  31. mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,远程帧
  32. mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,远程帧
  33. end)
  34. ]]
  35. local mcp2515 = {}
  36. local sys = require "sys"
  37. -- SPI 指令集
  38. mcp2515.RESET = 0xC0
  39. mcp2515.READ = 0x03
  40. mcp2515.RD_RX_BUFF = 0x90
  41. mcp2515.RD_RXB0SIDH = 0x90
  42. mcp2515.RD_RXB0D0 = 0x92
  43. mcp2515.RD_RXB1SIDH = 0x94
  44. mcp2515.RD_RXB1D0 = 0x96
  45. mcp2515.WRITE = 0x02
  46. mcp2515.LOAD_TX = 0X40
  47. mcp2515.LOAD_TXB0SIDH = 0X40
  48. mcp2515.LOAD_TXB0D0 = 0X41
  49. mcp2515.LOAD_TXB1SIDH = 0X42
  50. mcp2515.LOAD_TXB1D0 = 0X43
  51. mcp2515.LOAD_TXB2SIDH = 0X44
  52. mcp2515.LOAD_TXB2D0 = 0X45
  53. mcp2515.RTS = 0x80
  54. mcp2515.RTS_TXB0 = 0x81
  55. mcp2515.RTS_TXB1 = 0x82
  56. mcp2515.RTS_TXB2 = 0x84
  57. mcp2515.RD_STATUS = 0xA0
  58. mcp2515.RX_STATUS = 0xB0
  59. mcp2515.BIT_MODIFY = 0x05
  60. -- Configuration Registers
  61. mcp2515.CANSTAT = 0x0E
  62. mcp2515.CANCTRL = 0x0F
  63. mcp2515.BFPCTRL = 0x0C
  64. mcp2515.TEC = 0x1C
  65. mcp2515.REC = 0x1D
  66. mcp2515.CNF3 = 0x28
  67. mcp2515.CNF2 = 0x29
  68. mcp2515.CNF1 = 0x2A
  69. mcp2515.CANINTE = 0x2B
  70. mcp2515.CANINTF = 0x2C
  71. mcp2515.EFLG = 0x2D
  72. mcp2515.TXRTSCTRL = 0x0D
  73. -- Recieve Filters
  74. mcp2515.RXF0SIDH = 0x00
  75. mcp2515.RXF0SIDL = 0x01
  76. mcp2515.RXF0EID8 = 0x02
  77. mcp2515.RXF0EID0 = 0x03
  78. mcp2515.RXF1SIDH = 0x04
  79. mcp2515.RXF1SIDL = 0x05
  80. mcp2515.RXF1EID8 = 0x06
  81. mcp2515.RXF1EID0 = 0x07
  82. mcp2515.RXF2SIDH = 0x08
  83. mcp2515.RXF2SIDL = 0x09
  84. mcp2515.RXF2EID8 = 0x0A
  85. mcp2515.RXF2EID0 = 0x0B
  86. mcp2515.RXF3SIDH = 0x10
  87. mcp2515.RXF3SIDL = 0x11
  88. mcp2515.RXF3EID8 = 0x12
  89. mcp2515.RXF3EID0 = 0x13
  90. mcp2515.RXF4SIDH = 0x14
  91. mcp2515.RXF4SIDL = 0x15
  92. mcp2515.RXF4EID8 = 0x16
  93. mcp2515.RXF4EID0 = 0x17
  94. mcp2515.RXF5SIDH = 0x18
  95. mcp2515.RXF5SIDL = 0x19
  96. mcp2515.RXF5EID8 = 0x1A
  97. mcp2515.RXF5EID0 = 0x1B
  98. -- CNF1
  99. mcp2515.SJW_1TQ = 0x40
  100. mcp2515.SJW_2TQ = 0x80
  101. mcp2515.SJW_3TQ = 0x90
  102. mcp2515.SJW_4TQ = 0xC0
  103. -- CNF2
  104. mcp2515.BTLMODE_CNF3 = 0x80
  105. mcp2515.BTLMODE_PH1_IPT = 0x00
  106. mcp2515.SMPL_3X = 0x40
  107. mcp2515.SMPL_1X = 0x00
  108. mcp2515.PHSEG1_8TQ = 0x38
  109. mcp2515.PHSEG1_7TQ = 0x30
  110. mcp2515.PHSEG1_6TQ = 0x28
  111. mcp2515.PHSEG1_5TQ = 0x20
  112. mcp2515.PHSEG1_4TQ = 0x18
  113. mcp2515.PHSEG1_3TQ = 0x10
  114. mcp2515.PHSEG1_2TQ = 0x08
  115. mcp2515.PHSEG1_1TQ = 0x00
  116. mcp2515.PRSEG_8TQ = 0x07
  117. mcp2515.PRSEG_7TQ = 0x06
  118. mcp2515.PRSEG_6TQ = 0x05
  119. mcp2515.PRSEG_5TQ = 0x04
  120. mcp2515.PRSEG_4TQ = 0x03
  121. mcp2515.PRSEG_3TQ = 0x02
  122. mcp2515.PRSEG_2TQ = 0x01
  123. mcp2515.PRSEG_1TQ = 0x00
  124. -- CNF3
  125. mcp2515.PHSEG2_8TQ = 0x07
  126. mcp2515.PHSEG2_7TQ = 0x06
  127. mcp2515.PHSEG2_6TQ = 0x05
  128. mcp2515.PHSEG2_5TQ = 0x04
  129. mcp2515.PHSEG2_4TQ = 0x03
  130. mcp2515.PHSEG2_3TQ = 0x02
  131. mcp2515.PHSEG2_2TQ = 0x01
  132. mcp2515.PHSEG2_1TQ = 0x00
  133. mcp2515.SOF_ENABLED = 0x80
  134. mcp2515.WAKFIL_ENABLED = 0x40
  135. mcp2515.WAKFIL_DISABLED = 0x00
  136. mcp2515.CAN_10Kbps = 0x31
  137. mcp2515.CAN_25Kbps = 0x13
  138. mcp2515.CAN_50Kbps = 0x09
  139. mcp2515.CAN_100Kbps = 0x04
  140. mcp2515.CAN_125Kbps = 0x03
  141. mcp2515.CAN_250Kbps = 0x01
  142. mcp2515.CAN_500Kbps = 0x00
  143. -- CANINTE
  144. mcp2515.RX0IE_ENABLED = 0x01
  145. mcp2515.RX0IE_DISABLED = 0x00
  146. mcp2515.RX1IE_ENABLED = 0x02
  147. mcp2515.RX1IE_DISABLED = 0x00
  148. mcp2515.G_RXIE_ENABLED = 0x03
  149. mcp2515.G_RXIE_DISABLED = 0x00
  150. mcp2515.TX0IE_ENABLED = 0x04
  151. mcp2515.TX0IE_DISABLED = 0x00
  152. mcp2515.TX1IE_ENABLED = 0x08
  153. mcp2515.TX2IE_DISABLED = 0x00
  154. mcp2515.TX2IE_ENABLED = 0x10
  155. mcp2515.TX2IE_DISABLED = 0x00
  156. mcp2515.G_TXIE_ENABLED = 0x1C
  157. mcp2515.G_TXIE_DISABLED = 0x00
  158. mcp2515.ERRIE_ENABLED = 0x20
  159. mcp2515.ERRIE_DISABLED = 0x00
  160. mcp2515.WAKIE_ENABLED = 0x40
  161. mcp2515.WAKIE_DISABLED = 0x00
  162. mcp2515.IVRE_ENABLED = 0x80
  163. mcp2515.IVRE_DISABLED = 0x00
  164. -- CANINTF
  165. mcp2515.RX0IF_SET = 0x01
  166. mcp2515.RX0IF_RESET = 0x00
  167. mcp2515.RX1IF_SET = 0x02
  168. mcp2515.RX1IF_RESET = 0x00
  169. mcp2515.TX0IF_SET = 0x04
  170. mcp2515.TX0IF_RESET = 0x00
  171. mcp2515.TX1IF_SET = 0x08
  172. mcp2515.TX2IF_RESET = 0x00
  173. mcp2515.TX2IF_SET = 0x10
  174. mcp2515.TX2IF_RESET = 0x00
  175. mcp2515.ERRIF_SET = 0x20
  176. mcp2515.ERRIF_RESET = 0x00
  177. mcp2515.WAKIF_SET = 0x40
  178. mcp2515.WAKIF_RESET = 0x00
  179. mcp2515.IVRF_SET = 0x80
  180. mcp2515.IVRF_RESET = 0x00
  181. -- CANCTRL
  182. mcp2515.REQOP_CONFIG = 0x80--配置模式
  183. mcp2515.REQOP_LISTEN = 0x60--监听模式
  184. mcp2515.REQOP_LOOPBACK = 0x40--回环模式 测试用
  185. mcp2515.REQOP_SLEEP = 0x20--睡眠模式
  186. mcp2515.REQOP_NORMAL = 0x00--正常模式
  187. mcp2515.ABORT = 0x10
  188. mcp2515.OSM_ENABLED = 0x08
  189. mcp2515.CLKOUT_ENABLED = 0x04
  190. mcp2515.CLKOUT_DISABLED = 0x00
  191. mcp2515.CLKOUT_PRE_8 = 0x03
  192. mcp2515.CLKOUT_PRE_4 = 0x02
  193. mcp2515.CLKOUT_PRE_2 = 0x01
  194. mcp2515.CLKOUT_PRE_1 = 0x00
  195. -- RXBnCTRL
  196. mcp2515.RXM_RCV_ALL = 0x60
  197. mcp2515.RXM_VALID_EXT = 0x40
  198. mcp2515.RXM_VALID_STD = 0x20
  199. mcp2515.RXM_VALID_ALL = 0x00
  200. mcp2515.RXRTR_REMOTE = 0x08
  201. mcp2515.RXRTR_NO_REMOTE = 0x00
  202. mcp2515.BUKT_ROLLOVER = 0x04
  203. mcp2515.BUKT_NO_ROLLOVER = 0x00
  204. mcp2515.FILHIT0_FLTR_1 = 0x01
  205. mcp2515.FILHIT0_FLTR_0 = 0x00
  206. mcp2515.FILHIT1_FLTR_5 = 0x05
  207. mcp2515.FILHIT1_FLTR_4 = 0x04
  208. mcp2515.FILHIT1_FLTR_3 = 0x03
  209. mcp2515.FILHIT1_FLTR_2 = 0x02
  210. mcp2515.FILHIT1_FLTR_1 = 0x01
  211. mcp2515.FILHIT1_FLTR_0 = 0x00
  212. -- TXBnCTRL
  213. mcp2515.TXREQ_SET = 0x08
  214. mcp2515.TXREQ_CLEAR = 0x00
  215. mcp2515.TXP_HIGHEST = 0x03
  216. mcp2515.TXP_INTER_HIGH = 0x02
  217. mcp2515.TXP_INTER_LOW = 0x01
  218. mcp2515.TXP_LOWEST = 0x00
  219. mcp2515.DLC_0 = 0x00
  220. mcp2515.DLC_1 = 0x01
  221. mcp2515.DLC_2 = 0x02
  222. mcp2515.DLC_3 = 0x03
  223. mcp2515.DLC_4 = 0x04
  224. mcp2515.DLC_5 = 0x05
  225. mcp2515.DLC_6 = 0x06
  226. mcp2515.DLC_7 = 0x07
  227. mcp2515.DLC_8 = 0x08
  228. -- Receive Masks
  229. mcp2515.RXM0SIDH = 0x20
  230. mcp2515.RXM0SIDL = 0x21
  231. mcp2515.RXM0EID8 = 0x22
  232. mcp2515.RXM0EID0 = 0x23
  233. mcp2515.RXM1SIDH = 0x24
  234. mcp2515.RXM1SIDL = 0x25
  235. mcp2515.RXM1EID8 = 0x26
  236. mcp2515.RXM1EID0 = 0x27
  237. -- Tx Buffer 0
  238. mcp2515.TXB0CTRL = 0x30
  239. mcp2515.TXB0SIDH = 0x31
  240. mcp2515.TXB0SIDL = 0x32
  241. mcp2515.TXB0EID8 = 0x33
  242. mcp2515.TXB0EID0 = 0x34
  243. mcp2515.TXB0DLC = 0x35
  244. mcp2515.TXB0D0 = 0x36
  245. mcp2515.TXB0D1 = 0x37
  246. mcp2515.TXB0D2 = 0x38
  247. mcp2515.TXB0D3 = 0x39
  248. mcp2515.TXB0D4 = 0x3A
  249. mcp2515.TXB0D5 = 0x3B
  250. mcp2515.TXB0D6 = 0x3C
  251. mcp2515.TXB0D7 = 0x3D
  252. -- Tx Buffer 1
  253. mcp2515.TXB1CTRL = 0x40
  254. mcp2515.TXB1SIDH = 0x41
  255. mcp2515.TXB1SIDL = 0x42
  256. mcp2515.TXB1EID8 = 0x43
  257. mcp2515.TXB1EID0 = 0x44
  258. mcp2515.TXB1DLC = 0x45
  259. mcp2515.TXB1D0 = 0x46
  260. mcp2515.TXB1D1 = 0x47
  261. mcp2515.TXB1D2 = 0x48
  262. mcp2515.TXB1D3 = 0x49
  263. mcp2515.TXB1D4 = 0x4A
  264. mcp2515.TXB1D5 = 0x4B
  265. mcp2515.TXB1D6 = 0x4C
  266. mcp2515.TXB1D7 = 0x4D
  267. -- Tx Buffer 2
  268. mcp2515.TXB2CTRL = 0x50
  269. mcp2515.TXB2SIDH = 0x51
  270. mcp2515.TXB2SIDL = 0x52
  271. mcp2515.TXB2EID8 = 0x53
  272. mcp2515.TXB2EID0 = 0x54
  273. mcp2515.TXB2DLC = 0x55
  274. mcp2515.TXB2D0 = 0x56
  275. mcp2515.TXB2D1 = 0x57
  276. mcp2515.TXB2D2 = 0x58
  277. mcp2515.TXB2D3 = 0x59
  278. mcp2515.TXB2D4 = 0x5A
  279. mcp2515.TXB2D5 = 0x5B
  280. mcp2515.TXB2D6 = 0x5C
  281. mcp2515.TXB2D7 = 0x5D
  282. -- Rx Buffer 0
  283. mcp2515.RXB0CTRL = 0x60
  284. mcp2515.RXB0SIDH = 0x61
  285. mcp2515.RXB0SIDL = 0x62
  286. mcp2515.RXB0EID8 = 0x63
  287. mcp2515.RXB0EID0 = 0x64
  288. mcp2515.RXB0DLC = 0x65
  289. mcp2515.RXB0D0 = 0x66
  290. mcp2515.RXB0D1 = 0x67
  291. mcp2515.RXB0D2 = 0x68
  292. mcp2515.RXB0D3 = 0x69
  293. mcp2515.RXB0D4 = 0x6A
  294. mcp2515.RXB0D5 = 0x6B
  295. mcp2515.RXB0D6 = 0x6C
  296. mcp2515.RXB0D7 = 0x6D
  297. -- Rx Buffer 1
  298. mcp2515.RXB1CTRL = 0x70
  299. mcp2515.RXB1SIDH = 0x71
  300. mcp2515.RXB1SIDL = 0x72
  301. mcp2515.RXB1EID8 = 0x73
  302. mcp2515.RXB1EID0 = 0x74
  303. mcp2515.RXB1DLC = 0x75
  304. mcp2515.RXB1D0 = 0x76
  305. mcp2515.RXB1D1 = 0x77
  306. mcp2515.RXB1D2 = 0x78
  307. mcp2515.RXB1D3 = 0x79
  308. mcp2515.RXB1D4 = 0x7A
  309. mcp2515.RXB1D5 = 0x7B
  310. mcp2515.RXB1D6 = 0x7C
  311. mcp2515.RXB1D7 = 0x7D
  312. function mcp2515.write(addr,...)
  313. mcp2515.cs(0)
  314. spi.send(mcp2515.spi, string.char(mcp2515.WRITE,addr,...))
  315. mcp2515.cs(1)
  316. end
  317. function mcp2515.read(addr,len)
  318. mcp2515.cs(0)
  319. spi.send(mcp2515.spi, string.char(mcp2515.READ,addr))
  320. local val = spi.recv(mcp2515.spi,len or 1)
  321. mcp2515.cs(1)
  322. if val then
  323. return string.byte(val,1,len)
  324. end
  325. end
  326. --[[
  327. mcp2515 复位
  328. @api mcp2515.reset()
  329. @usage
  330. mcp2515.reset()
  331. ]]
  332. function mcp2515.reset()
  333. mcp2515.cs(0)
  334. spi.send(mcp2515.spi, string.char(mcp2515.RESET))
  335. mcp2515.cs(1)
  336. end
  337. --[[
  338. mcp2515 数据发送
  339. @api mcp2515.send_buffer(config,...)
  340. @table config 接收数据参数 id:报文ID ide:是否为扩展帧 rtr:是否为远程帧
  341. @number ... 发送数据 数据个数不可大于8
  342. @usage
  343. mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,数据帧
  344. mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,数据帧
  345. mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,远程帧
  346. mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,远程帧
  347. ]]
  348. function mcp2515.send_buffer(config,...)
  349. if config.ide then
  350. mcp2515.write(mcp2515.TXB0SIDH,(config.id>>21)&0xFF)-- 发送缓冲器0标准标识符高位
  351. mcp2515.write(mcp2515.TXB0SIDL,((config.id>>16)&0x03)|0x08|((config.id>>13)&0xE0))-- 发送缓冲器0标准标识符低位与缓冲器0标拓展识符最高两位(第3位为发送拓展标识符使能位)
  352. mcp2515.write(mcp2515.TXB0EID8,(config.id>>8)&0xFF)-- 发送缓冲器0标拓展识符高位
  353. mcp2515.write(mcp2515.TXB0EID0,config.id&0xFF)-- 发送缓冲器0标拓展识符低位
  354. else
  355. mcp2515.write(mcp2515.TXB0SIDH,(config.id>>3)&0xFF)-- 发送缓冲器0标准标识符高位
  356. mcp2515.write(mcp2515.TXB0SIDL,(config.id&0x07)<<5)-- 发送缓冲器0标准标识符低位
  357. end
  358. if select("#",...)>8 then
  359. log.error("mcp2515","send_buffer")
  360. return
  361. end
  362. local delay = 0
  363. while mcp2515.read(mcp2515.TXB0CTRL)&0x08 ~=0 and delay<5 do
  364. sys.wait(10)
  365. delay = delay+1
  366. end
  367. mcp2515.write(mcp2515.TXB0D0,...)--将待发送的数据写入发送缓冲寄存器
  368. if config.rtr then
  369. mcp2515.write(mcp2515.TXB0DLC,select("#",...)|0x40)--将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
  370. else
  371. mcp2515.write(mcp2515.TXB0DLC,select("#",...))--将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
  372. end
  373. mcp2515.write(mcp2515.TXB0CTRL,0x08)--请求发送报文
  374. end
  375. --[[
  376. mcp2515 数据接收
  377. @api mcp2515.receive_buffer()
  378. @return number len 接收数据长度
  379. @return string buff 接收数据
  380. @return table config 接收数据参数 id:报文ID ide:是否为扩展帧 rtr:是否为远程帧
  381. @usage
  382. sys.subscribe("mcp2515", function(len,buff,config)
  383. print("mcp2515", len,buff:byte(1,len))
  384. for k, v in pairs(config) do
  385. print(k,v)
  386. end
  387. end)
  388. ]]
  389. function mcp2515.receive_buffer()
  390. local config = {}
  391. local len
  392. local buff
  393. local temp = mcp2515.read(mcp2515.CANINTF)
  394. if temp & 0x01 ~= 0 then
  395. local sidh=mcp2515.read(mcp2515.RXB0SIDH)
  396. local sidl=mcp2515.read(mcp2515.RXB0SIDL)
  397. if sidl&0x08 ==0 then
  398. config.ide = false
  399. config.id = sidh<<3|sidl>>5
  400. if sidl&0x10 ==0 then
  401. config.rtr = false
  402. else
  403. config.rtr = true
  404. end
  405. else
  406. config.ide = true
  407. local eidh=mcp2515.read(mcp2515.RXB0EID8)
  408. local eidl=mcp2515.read(mcp2515.RXB0EID0)
  409. config.id = sidh<<21|(sidl&0xE0)<<13|(sidl&0x03)<<16|eidh<<8|eidl
  410. end
  411. local dlc=mcp2515.read(mcp2515.RXB0DLC)
  412. if config.ide then
  413. if dlc&0x40 == 0 then
  414. config.rtr = false
  415. else
  416. config.rtr = true
  417. end
  418. end
  419. len = dlc&0x0F
  420. buff = string.char(mcp2515.read(mcp2515.RXB0D0,len))
  421. end
  422. mcp2515.write(mcp2515.CANINTF,0)
  423. return len,buff,config
  424. end
  425. local function mcp2515_int(val)
  426. if val==0 then
  427. local len,buff,config = mcp2515.receive_buffer()
  428. if len then
  429. sys.publish("mcp2515", len,buff,config)
  430. end
  431. end
  432. end
  433. --[[
  434. mcp2515 设置模式
  435. @api mcp2515.mode(mode)
  436. @number mode 模式
  437. @usage
  438. mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
  439. ]]
  440. function mcp2515.mode(mode)
  441. mcp2515.write(mcp2515.CANCTRL,mode|mcp2515.CLKOUT_ENABLED)
  442. local temp = mcp2515.read(mcp2515.CANSTAT)
  443. if mode ~= (temp&0xE0) then
  444. mcp2515.write(mcp2515.CANCTRL,mode|mcp2515.CLKOUT_ENABLED)
  445. end
  446. end
  447. --[[
  448. mcp2515 设置波特率(注意:需在配置模式使用)
  449. @api mcp2515.baud(baud)
  450. @number baud 波特率
  451. @usage
  452. mcp2515.baud(mcp2515.CAN_500Kbps)
  453. ]]
  454. function mcp2515.baud(baud)
  455. mcp2515.write(mcp2515.CNF1,baud)
  456. end
  457. --[[
  458. mcp2515 设置过滤表(注意:需在配置模式使用)
  459. @api mcp2515.filter(id,ide,shield)
  460. @number id id
  461. @bool ide 是否为扩展帧
  462. @bool shield 是否为屏蔽表
  463. @usage
  464. mcp2515.filter(0x1FF,false,false)
  465. ]]
  466. function mcp2515.filter(id,ide,shield)
  467. mcp2515.mode(mcp2515.REQOP_CONFIG)--进入配置模式
  468. if ide then
  469. if shield then
  470. mcp2515.write(mcp2515.RXM0SIDH,(id>>21)&0xFF)--配置验收屏蔽寄存器n标准标识符高位
  471. mcp2515.write(mcp2515.RXM0SIDL,((id>>16)&0x03)|((id>>13)&0xE0))--配置验收屏蔽寄存器n标准标识符低位
  472. mcp2515.write(mcp2515.RXM0EID8,(id>>8)&0xFF)--配置验收屏蔽寄存器n拓展标识符高位
  473. mcp2515.write(mcp2515.RXM0EID0,id&0xFF)--配置验收屏蔽寄存器n拓展标识符低位
  474. else
  475. mcp2515.write(mcp2515.RXF0SIDH,(id>>21)&0xFF)--配置验收滤波寄存器n标准标识符高位
  476. mcp2515.write(mcp2515.RXF0SIDL,((id>>16)&0x03)|0x08|((id>>13)&0xE0))--配置验收滤波寄存器n标准标识符低位(第3位为接收拓展标识符使能位)
  477. mcp2515.write(mcp2515.RXF0EID8,(id>>8)&0xFF)--配置验收滤波寄存器n标准标识符高位
  478. mcp2515.write(mcp2515.RXF0EID0,id&0xFF)--配置验收滤波寄存器n标准标识符低位
  479. end
  480. else
  481. if shield then
  482. mcp2515.write(mcp2515.RXM0SIDH,(id>>3)&0xFF)--配置验收屏蔽寄存器n标准标识符高位
  483. mcp2515.write(mcp2515.RXM0SIDL,(id&0x07)<<5)--配置验收屏蔽寄存器n标准标识符低位
  484. else
  485. mcp2515.write(mcp2515.RXF0SIDH,(id>>3)&0xFF)--配置验收滤波寄存器n标准标识符高位
  486. mcp2515.write(mcp2515.RXF0SIDL,(id&0x07)<<5)--配置验收滤波寄存器n标准标识符低位(第3位为接收拓展标识符使能位)
  487. end
  488. end
  489. mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
  490. end
  491. --[[
  492. mcp2515 初始化
  493. @api mcp2515.init(spi_id,cs,int,baud)
  494. @number spi_id spi端口号
  495. @number cs cs引脚
  496. @number int int引脚
  497. @number baud 波特率
  498. @return bool 初始化结果
  499. @usage
  500. spi_mcp2515 = spi.setup(mcp2515_spi,nil,0,0,8,20*1000*1000,spi.MSB,1,0)
  501. mcp2515.init(mcp2515_spi,mcp2515_cs,mcp2515_int,mcp2515.CAN_500Kbps)
  502. ]]
  503. function mcp2515.init(spi_id,cs,int,baud)
  504. mcp2515.spi = spi_id
  505. mcp2515.cs = gpio.setup(cs, 0, gpio.PULLUP)
  506. mcp2515.cs(1)
  507. gpio.setup(int,mcp2515_int, gpio.PULLUP)
  508. mcp2515.reset()
  509. -- 以下部分根据需求参考手册修改
  510. -- 配置CNF1,CNF2,CNF3,
  511. mcp2515.baud(baud)
  512. mcp2515.write(mcp2515.CNF2,0x80|mcp2515.PHSEG1_3TQ|mcp2515.PRSEG_1TQ)
  513. mcp2515.write(mcp2515.CNF3,mcp2515.PHSEG2_3TQ)
  514. mcp2515.write(mcp2515.RXB0SIDH,0x00)--清空接收缓冲器0的标准标识符高位
  515. mcp2515.write(mcp2515.RXB0SIDL,0x00)--清空接收缓冲器0的标准标识符低位
  516. mcp2515.write(mcp2515.RXB0EID8,0x00)--清空接收缓冲器0的拓展标识符高位
  517. mcp2515.write(mcp2515.RXB0EID0,0x00)--清空接收缓冲器0的拓展标识符低位
  518. mcp2515.write(mcp2515.CANINTF,0x00)--清空CAN中断标志寄存器的所有位(必须由MCU清空)
  519. mcp2515.write(mcp2515.CANINTE,0x01)--配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断
  520. mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
  521. return true
  522. end
  523. return mcp2515