| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543 |
- --[[
- @module mcp2515
- @summary mcp2515 CAN协议控制器驱动
- @version 1.0
- @date 2022.07.08
- @author Dozingfiretruck
- @usage
- --注意:因使用了sys.wait()所有api需要在协程中使用
- -- 用法实例
- local mcp2515 = require "mcp2515"
- -- mcp2515 mcu
- -- csk spi_sck
- -- si spi_mosi
- -- so spi_miso
- -- cs spi_cs
- -- int gpio
- 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,10*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)--扩展帧,远程帧
- 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 ... 发送数据 数据个数不可大于8
- @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
|