KXTJ3-1057.lua 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. --[[
  2. Author: 稀饭放姜
  3. Date: 2020-12-18 15:50:05
  4. LastEditors: 稀饭放姜
  5. LastEditTime: 2020-12-25 12:24:25
  6. FilePath: \HeFeiYunShi-Air724\user\sensor.lua
  7. --]]
  8. require "utils"
  9. module(..., package.seeall)
  10. -- id = 2
  11. -- 初始化并打开I2C操作
  12. -- @param I2C 内部ID
  13. -- @return number ,I2C的速率
  14. local function i2c_open(id, speed)
  15. if i2c.setup(id, speed or i2c.SLOW) ~= i2c.SLOW then
  16. i2c.close(id)
  17. return i2c.setup(id, speed or i2c.SLOW)
  18. end
  19. return i2c.SLOW
  20. end
  21. --- 读取寄存器值
  22. -- @number id: I2C端口号
  23. -- @number addr:从机地址
  24. -- @number reg: 寄存器地址
  25. -- @return number: 寄存器当前值
  26. function readRegister(id, addr, reg)
  27. log.info("-------->I2C OPEN Result:", i2c_open(id))
  28. i2c.send(id, addr, reg)
  29. local _, val = pack.unpack(i2c.recv(id, addr, 1), 'b')
  30. i2c.close(id)
  31. log.info("读取", string.format("寄存器:0x%02x 当前值:0x%02x", reg, val or 0))
  32. return val;
  33. end
  34. --- 写寄存器方法
  35. -- @number id: I2C端口号
  36. -- @number addr:从机地址
  37. -- @number reg: 寄存器地址
  38. -- @number ...: 要写入寄存器其他值
  39. -- @return number: 寄存当前值
  40. function writeRegister(id, addr, reg, ...)
  41. log.info("-------->I2C OPEN Result:", i2c_open(id))
  42. i2c.send(id, addr, {reg, ...})
  43. local _, val = pack.unpack(i2c.recv(id, addr, 1), 'b')
  44. log.info("重读", string.format("寄存器:0x%02x 当前值:0x%02x", reg, val or 0))
  45. i2c.close(id)
  46. return val
  47. end
  48. -------------------------------------- KXTJ3-1057 驱动代码开始 --------------------------------------
  49. local KXTJ3_ADDR = 0x0E --KXTJ3 的地址
  50. local KXTJ3_DCST_RESP = 0x0C -- KXTJ3 的数字通自检寄存器
  51. local KXTJ3_SELF_TEST = 0x3A -- KXTJ3 的功自检寄存器
  52. -- 加速度输出寄存器
  53. local KXTJ3_XOUT_L = 0x06
  54. local KXTJ3_XOUT_H = 0x07
  55. local KXTJ3_YOUT_L = 0x08
  56. local KXTJ3_YOUT_H = 0x09
  57. local KXTJ3_ZOUT_L = 0x0A
  58. local KXTJ3_ZOUT_H = 0x0B
  59. -- 中断寄存器
  60. local KXTJ3_INT_SOURCE1 = 0x16
  61. local KXTJ3_INT_SOURCE2 = 0x17
  62. local KXTJ3_STATUS_REG = 0x18
  63. local KXTJ3_INT_REL = 0x1A
  64. -- 控制寄存器
  65. local KXTJ3_CTRL_REG1 = 0x1B -- KXTJ3的CTRL_REG1地址
  66. local KXTJ3_CTRL_REG2 = 0x1D
  67. local KXTJ3_INT_CTRL_REG1 = 0x1E
  68. local KXTJ3_INT_CTRL_REG2 = 0x1F
  69. local KXTJ3_DATA_CTRL_REG = 0x21
  70. local KXTJ3_WAKEUP_COUNTER = 0x29
  71. local KXTJ3_WAKEUP_THRESHOLD_H = 0x6A
  72. local KXTJ3_WAKEUP_THRESHOLD_L = 0x6B
  73. --- 数字通信自检验证
  74. -- number id: I2C端口号
  75. -- return number 正常返回0x55,其他值为异常
  76. function dcst(id)
  77. local val = readRegister(id, KXTJ3_ADDR, KXTJ3_DCST_RESP)
  78. log.info("KXTJ3C DCST Result:", string.format("0x%02x", val or 0))
  79. return val;
  80. end
  81. --- 读中断状态
  82. -- number id: I2C端口号
  83. -- return number 返回状态寄存器当前值
  84. function readStatus(id)
  85. local val = readRegister(id, KXTJ3_ADDR, KXTJ3_STATUS_REG)
  86. log.info("KXTJ3C read interrupt status:", string.format("0x%02x", val or 0))
  87. return val;
  88. end
  89. --- 清中断状态
  90. -- number id: I2C端口号
  91. -- return nil
  92. function clearStatus(id)
  93. readRegister(id, KXTJ3_ADDR, KXTJ3_INT_REL)
  94. log.info("Clear Interrupt status register:", "OK")
  95. end
  96. --- 读取中断源寄存器
  97. -- number id: I2C端口号
  98. -- @number src: 1 读中断源1寄存器, 2读中断源2寄存器
  99. -- @return number: 返中断源寄存器的值
  100. function readInterrupt(id, src)
  101. local val = 0
  102. if src == 2 then
  103. val = readRegister(id, KXTJ3_ADDR, KXTJ3_INT_SOURCE2)
  104. else
  105. val = readRegister(id, KXTJ3_ADDR, KXTJ3_INT_SOURCE1)
  106. end
  107. log.info("readInterrupt register:", string.format("%02x", val or 0))
  108. return val
  109. end
  110. --- 配置 KXTJ3工作模式
  111. -- number id: I2C端口号
  112. -- @number mode: 0 准备模式, 1工作模式
  113. -- @return number: 返中断源寄存器的值
  114. function setMode(id, mode)
  115. log.info("-------->I2C OPEN Result:", i2c_open(id))
  116. i2c.send(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1)
  117. local _, val = pack.unpack(i2c.recv(id, KXTJ3_ADDR, 1), 'b')
  118. i2c.send(id, KXTJ3_ADDR, {KXTJ3_CTRL_REG1, mode == 0 and bit.clear(val, 7) or bit.set(val, 7)})
  119. val = readRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1)
  120. i2c.close(id)
  121. log.info("读取CTRL_REG1寄存器:", string.format("当前值:0x%02x", val or 0))
  122. end
  123. --- 读取三轴输出值,注意结果是 Tri-axis 数字量
  124. -- @param axis: 'x','y','z' 分别表示x,y,z轴
  125. -- @number n: 分辨率,可选值8,12,14(CTRL_REG1配置)
  126. -- @return number: Tri-axis Digital
  127. function readAxis(id, axis, n)
  128. local val, recv, reg = 0, {}, {}
  129. if axis == 'x' then
  130. reg[1] = KXTJ3_XOUT_L
  131. reg[2] = KXTJ3_XOUT_H
  132. elseif axis == 'y' then
  133. reg[1] = KXTJ3_YOUT_L
  134. reg[2] = KXTJ3_YOUT_H
  135. elseif axis == 'z' then
  136. reg[1] = KXTJ3_ZOUT_L
  137. reg[2] = KXTJ3_ZOUT_H
  138. else
  139. return 0
  140. end
  141. recv[1] = readRegister(id, KXTJ3_ADDR, reg[1])
  142. recv[2] = readRegister(id, KXTJ3_ADDR, reg[2])
  143. val = recv[2] * 256 + recv[1]
  144. if n == 8 then
  145. return recv[2]
  146. elseif n == 12 then
  147. return (recv[2] > 0x7F) and bit.bor(bit.rshift(val, 4), 0xF000) or bit.band(bit.rshift(val, 4), 0x0FFF)
  148. elseif n == 14 then
  149. return (recv[2] > 0x7F) and bit.bor(bit.rshift(val, 4), 0xC000) or bit.band(bit.rshift(val, 4), 0x3FFF)
  150. end
  151. return 0;
  152. end
  153. -- KXTJ3-1057 功自检
  154. -- number id: I2C端口号
  155. -- @return nil
  156. function selfTest(id)
  157. setMode(id, 0)
  158. writeRegister(id, KXTJ3_ADDR, KXTJ3_SELF_TEST, 0xCA)
  159. setMode(id, 1)
  160. log.info("on self test axis-x: ", readAxis(id, 'x', 8))
  161. log.info("on self test axis-y: ", readAxis(id, 'y', 8))
  162. log.info("on self test axis-z: ", readAxis(id, 'z', 8))
  163. setMode(id, 0)
  164. writeRegister(id, KXTJ3_ADDR, KXTJ3_SELF_TEST, 0x00)
  165. setMode(id, 1)
  166. log.info("out self test axis-x: ", readAxis(id, 'x', 8))
  167. log.info("out self test axis-y: ", readAxis(id, 'y', 8))
  168. log.info("out self test axis-z: ", readAxis(id, 'z', 8))
  169. end
  170. -------------------------------------- KXTJ3-1057 驱动代码结束 --------------------------------------
  171. --- 初始化配置
  172. -- number id: I2C端口号
  173. -- @return nil
  174. function init(id)
  175. -- 进入配置模式
  176. setMode(id, 0)
  177. -- 复位控制寄存器2
  178. writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG2, 0x86)
  179. -- 配置控制寄存器2 为50HZ
  180. writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG2, 0x06)
  181. -- 配置唤醒延时和唤阈值
  182. writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_COUNTER, 50)
  183. writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_THRESHOLD_H, (1500 - (1500 % 256)) / 256)
  184. writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_THRESHOLD_L, 1500 % 256)
  185. writeRegister(id, KXTJ3_ADDR, KXTJ3_DATA_CTRL_REG, 0x02)
  186. -- 配置控制寄存器1 配置唤中断,(B0010 0010)
  187. writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1, 0x82)
  188. -- 清中断
  189. clearStatus(id)
  190. log.info("KXTJ3C init done: ", "ok!")
  191. end
  192. init(2)