|
|
@@ -0,0 +1,539 @@
|
|
|
+--[[
|
|
|
+@module mcp2515
|
|
|
+@summary mcp2515 CAN协议控制器驱动
|
|
|
+@version 1.0
|
|
|
+@date 2022.07.08
|
|
|
+@author Dozingfiretruck
|
|
|
+@usage
|
|
|
+--注意:因使用了sys.wait()所有api需要在协程中使用
|
|
|
+-- 用法实例
|
|
|
+local mcp2515 = require "mcp2515"
|
|
|
+
|
|
|
+sys.subscribe("mcp2515", function(len,buff,config)
|
|
|
+ print("mcp2515", len,buff:byte(1,len))
|
|
|
+ for k, v in pairs(config) do
|
|
|
+ print(k,v)
|
|
|
+ end
|
|
|
+end)
|
|
|
+
|
|
|
+sys.taskInit(function()
|
|
|
+ local mcp2515_spi= 0
|
|
|
+ local mcp2515_cs= pin.PB04
|
|
|
+ local mcp2515_int= pin.PB01
|
|
|
+ spi_mcp2515 = spi.setup(mcp2515_spi,nil,0,0,8,20*1000*1000,spi.MSB,1,0)
|
|
|
+ mcp2515.init(mcp2515_spi,mcp2515_cs,mcp2515_int,mcp2515.CAN_500Kbps)
|
|
|
+
|
|
|
+ mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,数据帧
|
|
|
+ mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,数据帧
|
|
|
+ mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,远程帧
|
|
|
+ mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,远程帧
|
|
|
+
|
|
|
+ while 1 do
|
|
|
+ sys.wait(1000)
|
|
|
+ end
|
|
|
+end)
|
|
|
+]]
|
|
|
+
|
|
|
+local mcp2515 = {}
|
|
|
+local sys = require "sys"
|
|
|
+
|
|
|
+-- SPI 指令集
|
|
|
+mcp2515.RESET = 0xC0
|
|
|
+mcp2515.READ = 0x03
|
|
|
+mcp2515.RD_RX_BUFF = 0x90
|
|
|
+mcp2515.RD_RXB0SIDH = 0x90
|
|
|
+mcp2515.RD_RXB0D0 = 0x92
|
|
|
+mcp2515.RD_RXB1SIDH = 0x94
|
|
|
+mcp2515.RD_RXB1D0 = 0x96
|
|
|
+mcp2515.WRITE = 0x02
|
|
|
+mcp2515.LOAD_TX = 0X40
|
|
|
+mcp2515.LOAD_TXB0SIDH = 0X40
|
|
|
+mcp2515.LOAD_TXB0D0 = 0X41
|
|
|
+mcp2515.LOAD_TXB1SIDH = 0X42
|
|
|
+mcp2515.LOAD_TXB1D0 = 0X43
|
|
|
+mcp2515.LOAD_TXB2SIDH = 0X44
|
|
|
+mcp2515.LOAD_TXB2D0 = 0X45
|
|
|
+mcp2515.RTS = 0x80
|
|
|
+mcp2515.RTS_TXB0 = 0x81
|
|
|
+mcp2515.RTS_TXB1 = 0x82
|
|
|
+mcp2515.RTS_TXB2 = 0x84
|
|
|
+mcp2515.RD_STATUS = 0xA0
|
|
|
+mcp2515.RX_STATUS = 0xB0
|
|
|
+mcp2515.BIT_MODIFY = 0x05
|
|
|
+-- Configuration Registers
|
|
|
+mcp2515.CANSTAT = 0x0E
|
|
|
+mcp2515.CANCTRL = 0x0F
|
|
|
+mcp2515.BFPCTRL = 0x0C
|
|
|
+mcp2515.TEC = 0x1C
|
|
|
+mcp2515.REC = 0x1D
|
|
|
+mcp2515.CNF3 = 0x28
|
|
|
+mcp2515.CNF2 = 0x29
|
|
|
+mcp2515.CNF1 = 0x2A
|
|
|
+mcp2515.CANINTE = 0x2B
|
|
|
+mcp2515.CANINTF = 0x2C
|
|
|
+mcp2515.EFLG = 0x2D
|
|
|
+mcp2515.TXRTSCTRL = 0x0D
|
|
|
+-- Recieve Filters
|
|
|
+mcp2515.RXF0SIDH = 0x00
|
|
|
+mcp2515.RXF0SIDL = 0x01
|
|
|
+mcp2515.RXF0EID8 = 0x02
|
|
|
+mcp2515.RXF0EID0 = 0x03
|
|
|
+mcp2515.RXF1SIDH = 0x04
|
|
|
+mcp2515.RXF1SIDL = 0x05
|
|
|
+mcp2515.RXF1EID8 = 0x06
|
|
|
+mcp2515.RXF1EID0 = 0x07
|
|
|
+mcp2515.RXF2SIDH = 0x08
|
|
|
+mcp2515.RXF2SIDL = 0x09
|
|
|
+mcp2515.RXF2EID8 = 0x0A
|
|
|
+mcp2515.RXF2EID0 = 0x0B
|
|
|
+mcp2515.RXF3SIDH = 0x10
|
|
|
+mcp2515.RXF3SIDL = 0x11
|
|
|
+mcp2515.RXF3EID8 = 0x12
|
|
|
+mcp2515.RXF3EID0 = 0x13
|
|
|
+mcp2515.RXF4SIDH = 0x14
|
|
|
+mcp2515.RXF4SIDL = 0x15
|
|
|
+mcp2515.RXF4EID8 = 0x16
|
|
|
+mcp2515.RXF4EID0 = 0x17
|
|
|
+mcp2515.RXF5SIDH = 0x18
|
|
|
+mcp2515.RXF5SIDL = 0x19
|
|
|
+mcp2515.RXF5EID8 = 0x1A
|
|
|
+mcp2515.RXF5EID0 = 0x1B
|
|
|
+-- CNF1
|
|
|
+mcp2515.SJW_1TQ = 0x40
|
|
|
+mcp2515.SJW_2TQ = 0x80
|
|
|
+mcp2515.SJW_3TQ = 0x90
|
|
|
+mcp2515.SJW_4TQ = 0xC0
|
|
|
+-- CNF2
|
|
|
+mcp2515.BTLMODE_CNF3 = 0x80
|
|
|
+mcp2515.BTLMODE_PH1_IPT = 0x00
|
|
|
+mcp2515.SMPL_3X = 0x40
|
|
|
+mcp2515.SMPL_1X = 0x00
|
|
|
+mcp2515.PHSEG1_8TQ = 0x38
|
|
|
+mcp2515.PHSEG1_7TQ = 0x30
|
|
|
+mcp2515.PHSEG1_6TQ = 0x28
|
|
|
+mcp2515.PHSEG1_5TQ = 0x20
|
|
|
+mcp2515.PHSEG1_4TQ = 0x18
|
|
|
+mcp2515.PHSEG1_3TQ = 0x10
|
|
|
+mcp2515.PHSEG1_2TQ = 0x08
|
|
|
+mcp2515.PHSEG1_1TQ = 0x00
|
|
|
+mcp2515.PRSEG_8TQ = 0x07
|
|
|
+mcp2515.PRSEG_7TQ = 0x06
|
|
|
+mcp2515.PRSEG_6TQ = 0x05
|
|
|
+mcp2515.PRSEG_5TQ = 0x04
|
|
|
+mcp2515.PRSEG_4TQ = 0x03
|
|
|
+mcp2515.PRSEG_3TQ = 0x02
|
|
|
+mcp2515.PRSEG_2TQ = 0x01
|
|
|
+mcp2515.PRSEG_1TQ = 0x00
|
|
|
+-- CNF3
|
|
|
+mcp2515.PHSEG2_8TQ = 0x07
|
|
|
+mcp2515.PHSEG2_7TQ = 0x06
|
|
|
+mcp2515.PHSEG2_6TQ = 0x05
|
|
|
+mcp2515.PHSEG2_5TQ = 0x04
|
|
|
+mcp2515.PHSEG2_4TQ = 0x03
|
|
|
+mcp2515.PHSEG2_3TQ = 0x02
|
|
|
+mcp2515.PHSEG2_2TQ = 0x01
|
|
|
+mcp2515.PHSEG2_1TQ = 0x00
|
|
|
+mcp2515.SOF_ENABLED = 0x80
|
|
|
+mcp2515.WAKFIL_ENABLED = 0x40
|
|
|
+mcp2515.WAKFIL_DISABLED = 0x00
|
|
|
+mcp2515.CAN_10Kbps = 0x31
|
|
|
+mcp2515.CAN_25Kbps = 0x13
|
|
|
+mcp2515.CAN_50Kbps = 0x09
|
|
|
+mcp2515.CAN_100Kbps = 0x04
|
|
|
+mcp2515.CAN_125Kbps = 0x03
|
|
|
+mcp2515.CAN_250Kbps = 0x01
|
|
|
+mcp2515.CAN_500Kbps = 0x00
|
|
|
+-- CANINTE
|
|
|
+mcp2515.RX0IE_ENABLED = 0x01
|
|
|
+mcp2515.RX0IE_DISABLED = 0x00
|
|
|
+mcp2515.RX1IE_ENABLED = 0x02
|
|
|
+mcp2515.RX1IE_DISABLED = 0x00
|
|
|
+mcp2515.G_RXIE_ENABLED = 0x03
|
|
|
+mcp2515.G_RXIE_DISABLED = 0x00
|
|
|
+mcp2515.TX0IE_ENABLED = 0x04
|
|
|
+mcp2515.TX0IE_DISABLED = 0x00
|
|
|
+mcp2515.TX1IE_ENABLED = 0x08
|
|
|
+mcp2515.TX2IE_DISABLED = 0x00
|
|
|
+mcp2515.TX2IE_ENABLED = 0x10
|
|
|
+mcp2515.TX2IE_DISABLED = 0x00
|
|
|
+mcp2515.G_TXIE_ENABLED = 0x1C
|
|
|
+mcp2515.G_TXIE_DISABLED = 0x00
|
|
|
+mcp2515.ERRIE_ENABLED = 0x20
|
|
|
+mcp2515.ERRIE_DISABLED = 0x00
|
|
|
+mcp2515.WAKIE_ENABLED = 0x40
|
|
|
+mcp2515.WAKIE_DISABLED = 0x00
|
|
|
+mcp2515.IVRE_ENABLED = 0x80
|
|
|
+mcp2515.IVRE_DISABLED = 0x00
|
|
|
+-- CANINTF
|
|
|
+mcp2515.RX0IF_SET = 0x01
|
|
|
+mcp2515.RX0IF_RESET = 0x00
|
|
|
+mcp2515.RX1IF_SET = 0x02
|
|
|
+mcp2515.RX1IF_RESET = 0x00
|
|
|
+mcp2515.TX0IF_SET = 0x04
|
|
|
+mcp2515.TX0IF_RESET = 0x00
|
|
|
+mcp2515.TX1IF_SET = 0x08
|
|
|
+mcp2515.TX2IF_RESET = 0x00
|
|
|
+mcp2515.TX2IF_SET = 0x10
|
|
|
+mcp2515.TX2IF_RESET = 0x00
|
|
|
+mcp2515.ERRIF_SET = 0x20
|
|
|
+mcp2515.ERRIF_RESET = 0x00
|
|
|
+mcp2515.WAKIF_SET = 0x40
|
|
|
+mcp2515.WAKIF_RESET = 0x00
|
|
|
+mcp2515.IVRF_SET = 0x80
|
|
|
+mcp2515.IVRF_RESET = 0x00
|
|
|
+-- CANCTRL
|
|
|
+mcp2515.REQOP_CONFIG = 0x80--配置模式
|
|
|
+mcp2515.REQOP_LISTEN = 0x60--监听模式
|
|
|
+mcp2515.REQOP_LOOPBACK = 0x40--回环模式 测试用
|
|
|
+mcp2515.REQOP_SLEEP = 0x20--睡眠模式
|
|
|
+mcp2515.REQOP_NORMAL = 0x00--正常模式
|
|
|
+mcp2515.ABORT = 0x10
|
|
|
+mcp2515.OSM_ENABLED = 0x08
|
|
|
+mcp2515.CLKOUT_ENABLED = 0x04
|
|
|
+mcp2515.CLKOUT_DISABLED = 0x00
|
|
|
+mcp2515.CLKOUT_PRE_8 = 0x03
|
|
|
+mcp2515.CLKOUT_PRE_4 = 0x02
|
|
|
+mcp2515.CLKOUT_PRE_2 = 0x01
|
|
|
+mcp2515.CLKOUT_PRE_1 = 0x00
|
|
|
+-- RXBnCTRL
|
|
|
+mcp2515.RXM_RCV_ALL = 0x60
|
|
|
+mcp2515.RXM_VALID_EXT = 0x40
|
|
|
+mcp2515.RXM_VALID_STD = 0x20
|
|
|
+mcp2515.RXM_VALID_ALL = 0x00
|
|
|
+mcp2515.RXRTR_REMOTE = 0x08
|
|
|
+mcp2515.RXRTR_NO_REMOTE = 0x00
|
|
|
+mcp2515.BUKT_ROLLOVER = 0x04
|
|
|
+mcp2515.BUKT_NO_ROLLOVER = 0x00
|
|
|
+mcp2515.FILHIT0_FLTR_1 = 0x01
|
|
|
+mcp2515.FILHIT0_FLTR_0 = 0x00
|
|
|
+mcp2515.FILHIT1_FLTR_5 = 0x05
|
|
|
+mcp2515.FILHIT1_FLTR_4 = 0x04
|
|
|
+mcp2515.FILHIT1_FLTR_3 = 0x03
|
|
|
+mcp2515.FILHIT1_FLTR_2 = 0x02
|
|
|
+mcp2515.FILHIT1_FLTR_1 = 0x01
|
|
|
+mcp2515.FILHIT1_FLTR_0 = 0x00
|
|
|
+-- TXBnCTRL
|
|
|
+mcp2515.TXREQ_SET = 0x08
|
|
|
+mcp2515.TXREQ_CLEAR = 0x00
|
|
|
+mcp2515.TXP_HIGHEST = 0x03
|
|
|
+mcp2515.TXP_INTER_HIGH = 0x02
|
|
|
+mcp2515.TXP_INTER_LOW = 0x01
|
|
|
+mcp2515.TXP_LOWEST = 0x00
|
|
|
+
|
|
|
+mcp2515.DLC_0 = 0x00
|
|
|
+mcp2515.DLC_1 = 0x01
|
|
|
+mcp2515.DLC_2 = 0x02
|
|
|
+mcp2515.DLC_3 = 0x03
|
|
|
+mcp2515.DLC_4 = 0x04
|
|
|
+mcp2515.DLC_5 = 0x05
|
|
|
+mcp2515.DLC_6 = 0x06
|
|
|
+mcp2515.DLC_7 = 0x07
|
|
|
+mcp2515.DLC_8 = 0x08
|
|
|
+-- Receive Masks
|
|
|
+mcp2515.RXM0SIDH = 0x20
|
|
|
+mcp2515.RXM0SIDL = 0x21
|
|
|
+mcp2515.RXM0EID8 = 0x22
|
|
|
+mcp2515.RXM0EID0 = 0x23
|
|
|
+mcp2515.RXM1SIDH = 0x24
|
|
|
+mcp2515.RXM1SIDL = 0x25
|
|
|
+mcp2515.RXM1EID8 = 0x26
|
|
|
+mcp2515.RXM1EID0 = 0x27
|
|
|
+-- Tx Buffer 0
|
|
|
+mcp2515.TXB0CTRL = 0x30
|
|
|
+mcp2515.TXB0SIDH = 0x31
|
|
|
+mcp2515.TXB0SIDL = 0x32
|
|
|
+mcp2515.TXB0EID8 = 0x33
|
|
|
+mcp2515.TXB0EID0 = 0x34
|
|
|
+mcp2515.TXB0DLC = 0x35
|
|
|
+mcp2515.TXB0D0 = 0x36
|
|
|
+mcp2515.TXB0D1 = 0x37
|
|
|
+mcp2515.TXB0D2 = 0x38
|
|
|
+mcp2515.TXB0D3 = 0x39
|
|
|
+mcp2515.TXB0D4 = 0x3A
|
|
|
+mcp2515.TXB0D5 = 0x3B
|
|
|
+mcp2515.TXB0D6 = 0x3C
|
|
|
+mcp2515.TXB0D7 = 0x3D
|
|
|
+-- Tx Buffer 1
|
|
|
+mcp2515.TXB1CTRL = 0x40
|
|
|
+mcp2515.TXB1SIDH = 0x41
|
|
|
+mcp2515.TXB1SIDL = 0x42
|
|
|
+mcp2515.TXB1EID8 = 0x43
|
|
|
+mcp2515.TXB1EID0 = 0x44
|
|
|
+mcp2515.TXB1DLC = 0x45
|
|
|
+mcp2515.TXB1D0 = 0x46
|
|
|
+mcp2515.TXB1D1 = 0x47
|
|
|
+mcp2515.TXB1D2 = 0x48
|
|
|
+mcp2515.TXB1D3 = 0x49
|
|
|
+mcp2515.TXB1D4 = 0x4A
|
|
|
+mcp2515.TXB1D5 = 0x4B
|
|
|
+mcp2515.TXB1D6 = 0x4C
|
|
|
+mcp2515.TXB1D7 = 0x4D
|
|
|
+-- Tx Buffer 2
|
|
|
+mcp2515.TXB2CTRL = 0x50
|
|
|
+mcp2515.TXB2SIDH = 0x51
|
|
|
+mcp2515.TXB2SIDL = 0x52
|
|
|
+mcp2515.TXB2EID8 = 0x53
|
|
|
+mcp2515.TXB2EID0 = 0x54
|
|
|
+mcp2515.TXB2DLC = 0x55
|
|
|
+mcp2515.TXB2D0 = 0x56
|
|
|
+mcp2515.TXB2D1 = 0x57
|
|
|
+mcp2515.TXB2D2 = 0x58
|
|
|
+mcp2515.TXB2D3 = 0x59
|
|
|
+mcp2515.TXB2D4 = 0x5A
|
|
|
+mcp2515.TXB2D5 = 0x5B
|
|
|
+mcp2515.TXB2D6 = 0x5C
|
|
|
+mcp2515.TXB2D7 = 0x5D
|
|
|
+-- Rx Buffer 0
|
|
|
+mcp2515.RXB0CTRL = 0x60
|
|
|
+mcp2515.RXB0SIDH = 0x61
|
|
|
+mcp2515.RXB0SIDL = 0x62
|
|
|
+mcp2515.RXB0EID8 = 0x63
|
|
|
+mcp2515.RXB0EID0 = 0x64
|
|
|
+mcp2515.RXB0DLC = 0x65
|
|
|
+mcp2515.RXB0D0 = 0x66
|
|
|
+mcp2515.RXB0D1 = 0x67
|
|
|
+mcp2515.RXB0D2 = 0x68
|
|
|
+mcp2515.RXB0D3 = 0x69
|
|
|
+mcp2515.RXB0D4 = 0x6A
|
|
|
+mcp2515.RXB0D5 = 0x6B
|
|
|
+mcp2515.RXB0D6 = 0x6C
|
|
|
+mcp2515.RXB0D7 = 0x6D
|
|
|
+-- Rx Buffer 1
|
|
|
+mcp2515.RXB1CTRL = 0x70
|
|
|
+mcp2515.RXB1SIDH = 0x71
|
|
|
+mcp2515.RXB1SIDL = 0x72
|
|
|
+mcp2515.RXB1EID8 = 0x73
|
|
|
+mcp2515.RXB1EID0 = 0x74
|
|
|
+mcp2515.RXB1DLC = 0x75
|
|
|
+mcp2515.RXB1D0 = 0x76
|
|
|
+mcp2515.RXB1D1 = 0x77
|
|
|
+mcp2515.RXB1D2 = 0x78
|
|
|
+mcp2515.RXB1D3 = 0x79
|
|
|
+mcp2515.RXB1D4 = 0x7A
|
|
|
+mcp2515.RXB1D5 = 0x7B
|
|
|
+mcp2515.RXB1D6 = 0x7C
|
|
|
+mcp2515.RXB1D7 = 0x7D
|
|
|
+
|
|
|
+
|
|
|
+function mcp2515.write(addr,...)
|
|
|
+ mcp2515.cs(0)
|
|
|
+ spi.send(mcp2515.spi, string.char(mcp2515.WRITE,addr,...))
|
|
|
+ mcp2515.cs(1)
|
|
|
+end
|
|
|
+
|
|
|
+function mcp2515.read(addr,len)
|
|
|
+ mcp2515.cs(0)
|
|
|
+ spi.send(mcp2515.spi, string.char(mcp2515.READ,addr))
|
|
|
+ local val = spi.recv(mcp2515.spi,len or 1)
|
|
|
+ mcp2515.cs(1)
|
|
|
+ if val then
|
|
|
+ return string.byte(val,1,len)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 复位
|
|
|
+@api mcp2515.reset()
|
|
|
+@usage
|
|
|
+mcp2515.reset()
|
|
|
+]]
|
|
|
+function mcp2515.reset()
|
|
|
+ mcp2515.cs(0)
|
|
|
+ spi.send(mcp2515.spi, string.char(mcp2515.RESET))
|
|
|
+ mcp2515.cs(1)
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 数据发送
|
|
|
+@api mcp2515.send_buffer(config,...)
|
|
|
+table config 接收数据参数 id:报文ID ide:是否为扩展帧 rtr:是否为远程帧
|
|
|
+number ... 发送数据
|
|
|
+@usage
|
|
|
+mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,数据帧
|
|
|
+mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = false},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,数据帧
|
|
|
+mcp2515.send_buffer({id = 0x7FF,ide = false,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--标准帧,远程帧
|
|
|
+mcp2515.send_buffer({id = 0x1FFFFFE6,ide = true,rtr = true},0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07)--扩展帧,远程帧
|
|
|
+]]
|
|
|
+function mcp2515.send_buffer(config,...)
|
|
|
+ if config.ide then
|
|
|
+ mcp2515.write(mcp2515.TXB0SIDH,(config.id>>21)&0xFF)-- 发送缓冲器0标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.TXB0SIDL,((config.id>>16)&0x03)|0x08|((config.id>>13)&0xE0))-- 发送缓冲器0标准标识符低位与缓冲器0标拓展识符最高两位(第3位为发送拓展标识符使能位)
|
|
|
+ mcp2515.write(mcp2515.TXB0EID8,(config.id>>8)&0xFF)-- 发送缓冲器0标拓展识符高位
|
|
|
+ mcp2515.write(mcp2515.TXB0EID0,config.id&0xFF)-- 发送缓冲器0标拓展识符低位
|
|
|
+ else
|
|
|
+ mcp2515.write(mcp2515.TXB0SIDH,(config.id>>3)&0xFF)-- 发送缓冲器0标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.TXB0SIDL,(config.id&0x07)<<5)-- 发送缓冲器0标准标识符低位
|
|
|
+ end
|
|
|
+ if select("#",...)>8 then
|
|
|
+ log.error("mcp2515","send_buffer")
|
|
|
+ return
|
|
|
+ end
|
|
|
+ local delay = 0
|
|
|
+ while mcp2515.read(mcp2515.TXB0CTRL)&0x08 ~=0 and delay<5 do
|
|
|
+ sys.wait(10)
|
|
|
+ delay = delay+1
|
|
|
+ end
|
|
|
+ mcp2515.write(mcp2515.TXB0D0,...)--将待发送的数据写入发送缓冲寄存器
|
|
|
+ if config.rtr then
|
|
|
+ mcp2515.write(mcp2515.TXB0DLC,select("#",...)|0x40)--将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
|
|
|
+ else
|
|
|
+ mcp2515.write(mcp2515.TXB0DLC,select("#",...))--将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
|
|
|
+ end
|
|
|
+ mcp2515.write(mcp2515.TXB0CTRL,0x08)--请求发送报文
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 数据接收
|
|
|
+@api mcp2515.receive_buffer()
|
|
|
+@return number len 接收数据长度
|
|
|
+@return string buff 接收数据
|
|
|
+@return table config 接收数据参数 id:报文ID ide:是否为扩展帧 rtr:是否为远程帧
|
|
|
+@usage
|
|
|
+sys.subscribe("mcp2515", function(len,buff,config)
|
|
|
+ print("mcp2515", len,buff:byte(1,len))
|
|
|
+ for k, v in pairs(config) do
|
|
|
+ print(k,v)
|
|
|
+ end
|
|
|
+end)
|
|
|
+]]
|
|
|
+function mcp2515.receive_buffer()
|
|
|
+ local config = {}
|
|
|
+ local len
|
|
|
+ local buff
|
|
|
+ local temp = mcp2515.read(mcp2515.CANINTF)
|
|
|
+ if temp & 0x01 ~= 0 then
|
|
|
+ local sidh=mcp2515.read(mcp2515.RXB0SIDH)
|
|
|
+ local sidl=mcp2515.read(mcp2515.RXB0SIDL)
|
|
|
+ if sidl&0x08 ==0 then
|
|
|
+ config.ide = false
|
|
|
+ config.id = sidh<<3|sidl>>5
|
|
|
+ if sidl&0x10 ==0 then
|
|
|
+ config.rtr = false
|
|
|
+ else
|
|
|
+ config.rtr = true
|
|
|
+ end
|
|
|
+ else
|
|
|
+ config.ide = true
|
|
|
+ local eidh=mcp2515.read(mcp2515.RXB0EID8)
|
|
|
+ local eidl=mcp2515.read(mcp2515.RXB0EID0)
|
|
|
+ config.id = sidh<<21|(sidl&0xE0)<<13|(sidl&0x03)<<16|eidh<<8|eidl
|
|
|
+ end
|
|
|
+ local dlc=mcp2515.read(mcp2515.RXB0DLC)
|
|
|
+ if config.ide then
|
|
|
+ if dlc&0x40 == 0 then
|
|
|
+ config.rtr = false
|
|
|
+ else
|
|
|
+ config.rtr = true
|
|
|
+ end
|
|
|
+ end
|
|
|
+ len = dlc&0x0F
|
|
|
+ buff = string.char(mcp2515.read(mcp2515.RXB0D0,len))
|
|
|
+ end
|
|
|
+ mcp2515.write(mcp2515.CANINTF,0)
|
|
|
+ return len,buff,config
|
|
|
+end
|
|
|
+
|
|
|
+local function mcp2515_int(val)
|
|
|
+ if val==0 then
|
|
|
+ local len,buff,config = mcp2515.receive_buffer()
|
|
|
+ if len then
|
|
|
+ sys.publish("mcp2515", len,buff,config)
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 设置模式
|
|
|
+@api mcp2515.mode(mode)
|
|
|
+@number mode 模式
|
|
|
+@usage
|
|
|
+mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
|
|
|
+]]
|
|
|
+function mcp2515.mode(mode)
|
|
|
+ mcp2515.write(mcp2515.CANCTRL,mode|mcp2515.CLKOUT_ENABLED)
|
|
|
+ local temp = mcp2515.read(mcp2515.CANSTAT)
|
|
|
+ if mode ~= (temp&0xE0) then
|
|
|
+ mcp2515.write(mcp2515.CANCTRL,mode|mcp2515.CLKOUT_ENABLED)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 设置波特率(注意:需在配置模式使用)
|
|
|
+@api mcp2515.baud(baud)
|
|
|
+@number baud 波特率
|
|
|
+@usage
|
|
|
+mcp2515.baud(mcp2515.CAN_500Kbps)
|
|
|
+]]
|
|
|
+function mcp2515.baud(baud)
|
|
|
+ mcp2515.write(mcp2515.CNF1,baud)
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 设置过滤表(注意:需在配置模式使用)
|
|
|
+@api mcp2515.filter(id,ide,shield)
|
|
|
+@number id id
|
|
|
+@bool ide 是否为扩展帧
|
|
|
+@bool shield 是否为屏蔽表
|
|
|
+@usage
|
|
|
+mcp2515.filter(0x1FF,false,false)
|
|
|
+]]
|
|
|
+function mcp2515.filter(id,ide,shield)
|
|
|
+ mcp2515.mode(mcp2515.REQOP_CONFIG)--进入配置模式
|
|
|
+ if ide then
|
|
|
+ if shield then
|
|
|
+ mcp2515.write(mcp2515.RXM0SIDH,(id>>21)&0xFF)--配置验收屏蔽寄存器n标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXM0SIDL,((id>>16)&0x03)|((id>>13)&0xE0))--配置验收屏蔽寄存器n标准标识符低位
|
|
|
+ mcp2515.write(mcp2515.RXM0EID8,(id>>8)&0xFF)--配置验收屏蔽寄存器n拓展标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXM0EID0,id&0xFF)--配置验收屏蔽寄存器n拓展标识符低位
|
|
|
+ else
|
|
|
+ mcp2515.write(mcp2515.RXF0SIDH,(id>>21)&0xFF)--配置验收滤波寄存器n标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXF0SIDL,((id>>16)&0x03)|0x08|((id>>13)&0xE0))--配置验收滤波寄存器n标准标识符低位(第3位为接收拓展标识符使能位)
|
|
|
+ mcp2515.write(mcp2515.RXF0EID8,(id>>8)&0xFF)--配置验收滤波寄存器n标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXF0EID0,id&0xFF)--配置验收滤波寄存器n标准标识符低位
|
|
|
+ end
|
|
|
+ else
|
|
|
+ if shield then
|
|
|
+ mcp2515.write(mcp2515.RXM0SIDH,(id>>3)&0xFF)--配置验收屏蔽寄存器n标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXM0SIDL,(id&0x07)<<5)--配置验收屏蔽寄存器n标准标识符低位
|
|
|
+ else
|
|
|
+ mcp2515.write(mcp2515.RXF0SIDH,(id>>3)&0xFF)--配置验收滤波寄存器n标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXF0SIDL,(id&0x07)<<5)--配置验收滤波寄存器n标准标识符低位(第3位为接收拓展标识符使能位)
|
|
|
+ end
|
|
|
+ end
|
|
|
+ mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+mcp2515 初始化
|
|
|
+@api mcp2515.init(spi_id,cs,int,baud)
|
|
|
+@number spi_id spi端口号
|
|
|
+@number cs cs引脚
|
|
|
+@number int int引脚
|
|
|
+@number baud 波特率
|
|
|
+@return bool 初始化结果
|
|
|
+@usage
|
|
|
+spi_mcp2515 = spi.setup(mcp2515_spi,nil,0,0,8,20*1000*1000,spi.MSB,1,0)
|
|
|
+mcp2515.init(mcp2515_spi,mcp2515_cs,mcp2515_int,mcp2515.CAN_500Kbps)
|
|
|
+]]
|
|
|
+function mcp2515.init(spi_id,cs,int,baud)
|
|
|
+ mcp2515.spi = spi_id
|
|
|
+ mcp2515.cs = gpio.setup(cs, 0, gpio.PULLUP)
|
|
|
+ mcp2515.cs(1)
|
|
|
+ gpio.setup(int,mcp2515_int, gpio.PULLUP)
|
|
|
+ mcp2515.reset()
|
|
|
+ -- 以下部分根据需求参考手册修改
|
|
|
+ -- 配置CNF1,CNF2,CNF3,
|
|
|
+ mcp2515.baud(baud)
|
|
|
+ mcp2515.write(mcp2515.CNF2,0x80|mcp2515.PHSEG1_3TQ|mcp2515.PRSEG_1TQ)
|
|
|
+ mcp2515.write(mcp2515.CNF3,mcp2515.PHSEG2_3TQ)
|
|
|
+ mcp2515.write(mcp2515.RXB0SIDH,0x00)--清空接收缓冲器0的标准标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXB0SIDL,0x00)--清空接收缓冲器0的标准标识符低位
|
|
|
+ mcp2515.write(mcp2515.RXB0EID8,0x00)--清空接收缓冲器0的拓展标识符高位
|
|
|
+ mcp2515.write(mcp2515.RXB0EID0,0x00)--清空接收缓冲器0的拓展标识符低位
|
|
|
+ mcp2515.write(mcp2515.CANINTF,0x00)--清空CAN中断标志寄存器的所有位(必须由MCU清空)
|
|
|
+ mcp2515.write(mcp2515.CANINTE,0x01)--配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断
|
|
|
+ mcp2515.mode(mcp2515.REQOP_NORMAL)--进入正常模式
|
|
|
+ return true
|
|
|
+end
|
|
|
+
|
|
|
+return mcp2515
|