| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016 |
- --- 模块功能:SPI接口的CAN控制器
- --- 默认启用SPI1,pin8,10,11,12,17,18
- -- @author openLuat
- -- @module spi.testSpiFlash
- -- @license
- -- @copyright
- -- @release 2019.02.27
- module(..., package.seeall)
- require "utils"
- require "pins"
- -- listbase = require "ring"
- -- local rf = require "receive"
- -- rf.list = "test"
- -- list = listbase:new()
- --[[
- 注意:此demo测试过程中,硬件上使用的是标准的SPI_1引脚
- 硬件连线图如下:
- Air模块--CAN模块
- GND--GND
- SPI_CS--CS
- SPI_CLK--CLK
- SPI_DO--DI
- SPI_DI--DO
- VDDIO--VCC
- ]]
- local SPIRESET = 0xC0
- local SPIREAD = 0x03
- local SPIREADRX = 0x90
- local SPIWRITE = 0x02
- local SPIWRITETX = 0x40
- local SPIRTS = 0x80
- local SPIREADSTATUS = 0xA0
- local SPIRXSTATUS = 0xB0
- local SPIBITMODIFY = 0x05
- --[[
- * @brief Adressen der Register des MCP2515
- *
- * Die Redundanten Adressen von z.B. dem Register CANSTAT ( 0x0E, 0x1E, 0x2E, ... ) wurden
- * dabei nicht mit aufgelistet.
- ]]
- local RXF0SIDH = 0x00
- local RXF1SIDH = 0x04
- local RXF2SIDH = 0x08
- local BFPCTRL = 0x0C
- local TXRTSCTRL = 0x0D
- local CANSTAT = 0x0E
- local CANCTRL = 0x0F
- local RXF3SIDH = 0x10
- local RXF4SIDH = 0x14
- local RXF5SIDH = 0x18
- local TEC = 0x1C
- local REC = 0x1D
- local RXM0SIDH = 0x20
- local RXM1SIDH = 0x24
- local CNF3 = 0x28
- local CNF2 = 0x29
- local CNF1 = 0x2A
- local CANINTE = 0x2B
- local CANINTF = 0x2C
- local EFLG = 0x2D
- local TXB0CTRL = 0x30
- local TXB1CTRL = 0x40
- local TXB2CTRL = 0x50
- local RXB0CTRL = 0x60
- local RXB1CTRL = 0x70
- --[[
- * @brief Bitdefinition von CNF2
- ]]
- local BTLMODE = 7
- local SAM = 6
- local PHSEG12 = 5
- local PHSEG11 = 4
- local PHSEG10 = 3
- local PHSEG2 = 2
- local PHSEG1 = 1
- local PHSEG0 = 0
- --[[
- * @brief Bitdefinition von CNF1
- ]]
- local SJW1 = 7
- local SJW0 = 6
- local BRP5 = 5
- local BRP4 = 4
- local BRP3 = 3
- local BRP2 = 2
- local BRP1 = 1
- local BRP0 = 0
- --[[
- * @brief Bitdefinition von CANINTE
- ]]
- local MERRE = 7
- local WAKIE = 6
- local ERRIE = 5
- local TX2IE = 4
- local TX1IE = 3
- local TX0IE = 2
- local RX1IE = 1
- local RX0IE = 0
- --[[
- * @brief Bitdefinition von CANINTF
- ]]
- local MERRF = 7
- local WAKIF = 6
- local ERRIF = 5
- local TX2IF = 4
- local TX1IF = 3
- local TX0IF = 2
- local RX1IF = 1
- local RX0IF = 0
- --[[
- * @brief Bitdefinition von EFLG
- ]]
- local RX1OVR = 7
- local RX0OVR = 6
- local TXB0 = 5
- local TXEP = 4
- local RXEP = 3
- local TXWAR = 2
- local RXWAR = 1
- local EWARN = 0
- --[[
- * @brief Bitdefinition von TXBnCTRL ( n = 0, 1, 2 )
- ]]
- local ABTF = 6
- local MLOA = 5
- local TXERR = 4
- local TXREQ = 3
- local TXP1 = 1
- local TXP0 = 0
- --[[
- * @brief Bitdefinition von RXB0CTRL
- ]]
- local RXM1 = 6
- local RXM0 = 5
- local RXRTR = 3
- local BUKT = 2
- local BUKT1 = 1
- local FILHIT0 = 0
- --[[
- * @brief Bitdefinition von TXBnSIDL ( n = 0, 1 )
- ]]
- local EXIDE = 3
- --[[
- * @brief Bitdefinition von RXB1CTRL
- *
- * @see RXM1, RXM0, RXRTR und FILHIT0 sind schon für RXB0CTRL definiert
- ]]
- local FILHIT2 = 2
- local FILHIT1 = 1
- --[[
- * @brief Bitdefinition von RXBnSIDL ( n = 0, 1 )
- ]]
- local SRR = 4
- local IDE = 3
- --[[
- * @brief Bitdefinition von RXBnDLC ( n = 0, 1 )
- *
- * @see TXBnDLC ( gleiche Bits )
- ]]
- local RTR = 6
- local DLC3 = 3
- local DLC2 = 2
- local DLC1 = 1
- local DLC0 = 0
- local CANRTR = 0x80
- local CANEID = 0x40
- local READ_LENGTH = 14
- --- Begin mt
- local MCPSIDH = 0
- local MCPSIDL = 1
- local MCPEID8 = 2
- local MCPEID0 = 3
- local PRSEG1TQ = 0
- local PHSEG13TQ = 16
- local PHSEG23TQ = 2
- local setGpio10Fnc = pins.setup(pio.P0_10,0)
- local function csLow()
- --拉低CS开始传输数据
- -- pio.pin.setval(0, 10)
- setGpio10Fnc(0)
- end
- local function csHigh()
- --传输结束拉高CS
- -- pio.pin.setval(1, 10)
- setGpio10Fnc(1)
- end
- local function rxTxLedInit()
- -- -- 接受指示灯
- -- -- pio.pin.close(19)
- -- -- pio.pin.setdir(pio.OUTPUT, 19)
- -- -- pio.pin.setval(0, 19) --初始状态灯灭
- -- -- -- 发送指示灯
- -- pio.pin.close(18)
- -- pio.pin.setdir(pio.OUTPUT, 18)
- -- pio.pin.setval(0, 18) --初始状态灯灭
- end
- -- 接受灯闪烁
- function rxLedFlash()
- -- pio.pin.setval(1, 19)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 19)
- end
- -- 发送灯闪烁
- function txLedFlash()
- -- pio.pin.setval(1, 18)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 18)
- end
- -- 接受灯闪烁二次
- function rxLedFlash2Times()
- -- pio.pin.setval(1, 19)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 19)
- -- sys.wait(100)
- -- pio.pin.setval(1, 19)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 19)
- end
- -- 发送灯闪烁二次
- function txLedFlash2Times()
- -- pio.pin.setval(1, 18)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 18)
- -- sys.wait(100)
- -- pio.pin.setval(1, 18)
- -- sys.wait(100) --不能用在定时器函数中.
- -- pio.pin.setval(0, 18)
- end
- --[[
- * Bit Timings
- *
- * Fosc = 8MHz 8M
- * BRP = 3 ( teilen durch 8 )
- * TQ = 2 * (BRP + 1) / Fosc ( => 1 µS )
- *
- * Sync Seg = 1TQ
- * Prop Seg = ( PRSEG + 1 ) * TQ = 1 TQ
- * Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 3 TQ
- * Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 3 TQ
- *
- * Bus speed = 1 / (Total # of TQ) * TQ
- * = 1 / 8 * TQ = 125 kHz
- ]]
- --位运算tmd麻烦
- function canid2reg(canid, extdEanble)
- -- local canid = "1C1F1714"
- -- local data2, data3
- -- local nextpos, data = pack.unpack(canid:fromHex(), ">I")
- if extdEanble then
- local dataHigh11bit = bit.band(canid, 0x1ffc0000)
- dataHigh11bit = bit.lshift(dataHigh11bit, 3)
- local dataLow18bit = bit.band(canid, 0x3ffff)
- dataLow18bit = bit.set(dataLow18bit, 19) --使能扩展位.
- -- log.info("bit.rshift(dataHigh18bit, 11)", dataLow18bit, dataHigh11bit)
- local reg = dataHigh11bit + dataLow18bit
- local b1, b2, b3, b4
- b1 = bit.band(reg, 0xff)
- b2 = bit.band(bit.rshift(reg, 8), 0xff)
- b3 = bit.band(bit.rshift(reg, 16), 0xff)
- b4 = bit.band(bit.rshift(reg, 24), 0xff)
- -- log.info("can filter reg is", reg, b4, b3, b2, b1)
- return b1, b2, b3, b4
- else
- local reg = bit.lshift(canid, 5)
- local b1, b2
- b1 = bit.band(reg, 0xff)
- b2 = bit.band(bit.rshift(reg, 8), 0xff)
- -- log.info("can filter reg is", reg, b2, b1)
- return b1, b2
- end
- end
- function reg2canid(reg, extdEanble)
- if extdEanble then
- local dataHigh11bit = bit.band(reg, 0xffe00000)
- dataHigh11bit = bit.rshift(dataHigh11bit, 3)
- local dataLow18bit = bit.band(reg, 0x0003ffff)
- local canid = dataLow18bit + dataHigh11bit
- return canid
- else
- local dataHigh11bit = bit.band(reg, 0xffe00000)
- canid = bit.band(bit.rshift(dataHigh11bit, 21), 0x7ff)
- return canid
- end
- end
- function canidMask2reg(canidMask, extdEanble)
- -- local canid = "1C1F1714"
- -- local data2, data3
- -- local nextpos, data = pack.unpack(canid:fromHex(), ">I")
- if extdEanble then
- local dataLow11bit = bit.band(canidMask, 0x1ffc0000)
- dataLow11bit = bit.lshift(dataLow11bit, 3)
- local dataHigh18bit = bit.band(canidMask, 0x3ffff)
- dataHigh18bit = bit.set(dataHigh18bit, 19) --使能扩展位.
- -- log.info("bit.rshift(dataHigh18bit, 11)", dataHigh18bit, dataLow11bit)
- local reg = dataLow11bit + dataHigh18bit
- local b1, b2, b3, b4
- b1 = bit.band(reg, 0xff)
- b2 = bit.band(bit.rshift(reg, 8), 0xff)
- b3 = bit.band(bit.rshift(reg, 16), 0xff)
- b4 = bit.band(bit.rshift(reg, 24), 0xff)
- -- log.info("can filter reg is", reg, b4, b3, b2, b1)
- return b1, b2, b3, b4
- else
- local reg = bit.lshift(canidMask, 5)
- local b1, b2
- b1 = bit.band(reg, 0xff)
- b2 = bit.band(bit.rshift(reg, 8), 0xff)
- -- log.info("can filter reg is", reg, b2, b1)
- return b1, b2
- end
- end
- local function spiInit()
- --打开SPI引脚的供电
- --pmd.ldoset(6,pmd.LDO_VMMC) --3.0v
- -- pmd.ldoset(6, pmd.LDO_VMMC) --3.0v
- -- pmd.ldoset(6, pmd.LDO_VLCD) --3.0v
- --SPI 初始化
- -- local result = spi.setup(spi.SPI_1,0,0,8,812500,1,1)
- local result = spi.setup(spi.SPI_1,0,0,8,1625000,1,1)
- -- local result = spi.setup(spi.SPI_1, 0, 0, 8, 13000000, 1)
- --local result = spi.setup(spi.SPI_1,1,1,8,110000,1)
- log.info("testSpiMCP2515.init", result)
- if result == 1 then
- sys.publish("SPI_INIT_OK")
- end
- --重新配置GPIO10 (CS脚) 配为输出,默认高电平
- pio.pin.close(10)
- pio.pin.setdir(pio.OUTPUT, 10)
- pio.pin.setval(1, 10)
- --pio.pin.close(pio.P0_17)
- --pio.pin.setdir(pio.INPUT,pio.P0_17)
- --pins.setup(pio.P0_17,nil,pio.PULLUP)
- -- 芯片重启
- -- pio.pin.close(26) --724版本无此引脚
- -- pio.pin.setdir(pio.OUTPUT, 26)
- -- pio.pin.setval(0, 26) --反向输出,0--高电平
- -- 芯片重启
- -- pio.pin.close(25)
- -- pio.pin.setdir(pio.INPUT, 25)
- -- pio.pin.setval(0, 26) --反向输出,0--高电平
- end
- local function refreshTable(frame)
- local candata, canid
- local B0, B1, B2, B3, B4, B5, B6, B7
- local B0B1, B2B3, B4B5, B6B7
- canid = frame:sub(1, 4)
- candata = frame:sub(-8)
- -- local nextpos, canid = pack.unpack(canid, ">I") --转化为寄存器数字,还不是canid
- -- local table = _G.canTable
- -- table[canid] = candata
- --[[ for k, v in pairs(table) do
- log.info("table data list is", k, v)
- end ]]
- -- canid = testSpiFlash.reg2canid(canid, extdCanEnbale)
- print(candata:toHex())
- end
- function mcp2515_readXXStatus_helper(cmd)
- local status = nil
- csLow()
- spi.send_recv(spi.SPI_1, string.char(cmd))
- local status = spi.recv(spi.SPI_1, 1)
- --status = spi.send_recv(spi.SPI_1,string.char(cmd))
- csHigh()
- -- return string.byte(status)
- return status
- end
- local function mcp2515_write_register(adress, data)
- csLow()
- spi.send_recv(spi.SPI_1, string.char(SPIWRITE, adress, data))
- --spi.send(spi.SPI_1,string.char(SPIWRITE))
- --spi.send(spi.SPI_1,string.char(adress))
- --spi.send(spi.SPI_1,string.char(data))
- log.info("write reg addr and data", adress, data)
- csHigh()
- end
- -- E0 EB 17 14 08 00 00 00 00 00 00 00 12 0E
- -- E0 EB 17 14 08 00 00 00 00 00 00 00 12 0C
- -- 1110 0000 1110 1011 0001 0111 0001 0100
- local dataIsReceived = false
- local function gpio17IntFnc(msg)
- --[[ local dataNMadress = 0x06 --从0x66开始读取can数据
- local dataNMadress2 = 0x00 ]]
- local dataNMadress = 0x04 --从0x71地址开始读取can数据
- local dataNMadress2 = 0x00
- local canData, canID, canFrame
- -- log.info("---------------------------testGpioSingle.gpio4IntFnc------------------------------", msg, getGpio17Fnc())
- --上升沿中断
- -- log.info("testGpioSingle.gpio4IntFnc", msg, getGpio17Fnc())
-
- if msg == cpu.INT_GPIO_POSEDGE then
- --[[ data = mcp2515_read_rx_buffer(dataNMadress2)
- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
- mcp2515_bit_modify(CANINTF, 0x02, 0x00)
- log.info("上升沿", data:toHex(),data:len()) ]]
- elseif msg == cpu.INT_GPIO_NEGEDGE then
- --根据滤波器匹配去判断,更快
- --[[ canID = mcp2515_readXXStatus_helper(SPIRXSTATUS)
- log.info("下降沿 滤波器选中", canID)
- -- data = mcp2515_read_register(dataNMadress)
- -- 自动清零的读数据
- canData = mcp2515_read_rx_buffer(dataNMadress, 8)
- canFrame = canID .. canData ]]
- -- canFrame = mcp2515_read_rx_buffer(dataNMadress, 8 + 5) --读取地址标识和数据.0x71~0x7d
- -- log.info("fall edge", canFrame:toHex())
- dataIsReceived = true
- -- log.info("list is:", type(list),list.first)
- -- list:pushlast(canFrame)
- -- sys.publish("ListReadPeriodIsReady", list)
- -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
- -- mcp2515_bit_modify(CANINTF, 0x02, 0x00)
- -- log.info("下降沿 读取数据", canFrame:toHex())
- csLow()
- spi.send(spi.SPI_1, string.char(0x03,0x61))
- data = spi.recv(spi.SPI_1, 4)
- print("yyyy:"..data:toHex())
- csHigh()
-
- csLow()
- spi.send(spi.SPI_1, string.char(0x03,0x65))
- data = spi.recv(spi.SPI_1, 1)
- print("lenth:"..data:toHex())
- csHigh()
- csLow()
- spi.send(spi.SPI_1, string.char(0x03,0x66))
- data = spi.recv(spi.SPI_1, data:toHex())
- print("ttt:"..data:toHex())
- -- log.info("队列长度", list:length())
- -- refreshTable(canFrame)
- csHigh()
- end
- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
- mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
- mcp2515_write_register(CANINTE, 0)
- mcp2515_write_register(CANINTE, 3)
-
- end
- --GPIO4配置为中断,可通过getGpio4Fnc()获取输入电平,产生中断时,自动执行gpio4IntFnc函数
- pio.pin.setdebounce(5)
- -- getGpio17Fnc = pins.setup(24, gpio17IntFnc)
- getGpio17Fnc = pins.setup(18, gpio17IntFnc, pio.PULLUP) --tannew 1 -- zhu19 -tanori 26
- -- getGpio17Fnc = pins.setup(pio.P0_24,gpio17IntFnc)
- -- pio.pin.setdebounce(0) --关闭延时消抖功能
- --GPIO4配置为输入模式,可通过getGpio4Fnc()获取输入电平,执行gpio4IntFnc函数获取当前电平
- -- getGpio17Fnc = pins.setup(24)
- --[[ local function csLow()
- --拉低CS开始传输数据
- pio.pin.setval(0, pio.P0_10)
- end
- local function csHigh()
- --传输结束拉高CS
- pio.pin.setval(1, pio.P0_10)
- end ]]
- -- 从指定地址起始的寄存器读取数据。
- local function mcp2515_read_register(adress)
- local data = nil
- csLow()
- spi.send_recv(spi.SPI_1, string.char(SPIREAD, adress))
- --spi.send(spi.SPI_1,string.char(adress))
- data = spi.send_recv(spi.SPI_1, string.char(0x00))
- -- data = spi.recv(spi.SPI_1, 1)
- --data = spi.send_recv(spi.SPI_1,string.char(SPIREAD,adress))
- csHigh()
- return string.byte(data)
- end
- -- 读RX 缓冲
- -- 读取接收缓冲器时,在“n,m”所指示的四个地址中的一个放置地
- -- 址指针可以减轻一般读命令的开销。注:在拉升CS 引脚为高电平
- -- 后,相关的RX 标志位(CANINTF.RXnIF)将被清零。
- function mcp2515_read_rx_buffer(adress, length)
- -- local dummyData = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
- local data
- local tmpadr
- csLow()
- tmpadr = (SPIREADRX + adress)
- --data = spi.send_recv(spi.SPI_1,string.char(tmpadr))
- spi.send_recv(spi.SPI_1, string.char(tmpadr))
- -- data = spi.send_recv(spi.SPI_1, string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
- data = spi.recv(spi.SPI_1, length)
- csHigh()
- -- return string.byte(data)
- return data
- end
- function mcp2515_bit_modify(adress, mask, data)
- csLow()
- -- spi.send(spi.SPI_1, string.char(SPIBITMODIFY, adress, mask, data))
- spi.send_recv(spi.SPI_1, string.char(SPIBITMODIFY, adress, mask, data))
- --spi.send(spi.SPI_1,string.char(SPIBITMODIFY))
- --spi.send(spi.SPI_1,string.char(adress))
- --spi.send(spi.SPI_1,string.char(mask))
- --spi.send(spi.SPI_1,string.char(data))
- csHigh()
- end
- -- RX 状态指令
- -- 2 1 0 滤波器匹配
- -- 0 0 0 RXF0
- -- 0 0 1 RXF1
- -- 0 1 0 RXF2
- -- 0 1 1 RXF3
- -- 1 0 0 RXF4
- -- 1 0 1 RXF5
- -- 1 1 0 RXF0 (滚存到RXB1)
- -- 1 1 1 RXF1 (滚存到RXB1)
- function mcp2515_init(canid1, canid2, canid3, canid4, canidMask, extdEanble)
- -- function mcp2515_init()
- local tempcnf1
- local tempcnf2
- local tempcnf3
- spiInit()
- rxTxLedInit() --初始化接受发送led指示灯.
- csLow()
- local ret = spi.send_recv(spi.SPI_1, string.char(SPIRESET))
- log.info("<-- Mcp2515 is rt: ", ret,ret:toHex() )
- csHigh()
- mcp2515_bit_modify(CANCTRL, 0xE0, 128)
- --ret = mcp2515_read_register(CANCTRL)
- --log.info("<-- CANCTRL is : ",ret)
- --mcp2515_write_register(CNF1,0x09) --// 50k BRP=09,
- --mcp2515_write_register(CNF1,0x03) --125k
- mcp2515_write_register(CNF1, 0x01) --250k
- mcp2515_write_register(CNF2, (0x80 + PHSEG13TQ + PRSEG1TQ))
- mcp2515_write_register(CNF3, PHSEG23TQ)
- mcp2515_bit_modify(TXB0CTRL, 0x0B, 0x03)
- mcp2515_bit_modify(TXB1CTRL, 0x0B, 0x02)
- mcp2515_bit_modify(TXB2CTRL, 0x0B, 0x01)
- if extdEanble then
- mcp2515_bit_modify(RXB0CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有标准标识符的有效报文,用以关闭该通道
- mcp2515_bit_modify(RXB1CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有扩展标识符的有效报文
- else
- mcp2515_bit_modify(RXB0CTRL, 0x60, 0x40) --只接收符合滤波器条件的带有扩展标识符的有效报文,用以关闭该通道
- mcp2515_bit_modify(RXB1CTRL, 0x60, 0x20) --只接收符合滤波器条件的带有标准标识符的有效报文
- end
- --mcp2515_Filter_ID(const unsigned char addr, unsigned char ext, unsigned int can_id)
- -- /* Filter Buffer 0 */
- csLow()
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF0SIDH, 0xff, 0xff))
- --关闭该缓存
- csHigh()
- csLow()
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF1SIDH, 0xff, 0xff))
- csHigh()
- -- /* Filter Buffer 1 */
- if extdEanble then --扩展帧.
- csLow()
- log.info("received canid data is", canid1, canid2, canid3, canid4, canidMask, extdEanble)
- local b1, b2, b3, b4 = canid2reg(canid1, extdEanble)
- -- local b1, b2, b3, b4 = canid2reg(canid1, true)
- log.info("extend canid is", b4, b3, b2, b1)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF2SIDH, b4, b3, b2, b1))
- csHigh()
- csLow()
- local b1, b2, b3, b4 = canid2reg(canid2, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF3SIDH, b4, b3, b2, b1))
- csHigh()
- csLow()
- local b1, b2, b3, b4 = canid2reg(canid3, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF4SIDH, b4, b3, b2, b1))
- csHigh()
- csLow()
- local b1, b2, b3, b4 = canid2reg(canid4, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF5SIDH, b4, b3, b2, b1))
- csHigh()
- -- /* Maske Buffer 0 */
- csLow()
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM0SIDH, 0xff, 0xff, 0xff, 0xff)) --不屏蔽.
- csHigh()
- -- /* Maske Buffer 1 */
- csLow()
- local b1, b2, b3, b4 = canidMask2reg(canidMask, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM1SIDH, b4, b3, b2, b1))
- csHigh()
- else --标准帧.
- csLow()
- log.info("received canid data is", canid1, canid2, canid3, canid4, canidMask, extdEanble)
- local b1, b2 = canid2reg(canid1, extdEanble)
- log.info("extend canid is", b2, b1)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF2SIDH, b2, b1))
- csHigh()
- csLow()
- local b1, b2 = canid2reg(canid2, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF3SIDH, b2, b1))
- csHigh()
- csLow()
- local b1, b2 = canid2reg(canid3, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF4SIDH, b2, b1))
- csHigh()
- csLow()
- local b1, b2 = canid2reg(canid4, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF5SIDH, b2, b1))
- csHigh()
- -- /* Maske Buffer 0 */
- csLow()
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM0SIDH, 0xff, 0xff)) --不屏蔽.
- csHigh()
- -- /* Maske Buffer 1 */
- csLow()
- local b1, b2 = canidMask2reg(canidMask, extdEanble)
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM1SIDH, b2, b1))
- csHigh()
- end
- -- /* Pins RXnBF Pins ( High Impedance State ) */
- mcp2515_write_register(BFPCTRL, 0)
- -- /* TXnRTS Bits als Inputs */
- mcp2515_write_register(TXRTSCTRL, 0)
- tempcnf1 = mcp2515_read_register(CNF1)
- tempcnf2 = mcp2515_read_register(CNF2)
- tempcnf3 = mcp2515_read_register(CNF3)
- log.info("<-- CNF -->\r\n", tempcnf1, tempcnf2, tempcnf3)
- mcp2515_bit_modify(CANCTRL, 0xE0, 0)
- mcp2515_write_register(CANINTE, 0)
- mcp2515_write_register(CANINTE, 3)
- end
- -- canid = 0x012
- -- canbuf = {}
- -- canbuf[1] = 1
- -- canbuf[2] = 2
- -- canbuf[3] = 3
- -- canbuf[4] = 4
- -- canbuf[5] = 5
- -- canbuf[6] = 6
- -- canbuf[7] = 7
- -- canbuf[8] = 8
- local flagsRTR = 0
- local TxBnum = 3
- local ctrlval = 0
- local temp0 = 0
- local temp1 = 0
- local temp2 = 0
- local temp3 = 0
- local length = 8
- local rttmpval = 0
- function Period_CAN_Send(canid, canbuf)
- TxBnum = 3
- for i = 1, 3 do
- ctrlval = mcp2515_read_register(TXB0CTRL + 0x10 * (i - 1))
- -- log.info("<-- ctrlval val. -->\r\n", ctrlval)
- --if((ctrlval&0x08) == 0) then
- if (((ctrlval % 16) / 8) == 0) then
- TxBnum = (i - 1)
- -- log.info("<-- CANTX NUM. -->\r\n", TxBnum)
- break
- end
- end
- if (TxBnum < 3) then
- ctrlval = TXB0CTRL + 0x10 * TxBnum + 1
- else
- ctrlval = TXB0CTRL + 1
- end
- if (canid > 0x7ff) then --扩展帧.
- temp3, temp2, temp1, temp0 = canid2reg(canid, true)
- else
- --temp[0] = (unsigned char) (id>>3)
- --temp[1] = (unsigned char) (id<<5)
- temp0 = (canid / 8) % 256
- temp1 = (canid * 32) % 256
- temp2 = 0
- temp3 = 0
- end
- --mcp2515_write_register_p(ctrlval, temp, 4)
- csLow()
- local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, ctrlval, temp0, temp1, temp2, temp3))
- csHigh()
- if (flagsRTR > 0) then
- mcp2515_write_register((ctrlval + 4), (length + 64))
- else
- mcp2515_write_register((ctrlval + 4), length)
- end
- --mcp2515_write_register_p(ctrlval+5, data, length)
- csLow()
- local retnum =
- spi.send_recv(
- spi.SPI_1,
- string.char(
- SPIWRITE,
- (ctrlval + 5),
- canbuf[1],
- canbuf[2],
- canbuf[3],
- canbuf[4],
- canbuf[5],
- canbuf[6],
- canbuf[7],
- canbuf[8]
- )
- )
- csHigh()
- txLedFlash()
- mcp2515_bit_modify(ctrlval - 1, 0x08, 0x08)
- --[[
- rttmpval = mcp2515_read_register(ctrlval-1)
- while(((rttmpval%16)/8) == 1) do
- rttmpval = mcp2515_read_register(ctrlval-1)
- log.info("<-- WAIT TX COMPLETE. -->", rttmpval)
- local txstatus = mcp2515_read_register(ctrlval-1)
- log.info("<-- TXBCTRL STATUS. -->", txstatus)
- end
- --]]
- end
- local function loop()
- --mcp2515_init()
- Period_CAN_Send()
- --spi.close(spi.SPI_1)
- end
- --[[ sys.taskInit(function()
- mcp2515_init()
- while true do
- Period_CAN_Send()
- log.info("enter the can code")
- sys.wait(1000)
- end
- end
- ) ]]
- -- mcp2515_init()
- -- mcp2515_init(0x18f101d0,0x18f101d0,0x18f101d0,0x18f101d0,true)
- -- sys.timerLoopStart(loop, 10000)
- --[[ function transList()
- sys.publish("ListReadPeriodIsReady", list)
- end ]]
- function sampleCan()
- local dataNMadress = 0x04 --从0x71地址开始读取can数据
- local dataNMadress2 = 0x00
- local canData, canID, canFrame
- local level = getGpio17Fnc()
- if (level == 0) then --int 引脚是电平
- --根据滤波器匹配去判断,更快
- --[[ canID = mcp2515_readXXStatus_helper(SPIRXSTATUS)
- log.info("read can ID is", canID:toHex()) ]]
- -- data = mcp2515_read_register(dataNMadress)
- -- 自动清零的读数据
- --[[ canData = mcp2515_read_rx_buffer(dataNMadress, 8+5) --读取地址标识和数据.0x71~0x7d
- log.info("read can data is", canData:toHex())
- canFrame = canID .. canData ]]
- canFrame = mcp2515_read_rx_buffer(dataNMadress, 8 + 5) --读取地址标识和数据.0x71~0x7d
- refreshTable(canFrame)
- -- log.info("read can frame is", canFrame:toHex())
- -- log.info("list is:", type(list),list.first)
- -- 放入接受数据缓冲区.
- -- list:pushlast(canFrame)
- -- sys.publish("ListReadPeriodIsReady", list) --发布消息
- -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
- -- mcp2515_bit_modify(CANINTF, 0x02, 0x00)
- -- log.info("下降沿 读取数据", canFrame:toHex())
- -- log.info("队列长度", list:length())
- -- 接受指示灯闪烁
- rxLedFlash() --不能用在定时器函数中,里面包含延时函数
- mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
- log.info("enter the can sample")
- end
- --定时清理,不管是否有中断发生,防止进不了中断.
- -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
- -- mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
- -- log.info("entre the can timer")
- -- Period_CAN_Send()
- end
- function interrupFlagClear()
- mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
- end
- -- sys.timerLoopStart(transList, 10000)
- -- sys.timerLoopStart(sampleCan, 30000)
- sys.taskInit(
- function()
- while true do
- -- csLow()
- -- spi.send(spi.SPI_1, string.char(0x03,0x66))
- -- data = spi.recv(spi.SPI_1, 8)
- -- print("ttt:"..data:toHex())
- -- csHigh()
- -- if dataIsReceived == true then
- -- rxLedFlash()
- -- dataIsReceived = false
- -- end
- sys.wait(1000)
- end
- end
- )
- function init_my()
- local canid1 = 0x10101
- local canid2 = 0x30605
- local canid3 = 0x31405
- local canid4 = 0x31201
- local canidMask = 0xfffce0f0
- local extdCanEnbale = true
- testSpiFlash.mcp2515_init(canid1, canid2, canid3, canid4, canidMask, extdCanEnbale)
- log.info("jwl","init all mcp .....")
- end
- -- 串口ID,串口读缓冲区
- local UART1_ID,UART2_ID,UART3_ID, recvQueue = 1,2,3, {}
- -- 串口超时,串口准备好后发布的消息
- local uartimeout, recvReady,RECV_MAXCNT = 100, "UART_RECV_ID",1024
- local flag_enatc="1"
- local function usb_write(data)
- uart.write(uart.USB, data)
- end
- uart.setup(uart.USB, 0, 0, uart.PAR_NONE, uart.STOP_1)
- uart.on(uart.USB, "receive", function()
- table.insert(recvQueue, uart.read(uart.USB, RECV_MAXCNT))
- sys.timerStart(sys.publish, uartimeout, recvReady,usb_write)
- end)
- sys.subscribe(recvReady, function(sndcb)
- local str_recv = table.concat(recvQueue)
- recvQueue = {}
- app_procmd(str_recv,sndcb)
- end)
- function app_procmd(str_recv, fncallbk)
- log.info("str_recv------------",str_recv,str_recv:toHex())
- local str_rsp =""
- local flag_handled=true
- local prefix = string.match(str_recv, "[aA][tT](%+%u+)")
- if prefix ~=nil then
-
- if prefix == "+RIL?" then
- str_rsp = "+RIL:"..flag_enatc
- elseif prefix == "+RIL" then
- local temp_enatc = string.match( str_recv, "+RIL=(%d+)")
- if temp_enatc ~= nil then
- flag_enatc = temp_enatc
- end
- if flag_enatc == "0" then ril.setrilcb(nil) end
- str_rsp = "+RIL:"..flag_enatc
- elseif prefix == "+CGMR" or prefix == "+PRO" then
- str_rsp = string.format("+RPO:%s %s\r\n", _G.PROJECT,_G.VERSION)
- elseif prefix == "+MEM" then
- str_rsp = "+DISK: "..rtos.get_fs_free_size().." Bytes +RAM: ".._G.collectgarbage("count").." Bytes"
- log.info("cur_tick:",mutils.getsystick())
- elseif prefix == "+TIME" then
- local c = misc.getClock()
- str_rsp = string.format('+TIME: %04d-%02d-%02d %02d:%02d:%02d timestamp:%d', c.year, c.month, c.day, c.hour, c.min, c.sec, os.time())
- elseif prefix == "+INIT" then
-
- -- init_my()
-
- -- mcp2515_bit_modify(CANCTRL, 0xE0, 128)
- -- --ret = mcp2515_read_register(CANCTRL)
- -- --log.info("<-- CANCTRL is : ",ret)
- -- --mcp2515_write_register(CNF1,0x09) --// 50k BRP=09,
- -- --mcp2515_write_register(CNF1,0x03) --125k
- -- mcp2515_write_register(CNF1, 0x01) --250k
- -- mcp2515_write_register(CNF2, (0x80 + PHSEG13TQ + PRSEG1TQ))
- -- mcp2515_write_register(CNF3, PHSEG23TQ)
- -- mcp2515_bit_modify(TXB0CTRL, 0x0B, 0x03)
- -- mcp2515_bit_modify(TXB1CTRL, 0x0B, 0x02)
- -- mcp2515_bit_modify(TXB2CTRL, 0x0B, 0x01)
-
- -- mcp2515_bit_modify(RXB0CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有标准标识符的有效报文,用以关闭该通道
- -- mcp2515_bit_modify(RXB1CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有扩展标识符的有效报文
- -- mcp2515_write_register(BFPCTRL, 0)
- -- -- /* TXnRTS Bits als Inputs */
- -- mcp2515_write_register(TXRTSCTRL, 0)
-
- -- tempcnf1 = mcp2515_read_register(CNF1)
- -- tempcnf2 = mcp2515_read_register(CNF2)
- -- tempcnf3 = mcp2515_read_register(CNF3)
- -- log.info("<-- CNF -->\r\n", tempcnf1, tempcnf2, tempcnf3)
-
- -- mcp2515_bit_modify(CANCTRL, 0xE0, 0)
-
- mcp2515_write_register(CANINTE, 0)
- mcp2515_write_register(CANINTE, 3)
-
-
- else
- flag_handled=false
- end
- else
- if string.upper(str_recv) =="AT\r\n" then
- str_rsp ="OK\r\n"
- else
- flag_handled=false
- end
- end
- if str_rsp ~="" then
- fncallbk(str_rsp)
- end
- if (not flag_handled) and (flag_enatc == "1") then
- log.info("send at cmd ==>" ,str_recv)
- ril.setrilcb(fncallbk)
- ril.request(str_recv)
- end
- end
|