|
|
@@ -20,14 +20,14 @@ local odr_addr = {0x10, 0x08} -- 设置采样率 100Hz
|
|
|
local mode_addr = {0x11, 0x00} -- 设置正常模式
|
|
|
local int_latch_addr = {0x21, 0x02} -- 设置中断锁存
|
|
|
|
|
|
-local x_lsb_reg = 0x02
|
|
|
-local x_mab_reg = 0x03
|
|
|
-local y_lsb_reg = 0x04
|
|
|
-local y_mab_reg = 0x05
|
|
|
-local z_lsb_reg = 0x06
|
|
|
-local z_mab_reg = 0x07
|
|
|
-
|
|
|
-local active_state = 0x0b
|
|
|
+local x_lsb_reg = 0x02 -- X轴LSB寄存器地址
|
|
|
+local x_msb_reg = 0x03 -- X轴MSB寄存器地址
|
|
|
+local y_lsb_reg = 0x04 -- Y轴LSB寄存器地址
|
|
|
+local y_msb_reg = 0x05 -- Y轴MSB寄存器地址
|
|
|
+local z_lsb_reg = 0x06 -- Z轴LSB寄存器地址
|
|
|
+local z_msb_reg = 0x07 -- Z轴MSB寄存器地址
|
|
|
+
|
|
|
+local active_state = 0x0b -- 激活状态寄存器地址
|
|
|
local active_state_data
|
|
|
|
|
|
|
|
|
@@ -38,29 +38,33 @@ local function logF(...)
|
|
|
end
|
|
|
|
|
|
local function read_xyz()
|
|
|
+ -- 从X轴LSB寄存器(0x02)开始连续读取6字节数据(X/Y/Z各2字节)
|
|
|
i2c.send(i2cId, da221Addr, x_lsb_reg, 1)
|
|
|
- local recv_x_lsb = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- i2c.send(i2cId, da221Addr, x_mab_reg, 1)
|
|
|
- local recv_x_mab = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- local x_data = (string.byte(recv_x_mab) << 8) | string.byte(recv_x_lsb)
|
|
|
-
|
|
|
- i2c.send(i2cId, da221Addr, y_lsb_reg, 1)
|
|
|
- local recv_y_lsb = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- i2c.send(i2cId, da221Addr, y_mab_reg, 1)
|
|
|
- local recv_y_mab = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- local y_data = (string.byte(recv_y_mab) << 8) | string.byte(recv_y_lsb)
|
|
|
-
|
|
|
- i2c.send(i2cId, da221Addr, z_lsb_reg, 1)
|
|
|
- local recv_z_lsb = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- i2c.send(i2cId, da221Addr, z_mab_reg, 1)
|
|
|
- local recv_z_mab = i2c.recv(i2cId, da221Addr, 1)
|
|
|
- local z_data = (string.byte(recv_z_mab) << 8) | string.byte(recv_z_lsb)
|
|
|
+ local recv_data = i2c.recv(i2cId, da221Addr, 6)
|
|
|
|
|
|
+ -- LSB数据格式为: D[3] D[2] D[1] D[0] unused unused unused unused
|
|
|
+ -- MSB数据格式为: D[11] D[10] D[9] D[8] D[7] D[6] D[5] D[4]
|
|
|
+ -- 数据位为12位,需要将MSB数据左移4位,LSB数据右移4位,最后进行或运算
|
|
|
+ -- 解析X轴数据 (LSB在前,MSB在后)
|
|
|
+ local x_data = (string.byte(recv_data, 2) << 4) | (string.byte(recv_data, 1) >> 4)
|
|
|
+
|
|
|
+ -- 解析Y轴数据 (LSB在前,MSB在后)
|
|
|
+ local y_data = (string.byte(recv_data, 4) << 4) | (string.byte(recv_data, 3) >> 4)
|
|
|
+
|
|
|
+ -- 解析Z轴数据 (LSB在前,MSB在后)
|
|
|
+ local z_data = (string.byte(recv_data, 6) << 4) | (string.byte(recv_data, 5) >> 4)
|
|
|
+
|
|
|
+ -- 转换为12位有符号整数
|
|
|
+ if x_data > 2047 then x_data = x_data - 4096 end
|
|
|
+ if y_data > 2047 then y_data = y_data - 4096 end
|
|
|
+ if z_data > 2047 then z_data = z_data - 4096 end
|
|
|
+
|
|
|
+ -- 转换为加速度值(单位:g)
|
|
|
local x_accel = x_data / 1024
|
|
|
local y_accel = y_data / 1024
|
|
|
local z_accel = z_data / 1024
|
|
|
|
|
|
-
|
|
|
+ -- 输出加速度值(单位:g)
|
|
|
return x_accel, y_accel, z_accel
|
|
|
end
|
|
|
|