testSpiFlash.lua 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. --- 模块功能:SPI接口的CAN控制器
  2. --- 默认启用SPI1,pin8,10,11,12,17,18
  3. -- @author openLuat
  4. -- @module spi.testSpiFlash
  5. -- @license
  6. -- @copyright
  7. -- @release 2019.02.27
  8. module(..., package.seeall)
  9. require "utils"
  10. require "pins"
  11. -- listbase = require "ring"
  12. -- local rf = require "receive"
  13. -- rf.list = "test"
  14. -- list = listbase:new()
  15. --[[
  16. 注意:此demo测试过程中,硬件上使用的是标准的SPI_1引脚
  17. 硬件连线图如下:
  18. Air模块--CAN模块
  19. GND--GND
  20. SPI_CS--CS
  21. SPI_CLK--CLK
  22. SPI_DO--DI
  23. SPI_DI--DO
  24. VDDIO--VCC
  25. ]]
  26. local SPIRESET = 0xC0
  27. local SPIREAD = 0x03
  28. local SPIREADRX = 0x90
  29. local SPIWRITE = 0x02
  30. local SPIWRITETX = 0x40
  31. local SPIRTS = 0x80
  32. local SPIREADSTATUS = 0xA0
  33. local SPIRXSTATUS = 0xB0
  34. local SPIBITMODIFY = 0x05
  35. --[[
  36. * @brief Adressen der Register des MCP2515
  37. *
  38. * Die Redundanten Adressen von z.B. dem Register CANSTAT ( 0x0E, 0x1E, 0x2E, ... ) wurden
  39. * dabei nicht mit aufgelistet.
  40. ]]
  41. local RXF0SIDH = 0x00
  42. local RXF1SIDH = 0x04
  43. local RXF2SIDH = 0x08
  44. local BFPCTRL = 0x0C
  45. local TXRTSCTRL = 0x0D
  46. local CANSTAT = 0x0E
  47. local CANCTRL = 0x0F
  48. local RXF3SIDH = 0x10
  49. local RXF4SIDH = 0x14
  50. local RXF5SIDH = 0x18
  51. local TEC = 0x1C
  52. local REC = 0x1D
  53. local RXM0SIDH = 0x20
  54. local RXM1SIDH = 0x24
  55. local CNF3 = 0x28
  56. local CNF2 = 0x29
  57. local CNF1 = 0x2A
  58. local CANINTE = 0x2B
  59. local CANINTF = 0x2C
  60. local EFLG = 0x2D
  61. local TXB0CTRL = 0x30
  62. local TXB1CTRL = 0x40
  63. local TXB2CTRL = 0x50
  64. local RXB0CTRL = 0x60
  65. local RXB1CTRL = 0x70
  66. --[[
  67. * @brief Bitdefinition von CNF2
  68. ]]
  69. local BTLMODE = 7
  70. local SAM = 6
  71. local PHSEG12 = 5
  72. local PHSEG11 = 4
  73. local PHSEG10 = 3
  74. local PHSEG2 = 2
  75. local PHSEG1 = 1
  76. local PHSEG0 = 0
  77. --[[
  78. * @brief Bitdefinition von CNF1
  79. ]]
  80. local SJW1 = 7
  81. local SJW0 = 6
  82. local BRP5 = 5
  83. local BRP4 = 4
  84. local BRP3 = 3
  85. local BRP2 = 2
  86. local BRP1 = 1
  87. local BRP0 = 0
  88. --[[
  89. * @brief Bitdefinition von CANINTE
  90. ]]
  91. local MERRE = 7
  92. local WAKIE = 6
  93. local ERRIE = 5
  94. local TX2IE = 4
  95. local TX1IE = 3
  96. local TX0IE = 2
  97. local RX1IE = 1
  98. local RX0IE = 0
  99. --[[
  100. * @brief Bitdefinition von CANINTF
  101. ]]
  102. local MERRF = 7
  103. local WAKIF = 6
  104. local ERRIF = 5
  105. local TX2IF = 4
  106. local TX1IF = 3
  107. local TX0IF = 2
  108. local RX1IF = 1
  109. local RX0IF = 0
  110. --[[
  111. * @brief Bitdefinition von EFLG
  112. ]]
  113. local RX1OVR = 7
  114. local RX0OVR = 6
  115. local TXB0 = 5
  116. local TXEP = 4
  117. local RXEP = 3
  118. local TXWAR = 2
  119. local RXWAR = 1
  120. local EWARN = 0
  121. --[[
  122. * @brief Bitdefinition von TXBnCTRL ( n = 0, 1, 2 )
  123. ]]
  124. local ABTF = 6
  125. local MLOA = 5
  126. local TXERR = 4
  127. local TXREQ = 3
  128. local TXP1 = 1
  129. local TXP0 = 0
  130. --[[
  131. * @brief Bitdefinition von RXB0CTRL
  132. ]]
  133. local RXM1 = 6
  134. local RXM0 = 5
  135. local RXRTR = 3
  136. local BUKT = 2
  137. local BUKT1 = 1
  138. local FILHIT0 = 0
  139. --[[
  140. * @brief Bitdefinition von TXBnSIDL ( n = 0, 1 )
  141. ]]
  142. local EXIDE = 3
  143. --[[
  144. * @brief Bitdefinition von RXB1CTRL
  145. *
  146. * @see RXM1, RXM0, RXRTR und FILHIT0 sind schon für RXB0CTRL definiert
  147. ]]
  148. local FILHIT2 = 2
  149. local FILHIT1 = 1
  150. --[[
  151. * @brief Bitdefinition von RXBnSIDL ( n = 0, 1 )
  152. ]]
  153. local SRR = 4
  154. local IDE = 3
  155. --[[
  156. * @brief Bitdefinition von RXBnDLC ( n = 0, 1 )
  157. *
  158. * @see TXBnDLC ( gleiche Bits )
  159. ]]
  160. local RTR = 6
  161. local DLC3 = 3
  162. local DLC2 = 2
  163. local DLC1 = 1
  164. local DLC0 = 0
  165. local CANRTR = 0x80
  166. local CANEID = 0x40
  167. local READ_LENGTH = 14
  168. --- Begin mt
  169. local MCPSIDH = 0
  170. local MCPSIDL = 1
  171. local MCPEID8 = 2
  172. local MCPEID0 = 3
  173. local PRSEG1TQ = 0
  174. local PHSEG13TQ = 16
  175. local PHSEG23TQ = 2
  176. local setGpio10Fnc = pins.setup(pio.P0_10,0)
  177. local function csLow()
  178. --拉低CS开始传输数据
  179. -- pio.pin.setval(0, 10)
  180. setGpio10Fnc(0)
  181. end
  182. local function csHigh()
  183. --传输结束拉高CS
  184. -- pio.pin.setval(1, 10)
  185. setGpio10Fnc(1)
  186. end
  187. local function rxTxLedInit()
  188. -- -- 接受指示灯
  189. -- -- pio.pin.close(19)
  190. -- -- pio.pin.setdir(pio.OUTPUT, 19)
  191. -- -- pio.pin.setval(0, 19) --初始状态灯灭
  192. -- -- -- 发送指示灯
  193. -- pio.pin.close(18)
  194. -- pio.pin.setdir(pio.OUTPUT, 18)
  195. -- pio.pin.setval(0, 18) --初始状态灯灭
  196. end
  197. -- 接受灯闪烁
  198. function rxLedFlash()
  199. -- pio.pin.setval(1, 19)
  200. -- sys.wait(100) --不能用在定时器函数中.
  201. -- pio.pin.setval(0, 19)
  202. end
  203. -- 发送灯闪烁
  204. function txLedFlash()
  205. -- pio.pin.setval(1, 18)
  206. -- sys.wait(100) --不能用在定时器函数中.
  207. -- pio.pin.setval(0, 18)
  208. end
  209. -- 接受灯闪烁二次
  210. function rxLedFlash2Times()
  211. -- pio.pin.setval(1, 19)
  212. -- sys.wait(100) --不能用在定时器函数中.
  213. -- pio.pin.setval(0, 19)
  214. -- sys.wait(100)
  215. -- pio.pin.setval(1, 19)
  216. -- sys.wait(100) --不能用在定时器函数中.
  217. -- pio.pin.setval(0, 19)
  218. end
  219. -- 发送灯闪烁二次
  220. function txLedFlash2Times()
  221. -- pio.pin.setval(1, 18)
  222. -- sys.wait(100) --不能用在定时器函数中.
  223. -- pio.pin.setval(0, 18)
  224. -- sys.wait(100)
  225. -- pio.pin.setval(1, 18)
  226. -- sys.wait(100) --不能用在定时器函数中.
  227. -- pio.pin.setval(0, 18)
  228. end
  229. --[[
  230. * Bit Timings
  231. *
  232. * Fosc = 8MHz 8M
  233. * BRP = 3 ( teilen durch 8 )
  234. * TQ = 2 * (BRP + 1) / Fosc ( => 1 µS )
  235. *
  236. * Sync Seg = 1TQ
  237. * Prop Seg = ( PRSEG + 1 ) * TQ = 1 TQ
  238. * Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 3 TQ
  239. * Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 3 TQ
  240. *
  241. * Bus speed = 1 / (Total # of TQ) * TQ
  242. * = 1 / 8 * TQ = 125 kHz
  243. ]]
  244. --位运算tmd麻烦
  245. function canid2reg(canid, extdEanble)
  246. -- local canid = "1C1F1714"
  247. -- local data2, data3
  248. -- local nextpos, data = pack.unpack(canid:fromHex(), ">I")
  249. if extdEanble then
  250. local dataHigh11bit = bit.band(canid, 0x1ffc0000)
  251. dataHigh11bit = bit.lshift(dataHigh11bit, 3)
  252. local dataLow18bit = bit.band(canid, 0x3ffff)
  253. dataLow18bit = bit.set(dataLow18bit, 19) --使能扩展位.
  254. -- log.info("bit.rshift(dataHigh18bit, 11)", dataLow18bit, dataHigh11bit)
  255. local reg = dataHigh11bit + dataLow18bit
  256. local b1, b2, b3, b4
  257. b1 = bit.band(reg, 0xff)
  258. b2 = bit.band(bit.rshift(reg, 8), 0xff)
  259. b3 = bit.band(bit.rshift(reg, 16), 0xff)
  260. b4 = bit.band(bit.rshift(reg, 24), 0xff)
  261. -- log.info("can filter reg is", reg, b4, b3, b2, b1)
  262. return b1, b2, b3, b4
  263. else
  264. local reg = bit.lshift(canid, 5)
  265. local b1, b2
  266. b1 = bit.band(reg, 0xff)
  267. b2 = bit.band(bit.rshift(reg, 8), 0xff)
  268. -- log.info("can filter reg is", reg, b2, b1)
  269. return b1, b2
  270. end
  271. end
  272. function reg2canid(reg, extdEanble)
  273. if extdEanble then
  274. local dataHigh11bit = bit.band(reg, 0xffe00000)
  275. dataHigh11bit = bit.rshift(dataHigh11bit, 3)
  276. local dataLow18bit = bit.band(reg, 0x0003ffff)
  277. local canid = dataLow18bit + dataHigh11bit
  278. return canid
  279. else
  280. local dataHigh11bit = bit.band(reg, 0xffe00000)
  281. canid = bit.band(bit.rshift(dataHigh11bit, 21), 0x7ff)
  282. return canid
  283. end
  284. end
  285. function canidMask2reg(canidMask, extdEanble)
  286. -- local canid = "1C1F1714"
  287. -- local data2, data3
  288. -- local nextpos, data = pack.unpack(canid:fromHex(), ">I")
  289. if extdEanble then
  290. local dataLow11bit = bit.band(canidMask, 0x1ffc0000)
  291. dataLow11bit = bit.lshift(dataLow11bit, 3)
  292. local dataHigh18bit = bit.band(canidMask, 0x3ffff)
  293. dataHigh18bit = bit.set(dataHigh18bit, 19) --使能扩展位.
  294. -- log.info("bit.rshift(dataHigh18bit, 11)", dataHigh18bit, dataLow11bit)
  295. local reg = dataLow11bit + dataHigh18bit
  296. local b1, b2, b3, b4
  297. b1 = bit.band(reg, 0xff)
  298. b2 = bit.band(bit.rshift(reg, 8), 0xff)
  299. b3 = bit.band(bit.rshift(reg, 16), 0xff)
  300. b4 = bit.band(bit.rshift(reg, 24), 0xff)
  301. -- log.info("can filter reg is", reg, b4, b3, b2, b1)
  302. return b1, b2, b3, b4
  303. else
  304. local reg = bit.lshift(canidMask, 5)
  305. local b1, b2
  306. b1 = bit.band(reg, 0xff)
  307. b2 = bit.band(bit.rshift(reg, 8), 0xff)
  308. -- log.info("can filter reg is", reg, b2, b1)
  309. return b1, b2
  310. end
  311. end
  312. local function spiInit()
  313. --打开SPI引脚的供电
  314. --pmd.ldoset(6,pmd.LDO_VMMC) --3.0v
  315. -- pmd.ldoset(6, pmd.LDO_VMMC) --3.0v
  316. -- pmd.ldoset(6, pmd.LDO_VLCD) --3.0v
  317. --SPI 初始化
  318. -- local result = spi.setup(spi.SPI_1,0,0,8,812500,1,1)
  319. local result = spi.setup(spi.SPI_1,0,0,8,1625000,1,1)
  320. -- local result = spi.setup(spi.SPI_1, 0, 0, 8, 13000000, 1)
  321. --local result = spi.setup(spi.SPI_1,1,1,8,110000,1)
  322. log.info("testSpiMCP2515.init", result)
  323. if result == 1 then
  324. sys.publish("SPI_INIT_OK")
  325. end
  326. --重新配置GPIO10 (CS脚) 配为输出,默认高电平
  327. pio.pin.close(10)
  328. pio.pin.setdir(pio.OUTPUT, 10)
  329. pio.pin.setval(1, 10)
  330. --pio.pin.close(pio.P0_17)
  331. --pio.pin.setdir(pio.INPUT,pio.P0_17)
  332. --pins.setup(pio.P0_17,nil,pio.PULLUP)
  333. -- 芯片重启
  334. -- pio.pin.close(26) --724版本无此引脚
  335. -- pio.pin.setdir(pio.OUTPUT, 26)
  336. -- pio.pin.setval(0, 26) --反向输出,0--高电平
  337. -- 芯片重启
  338. -- pio.pin.close(25)
  339. -- pio.pin.setdir(pio.INPUT, 25)
  340. -- pio.pin.setval(0, 26) --反向输出,0--高电平
  341. end
  342. local function refreshTable(frame)
  343. local candata, canid
  344. local B0, B1, B2, B3, B4, B5, B6, B7
  345. local B0B1, B2B3, B4B5, B6B7
  346. canid = frame:sub(1, 4)
  347. candata = frame:sub(-8)
  348. -- local nextpos, canid = pack.unpack(canid, ">I") --转化为寄存器数字,还不是canid
  349. -- local table = _G.canTable
  350. -- table[canid] = candata
  351. --[[ for k, v in pairs(table) do
  352. log.info("table data list is", k, v)
  353. end ]]
  354. -- canid = testSpiFlash.reg2canid(canid, extdCanEnbale)
  355. print(candata:toHex())
  356. end
  357. function mcp2515_readXXStatus_helper(cmd)
  358. local status = nil
  359. csLow()
  360. spi.send_recv(spi.SPI_1, string.char(cmd))
  361. local status = spi.recv(spi.SPI_1, 1)
  362. --status = spi.send_recv(spi.SPI_1,string.char(cmd))
  363. csHigh()
  364. -- return string.byte(status)
  365. return status
  366. end
  367. local function mcp2515_write_register(adress, data)
  368. csLow()
  369. spi.send_recv(spi.SPI_1, string.char(SPIWRITE, adress, data))
  370. --spi.send(spi.SPI_1,string.char(SPIWRITE))
  371. --spi.send(spi.SPI_1,string.char(adress))
  372. --spi.send(spi.SPI_1,string.char(data))
  373. log.info("write reg addr and data", adress, data)
  374. csHigh()
  375. end
  376. -- E0 EB 17 14 08 00 00 00 00 00 00 00 12 0E
  377. -- E0 EB 17 14 08 00 00 00 00 00 00 00 12 0C
  378. -- 1110 0000 1110 1011 0001 0111 0001 0100
  379. local dataIsReceived = false
  380. local function gpio17IntFnc(msg)
  381. --[[ local dataNMadress = 0x06 --从0x66开始读取can数据
  382. local dataNMadress2 = 0x00 ]]
  383. local dataNMadress = 0x04 --从0x71地址开始读取can数据
  384. local dataNMadress2 = 0x00
  385. local canData, canID, canFrame
  386. -- log.info("---------------------------testGpioSingle.gpio4IntFnc------------------------------", msg, getGpio17Fnc())
  387. --上升沿中断
  388. -- log.info("testGpioSingle.gpio4IntFnc", msg, getGpio17Fnc())
  389. if msg == cpu.INT_GPIO_POSEDGE then
  390. --[[ data = mcp2515_read_rx_buffer(dataNMadress2)
  391. mcp2515_bit_modify(CANINTF, 0x01, 0x00)
  392. mcp2515_bit_modify(CANINTF, 0x02, 0x00)
  393. log.info("上升沿", data:toHex(),data:len()) ]]
  394. elseif msg == cpu.INT_GPIO_NEGEDGE then
  395. --根据滤波器匹配去判断,更快
  396. --[[ canID = mcp2515_readXXStatus_helper(SPIRXSTATUS)
  397. log.info("下降沿 滤波器选中", canID)
  398. -- data = mcp2515_read_register(dataNMadress)
  399. -- 自动清零的读数据
  400. canData = mcp2515_read_rx_buffer(dataNMadress, 8)
  401. canFrame = canID .. canData ]]
  402. -- canFrame = mcp2515_read_rx_buffer(dataNMadress, 8 + 5) --读取地址标识和数据.0x71~0x7d
  403. -- log.info("fall edge", canFrame:toHex())
  404. dataIsReceived = true
  405. -- log.info("list is:", type(list),list.first)
  406. -- list:pushlast(canFrame)
  407. -- sys.publish("ListReadPeriodIsReady", list)
  408. -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
  409. -- mcp2515_bit_modify(CANINTF, 0x02, 0x00)
  410. -- log.info("下降沿 读取数据", canFrame:toHex())
  411. csLow()
  412. spi.send(spi.SPI_1, string.char(0x03,0x61))
  413. data = spi.recv(spi.SPI_1, 4)
  414. print("yyyy:"..data:toHex())
  415. csHigh()
  416. csLow()
  417. spi.send(spi.SPI_1, string.char(0x03,0x65))
  418. data = spi.recv(spi.SPI_1, 1)
  419. print("lenth:"..data:toHex())
  420. csHigh()
  421. csLow()
  422. spi.send(spi.SPI_1, string.char(0x03,0x66))
  423. data = spi.recv(spi.SPI_1, data:toHex())
  424. print("ttt:"..data:toHex())
  425. -- log.info("队列长度", list:length())
  426. -- refreshTable(canFrame)
  427. csHigh()
  428. end
  429. mcp2515_bit_modify(CANINTF, 0x01, 0x00)
  430. mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
  431. mcp2515_write_register(CANINTE, 0)
  432. mcp2515_write_register(CANINTE, 3)
  433. end
  434. --GPIO4配置为中断,可通过getGpio4Fnc()获取输入电平,产生中断时,自动执行gpio4IntFnc函数
  435. pio.pin.setdebounce(5)
  436. -- getGpio17Fnc = pins.setup(24, gpio17IntFnc)
  437. getGpio17Fnc = pins.setup(18, gpio17IntFnc, pio.PULLUP) --tannew 1 -- zhu19 -tanori 26
  438. -- getGpio17Fnc = pins.setup(pio.P0_24,gpio17IntFnc)
  439. -- pio.pin.setdebounce(0) --关闭延时消抖功能
  440. --GPIO4配置为输入模式,可通过getGpio4Fnc()获取输入电平,执行gpio4IntFnc函数获取当前电平
  441. -- getGpio17Fnc = pins.setup(24)
  442. --[[ local function csLow()
  443. --拉低CS开始传输数据
  444. pio.pin.setval(0, pio.P0_10)
  445. end
  446. local function csHigh()
  447. --传输结束拉高CS
  448. pio.pin.setval(1, pio.P0_10)
  449. end ]]
  450. -- 从指定地址起始的寄存器读取数据。
  451. local function mcp2515_read_register(adress)
  452. local data = nil
  453. csLow()
  454. spi.send_recv(spi.SPI_1, string.char(SPIREAD, adress))
  455. --spi.send(spi.SPI_1,string.char(adress))
  456. data = spi.send_recv(spi.SPI_1, string.char(0x00))
  457. -- data = spi.recv(spi.SPI_1, 1)
  458. --data = spi.send_recv(spi.SPI_1,string.char(SPIREAD,adress))
  459. csHigh()
  460. return string.byte(data)
  461. end
  462. -- 读RX 缓冲
  463. -- 读取接收缓冲器时,在“n,m”所指示的四个地址中的一个放置地
  464. -- 址指针可以减轻一般读命令的开销。注:在拉升CS 引脚为高电平
  465. -- 后,相关的RX 标志位(CANINTF.RXnIF)将被清零。
  466. function mcp2515_read_rx_buffer(adress, length)
  467. -- local dummyData = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
  468. local data
  469. local tmpadr
  470. csLow()
  471. tmpadr = (SPIREADRX + adress)
  472. --data = spi.send_recv(spi.SPI_1,string.char(tmpadr))
  473. spi.send_recv(spi.SPI_1, string.char(tmpadr))
  474. -- data = spi.send_recv(spi.SPI_1, string.char(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  475. data = spi.recv(spi.SPI_1, length)
  476. csHigh()
  477. -- return string.byte(data)
  478. return data
  479. end
  480. function mcp2515_bit_modify(adress, mask, data)
  481. csLow()
  482. -- spi.send(spi.SPI_1, string.char(SPIBITMODIFY, adress, mask, data))
  483. spi.send_recv(spi.SPI_1, string.char(SPIBITMODIFY, adress, mask, data))
  484. --spi.send(spi.SPI_1,string.char(SPIBITMODIFY))
  485. --spi.send(spi.SPI_1,string.char(adress))
  486. --spi.send(spi.SPI_1,string.char(mask))
  487. --spi.send(spi.SPI_1,string.char(data))
  488. csHigh()
  489. end
  490. -- RX 状态指令
  491. -- 2 1 0 滤波器匹配
  492. -- 0 0 0 RXF0
  493. -- 0 0 1 RXF1
  494. -- 0 1 0 RXF2
  495. -- 0 1 1 RXF3
  496. -- 1 0 0 RXF4
  497. -- 1 0 1 RXF5
  498. -- 1 1 0 RXF0 (滚存到RXB1)
  499. -- 1 1 1 RXF1 (滚存到RXB1)
  500. function mcp2515_init(canid1, canid2, canid3, canid4, canidMask, extdEanble)
  501. -- function mcp2515_init()
  502. local tempcnf1
  503. local tempcnf2
  504. local tempcnf3
  505. spiInit()
  506. rxTxLedInit() --初始化接受发送led指示灯.
  507. csLow()
  508. local ret = spi.send_recv(spi.SPI_1, string.char(SPIRESET))
  509. log.info("<-- Mcp2515 is rt: ", ret,ret:toHex() )
  510. csHigh()
  511. mcp2515_bit_modify(CANCTRL, 0xE0, 128)
  512. --ret = mcp2515_read_register(CANCTRL)
  513. --log.info("<-- CANCTRL is : ",ret)
  514. --mcp2515_write_register(CNF1,0x09) --// 50k BRP=09,
  515. --mcp2515_write_register(CNF1,0x03) --125k
  516. mcp2515_write_register(CNF1, 0x01) --250k
  517. mcp2515_write_register(CNF2, (0x80 + PHSEG13TQ + PRSEG1TQ))
  518. mcp2515_write_register(CNF3, PHSEG23TQ)
  519. mcp2515_bit_modify(TXB0CTRL, 0x0B, 0x03)
  520. mcp2515_bit_modify(TXB1CTRL, 0x0B, 0x02)
  521. mcp2515_bit_modify(TXB2CTRL, 0x0B, 0x01)
  522. if extdEanble then
  523. mcp2515_bit_modify(RXB0CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有标准标识符的有效报文,用以关闭该通道
  524. mcp2515_bit_modify(RXB1CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有扩展标识符的有效报文
  525. else
  526. mcp2515_bit_modify(RXB0CTRL, 0x60, 0x40) --只接收符合滤波器条件的带有扩展标识符的有效报文,用以关闭该通道
  527. mcp2515_bit_modify(RXB1CTRL, 0x60, 0x20) --只接收符合滤波器条件的带有标准标识符的有效报文
  528. end
  529. --mcp2515_Filter_ID(const unsigned char addr, unsigned char ext, unsigned int can_id)
  530. -- /* Filter Buffer 0 */
  531. csLow()
  532. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF0SIDH, 0xff, 0xff))
  533. --关闭该缓存
  534. csHigh()
  535. csLow()
  536. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF1SIDH, 0xff, 0xff))
  537. csHigh()
  538. -- /* Filter Buffer 1 */
  539. if extdEanble then --扩展帧.
  540. csLow()
  541. log.info("received canid data is", canid1, canid2, canid3, canid4, canidMask, extdEanble)
  542. local b1, b2, b3, b4 = canid2reg(canid1, extdEanble)
  543. -- local b1, b2, b3, b4 = canid2reg(canid1, true)
  544. log.info("extend canid is", b4, b3, b2, b1)
  545. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF2SIDH, b4, b3, b2, b1))
  546. csHigh()
  547. csLow()
  548. local b1, b2, b3, b4 = canid2reg(canid2, extdEanble)
  549. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF3SIDH, b4, b3, b2, b1))
  550. csHigh()
  551. csLow()
  552. local b1, b2, b3, b4 = canid2reg(canid3, extdEanble)
  553. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF4SIDH, b4, b3, b2, b1))
  554. csHigh()
  555. csLow()
  556. local b1, b2, b3, b4 = canid2reg(canid4, extdEanble)
  557. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF5SIDH, b4, b3, b2, b1))
  558. csHigh()
  559. -- /* Maske Buffer 0 */
  560. csLow()
  561. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM0SIDH, 0xff, 0xff, 0xff, 0xff)) --不屏蔽.
  562. csHigh()
  563. -- /* Maske Buffer 1 */
  564. csLow()
  565. local b1, b2, b3, b4 = canidMask2reg(canidMask, extdEanble)
  566. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM1SIDH, b4, b3, b2, b1))
  567. csHigh()
  568. else --标准帧.
  569. csLow()
  570. log.info("received canid data is", canid1, canid2, canid3, canid4, canidMask, extdEanble)
  571. local b1, b2 = canid2reg(canid1, extdEanble)
  572. log.info("extend canid is", b2, b1)
  573. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF2SIDH, b2, b1))
  574. csHigh()
  575. csLow()
  576. local b1, b2 = canid2reg(canid2, extdEanble)
  577. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF3SIDH, b2, b1))
  578. csHigh()
  579. csLow()
  580. local b1, b2 = canid2reg(canid3, extdEanble)
  581. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF4SIDH, b2, b1))
  582. csHigh()
  583. csLow()
  584. local b1, b2 = canid2reg(canid4, extdEanble)
  585. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXF5SIDH, b2, b1))
  586. csHigh()
  587. -- /* Maske Buffer 0 */
  588. csLow()
  589. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM0SIDH, 0xff, 0xff)) --不屏蔽.
  590. csHigh()
  591. -- /* Maske Buffer 1 */
  592. csLow()
  593. local b1, b2 = canidMask2reg(canidMask, extdEanble)
  594. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, RXM1SIDH, b2, b1))
  595. csHigh()
  596. end
  597. -- /* Pins RXnBF Pins ( High Impedance State ) */
  598. mcp2515_write_register(BFPCTRL, 0)
  599. -- /* TXnRTS Bits als Inputs */
  600. mcp2515_write_register(TXRTSCTRL, 0)
  601. tempcnf1 = mcp2515_read_register(CNF1)
  602. tempcnf2 = mcp2515_read_register(CNF2)
  603. tempcnf3 = mcp2515_read_register(CNF3)
  604. log.info("<-- CNF -->\r\n", tempcnf1, tempcnf2, tempcnf3)
  605. mcp2515_bit_modify(CANCTRL, 0xE0, 0)
  606. mcp2515_write_register(CANINTE, 0)
  607. mcp2515_write_register(CANINTE, 3)
  608. end
  609. -- canid = 0x012
  610. -- canbuf = {}
  611. -- canbuf[1] = 1
  612. -- canbuf[2] = 2
  613. -- canbuf[3] = 3
  614. -- canbuf[4] = 4
  615. -- canbuf[5] = 5
  616. -- canbuf[6] = 6
  617. -- canbuf[7] = 7
  618. -- canbuf[8] = 8
  619. local flagsRTR = 0
  620. local TxBnum = 3
  621. local ctrlval = 0
  622. local temp0 = 0
  623. local temp1 = 0
  624. local temp2 = 0
  625. local temp3 = 0
  626. local length = 8
  627. local rttmpval = 0
  628. function Period_CAN_Send(canid, canbuf)
  629. TxBnum = 3
  630. for i = 1, 3 do
  631. ctrlval = mcp2515_read_register(TXB0CTRL + 0x10 * (i - 1))
  632. -- log.info("<-- ctrlval val. -->\r\n", ctrlval)
  633. --if((ctrlval&0x08) == 0) then
  634. if (((ctrlval % 16) / 8) == 0) then
  635. TxBnum = (i - 1)
  636. -- log.info("<-- CANTX NUM. -->\r\n", TxBnum)
  637. break
  638. end
  639. end
  640. if (TxBnum < 3) then
  641. ctrlval = TXB0CTRL + 0x10 * TxBnum + 1
  642. else
  643. ctrlval = TXB0CTRL + 1
  644. end
  645. if (canid > 0x7ff) then --扩展帧.
  646. temp3, temp2, temp1, temp0 = canid2reg(canid, true)
  647. else
  648. --temp[0] = (unsigned char) (id>>3)
  649. --temp[1] = (unsigned char) (id<<5)
  650. temp0 = (canid / 8) % 256
  651. temp1 = (canid * 32) % 256
  652. temp2 = 0
  653. temp3 = 0
  654. end
  655. --mcp2515_write_register_p(ctrlval, temp, 4)
  656. csLow()
  657. local retnum = spi.send_recv(spi.SPI_1, string.char(SPIWRITE, ctrlval, temp0, temp1, temp2, temp3))
  658. csHigh()
  659. if (flagsRTR > 0) then
  660. mcp2515_write_register((ctrlval + 4), (length + 64))
  661. else
  662. mcp2515_write_register((ctrlval + 4), length)
  663. end
  664. --mcp2515_write_register_p(ctrlval+5, data, length)
  665. csLow()
  666. local retnum =
  667. spi.send_recv(
  668. spi.SPI_1,
  669. string.char(
  670. SPIWRITE,
  671. (ctrlval + 5),
  672. canbuf[1],
  673. canbuf[2],
  674. canbuf[3],
  675. canbuf[4],
  676. canbuf[5],
  677. canbuf[6],
  678. canbuf[7],
  679. canbuf[8]
  680. )
  681. )
  682. csHigh()
  683. txLedFlash()
  684. mcp2515_bit_modify(ctrlval - 1, 0x08, 0x08)
  685. --[[
  686. rttmpval = mcp2515_read_register(ctrlval-1)
  687. while(((rttmpval%16)/8) == 1) do
  688. rttmpval = mcp2515_read_register(ctrlval-1)
  689. log.info("<-- WAIT TX COMPLETE. -->", rttmpval)
  690. local txstatus = mcp2515_read_register(ctrlval-1)
  691. log.info("<-- TXBCTRL STATUS. -->", txstatus)
  692. end
  693. --]]
  694. end
  695. local function loop()
  696. --mcp2515_init()
  697. Period_CAN_Send()
  698. --spi.close(spi.SPI_1)
  699. end
  700. --[[ sys.taskInit(function()
  701. mcp2515_init()
  702. while true do
  703. Period_CAN_Send()
  704. log.info("enter the can code")
  705. sys.wait(1000)
  706. end
  707. end
  708. ) ]]
  709. -- mcp2515_init()
  710. -- mcp2515_init(0x18f101d0,0x18f101d0,0x18f101d0,0x18f101d0,true)
  711. -- sys.timerLoopStart(loop, 10000)
  712. --[[ function transList()
  713. sys.publish("ListReadPeriodIsReady", list)
  714. end ]]
  715. function sampleCan()
  716. local dataNMadress = 0x04 --从0x71地址开始读取can数据
  717. local dataNMadress2 = 0x00
  718. local canData, canID, canFrame
  719. local level = getGpio17Fnc()
  720. if (level == 0) then --int 引脚是电平
  721. --根据滤波器匹配去判断,更快
  722. --[[ canID = mcp2515_readXXStatus_helper(SPIRXSTATUS)
  723. log.info("read can ID is", canID:toHex()) ]]
  724. -- data = mcp2515_read_register(dataNMadress)
  725. -- 自动清零的读数据
  726. --[[ canData = mcp2515_read_rx_buffer(dataNMadress, 8+5) --读取地址标识和数据.0x71~0x7d
  727. log.info("read can data is", canData:toHex())
  728. canFrame = canID .. canData ]]
  729. canFrame = mcp2515_read_rx_buffer(dataNMadress, 8 + 5) --读取地址标识和数据.0x71~0x7d
  730. refreshTable(canFrame)
  731. -- log.info("read can frame is", canFrame:toHex())
  732. -- log.info("list is:", type(list),list.first)
  733. -- 放入接受数据缓冲区.
  734. -- list:pushlast(canFrame)
  735. -- sys.publish("ListReadPeriodIsReady", list) --发布消息
  736. -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
  737. -- mcp2515_bit_modify(CANINTF, 0x02, 0x00)
  738. -- log.info("下降沿 读取数据", canFrame:toHex())
  739. -- log.info("队列长度", list:length())
  740. -- 接受指示灯闪烁
  741. rxLedFlash() --不能用在定时器函数中,里面包含延时函数
  742. mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
  743. log.info("enter the can sample")
  744. end
  745. --定时清理,不管是否有中断发生,防止进不了中断.
  746. -- mcp2515_bit_modify(CANINTF, 0x01, 0x00)
  747. -- mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
  748. -- log.info("entre the can timer")
  749. -- Period_CAN_Send()
  750. end
  751. function interrupFlagClear()
  752. mcp2515_bit_modify(CANINTF, 0x02, 0x00) --for cs pin if float, so this i necessary
  753. end
  754. -- sys.timerLoopStart(transList, 10000)
  755. -- sys.timerLoopStart(sampleCan, 30000)
  756. sys.taskInit(
  757. function()
  758. while true do
  759. -- csLow()
  760. -- spi.send(spi.SPI_1, string.char(0x03,0x66))
  761. -- data = spi.recv(spi.SPI_1, 8)
  762. -- print("ttt:"..data:toHex())
  763. -- csHigh()
  764. -- if dataIsReceived == true then
  765. -- rxLedFlash()
  766. -- dataIsReceived = false
  767. -- end
  768. sys.wait(1000)
  769. end
  770. end
  771. )
  772. function init_my()
  773. local canid1 = 0x10101
  774. local canid2 = 0x30605
  775. local canid3 = 0x31405
  776. local canid4 = 0x31201
  777. local canidMask = 0xfffce0f0
  778. local extdCanEnbale = true
  779. testSpiFlash.mcp2515_init(canid1, canid2, canid3, canid4, canidMask, extdCanEnbale)
  780. log.info("jwl","init all mcp .....")
  781. end
  782. -- 串口ID,串口读缓冲区
  783. local UART1_ID,UART2_ID,UART3_ID, recvQueue = 1,2,3, {}
  784. -- 串口超时,串口准备好后发布的消息
  785. local uartimeout, recvReady,RECV_MAXCNT = 100, "UART_RECV_ID",1024
  786. local flag_enatc="1"
  787. local function usb_write(data)
  788. uart.write(uart.USB, data)
  789. end
  790. uart.setup(uart.USB, 0, 0, uart.PAR_NONE, uart.STOP_1)
  791. uart.on(uart.USB, "receive", function()
  792. table.insert(recvQueue, uart.read(uart.USB, RECV_MAXCNT))
  793. sys.timerStart(sys.publish, uartimeout, recvReady,usb_write)
  794. end)
  795. sys.subscribe(recvReady, function(sndcb)
  796. local str_recv = table.concat(recvQueue)
  797. recvQueue = {}
  798. app_procmd(str_recv,sndcb)
  799. end)
  800. function app_procmd(str_recv, fncallbk)
  801. log.info("str_recv------------",str_recv,str_recv:toHex())
  802. local str_rsp =""
  803. local flag_handled=true
  804. local prefix = string.match(str_recv, "[aA][tT](%+%u+)")
  805. if prefix ~=nil then
  806. if prefix == "+RIL?" then
  807. str_rsp = "+RIL:"..flag_enatc
  808. elseif prefix == "+RIL" then
  809. local temp_enatc = string.match( str_recv, "+RIL=(%d+)")
  810. if temp_enatc ~= nil then
  811. flag_enatc = temp_enatc
  812. end
  813. if flag_enatc == "0" then ril.setrilcb(nil) end
  814. str_rsp = "+RIL:"..flag_enatc
  815. elseif prefix == "+CGMR" or prefix == "+PRO" then
  816. str_rsp = string.format("+RPO:%s %s\r\n", _G.PROJECT,_G.VERSION)
  817. elseif prefix == "+MEM" then
  818. str_rsp = "+DISK: "..rtos.get_fs_free_size().." Bytes +RAM: ".._G.collectgarbage("count").." Bytes"
  819. log.info("cur_tick:",mutils.getsystick())
  820. elseif prefix == "+TIME" then
  821. local c = misc.getClock()
  822. 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())
  823. elseif prefix == "+INIT" then
  824. -- init_my()
  825. -- mcp2515_bit_modify(CANCTRL, 0xE0, 128)
  826. -- --ret = mcp2515_read_register(CANCTRL)
  827. -- --log.info("<-- CANCTRL is : ",ret)
  828. -- --mcp2515_write_register(CNF1,0x09) --// 50k BRP=09,
  829. -- --mcp2515_write_register(CNF1,0x03) --125k
  830. -- mcp2515_write_register(CNF1, 0x01) --250k
  831. -- mcp2515_write_register(CNF2, (0x80 + PHSEG13TQ + PRSEG1TQ))
  832. -- mcp2515_write_register(CNF3, PHSEG23TQ)
  833. -- mcp2515_bit_modify(TXB0CTRL, 0x0B, 0x03)
  834. -- mcp2515_bit_modify(TXB1CTRL, 0x0B, 0x02)
  835. -- mcp2515_bit_modify(TXB2CTRL, 0x0B, 0x01)
  836. -- mcp2515_bit_modify(RXB0CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有标准标识符的有效报文,用以关闭该通道
  837. -- mcp2515_bit_modify(RXB1CTRL, 0x60, 0x60) --只接收符合滤波器条件的带有扩展标识符的有效报文
  838. -- mcp2515_write_register(BFPCTRL, 0)
  839. -- -- /* TXnRTS Bits als Inputs */
  840. -- mcp2515_write_register(TXRTSCTRL, 0)
  841. -- tempcnf1 = mcp2515_read_register(CNF1)
  842. -- tempcnf2 = mcp2515_read_register(CNF2)
  843. -- tempcnf3 = mcp2515_read_register(CNF3)
  844. -- log.info("<-- CNF -->\r\n", tempcnf1, tempcnf2, tempcnf3)
  845. -- mcp2515_bit_modify(CANCTRL, 0xE0, 0)
  846. mcp2515_write_register(CANINTE, 0)
  847. mcp2515_write_register(CANINTE, 3)
  848. else
  849. flag_handled=false
  850. end
  851. else
  852. if string.upper(str_recv) =="AT\r\n" then
  853. str_rsp ="OK\r\n"
  854. else
  855. flag_handled=false
  856. end
  857. end
  858. if str_rsp ~="" then
  859. fncallbk(str_rsp)
  860. end
  861. if (not flag_handled) and (flag_enatc == "1") then
  862. log.info("send at cmd ==>" ,str_recv)
  863. ril.setrilcb(fncallbk)
  864. ril.request(str_recv)
  865. end
  866. end