Dozingfiretruck 3 лет назад
Родитель
Сommit
51795479a4
2 измененных файлов с 548 добавлено и 0 удалено
  1. 539 0
      script/libs/mcp2515/mcp2515.lua
  2. 9 0
      script/libs/mcp2515/package.json

+ 539 - 0
script/libs/mcp2515/mcp2515.lua

@@ -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

+ 9 - 0
script/libs/mcp2515/package.json

@@ -0,0 +1,9 @@
+{
+    "type" : "lua", // 可以是lua(纯lua), c(纯c), 或者lua-c(混合)
+    "enterpoint" : "mcp2515.lua",
+    "compatibility" : {
+        "soc" : true,
+        "air" : false
+    },
+    "dependency" : ["spi"] // 需要何种硬件或软件接口
+}