MicroPython ADXL355 加速度计读取数据一直输出-1的解决方法
这段程序一直输出 -1 的原因可能是因为在读取加速度数据时,等待数据准备好的 while 循环条件不正确。应该使用 Pin(22, Pin.IN) 来读取 INT1 引脚的状态,当 INT1 引脚为低电平时,表示有新的数据可以读取。因此,while 循环的条件应该改为 machine.Pin(22, machine.Pin.IN).value() == 0。同时,还需要在初始化 ADXL355 的时候,将 INT1 引脚配置为输出数据准备好的引脚,可以使用 ADXL355_ACT_INACT_CTL 寄存器来配置。具体来说,可以将该寄存器的最高位(位 7)设置为 1,表示将 INT1 引脚配置为输出数据准备好的引脚。修改后的程序如下所示:
import machine
import time
# 定义 ADXL355 寄存器地址
ADXL355_DEVID_AD = 0x00
ADXL355_DEVID_MST = 0x01
ADXL355_PARTID = 0x02
ADXL355_REVID = 0x03
ADXL355_STATUS = 0x04
ADXL355_FIFO_ENTRIES_L = 0x05
ADXL355_FIFO_ENTRIES_H = 0x06
ADXL355_XDATA_L = 0x08
ADXL355_XDATA_H = 0x09
ADXL355_YDATA_L = 0x0A
ADXL355_YDATA_H = 0x0B
ADXL355_ZDATA_L = 0x0C
ADXL355_ZDATA_H = 0x0D
ADXL355_TEMP_L = 0x0E
ADXL355_TEMP_H = 0x0F
ADXL355_SOFT_RESET = 0x1F
ADXL355_THRESH_ACT_L = 0x20
ADXL355_THRESH_ACT_H = 0x21
ADXL355_THRESH_INACT_L = 0x22
ADXL355_THRESH_INACT_H = 0x23
ADXL355_TIME_INACT_L = 0x24
ADXL355_TIME_INACT_H = 0x25
ADXL355_ACT_INACT_CTL = 0x27
ADXL355_FIFO_CONTROL_1 = 0x28
ADXL355_FIFO_CONTROL_2 = 0x29
ADXL355_FIFO_CONTROL_3 = 0x2A
ADXL355_FIFO_CONTROL_4 = 0x2B
ADXL355_INT_MAP1 = 0x2C
ADXL355_INT_MAP2 = 0x2D
ADXL355_FILTER = 0x2C
ADXL355_POWER_CTL = 0x2D
# 定义 ADXL355 片选引脚
cs = machine.Pin(21, machine.Pin.OUT)
cs.value(1)
# 定义 SPI 引脚
sclk = machine.Pin(14, machine.Pin.OUT)
sda = machine.Pin(13, machine.Pin.OUT)
miso = machine.Pin(12, machine.Pin.IN)
spi = machine.SPI(1, baudrate=8000000, polarity=0, phase=0)
# 初始化 ADXL355
cs.value(0)
spi.write(bytes([ADXL355_SOFT_RESET, 0x52]))
cs.value(1)
# 配置 ADXL355
cs.value(0)
spi.write(bytes([ADXL355_POWER_CTL, 0x02]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_ACT_INACT_CTL, 0x8F]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_FIFO_CONTROL_1, 0x00]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_FIFO_CONTROL_2, 0x00]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_FIFO_CONTROL_3, 0x00]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_FIFO_CONTROL_4, 0x00]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_FILTER, 0x03]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_INT_MAP1, 0x00]))
cs.value(1)
cs.value(0)
spi.write(bytes([ADXL355_INT_MAP2, 0x00]))
cs.value(1)
# 读取加速度数据
while True:
# 等待数据准备好
while machine.Pin(22, machine.Pin.IN).value() == 1:
time.sleep_us(10)
cs.value(0)
spi.write(bytes([ADXL355_XDATA_L | 0x80, 0x00]))
data = spi.read(6)
cs.value(1)
x = (data[1] << 8 | data[0]) & 0xFFFF
y = (data[3] << 8 | data[2]) & 0xFFFF
z = (data[5] << 8 | data[4]) & 0xFFFF
# 转换为有符号整数
if x > 32767:
x -= 65536
if y > 32767:
y -= 65536
if z > 32767:
z -= 65536
print('X:', x, 'Y:', y, 'Z:', z)
time.sleep_ms(100)
这段代码将 INT1 引脚配置为输出数据准备好的引脚,并使用 machine.Pin(22, machine.Pin.IN).value() == 0 来判断数据是否准备好了。这样就可以正确地读取 ADXL355 的加速度数据了。
原文地址: https://www.cveoy.top/t/topic/na5f 著作权归作者所有。请勿转载和采集!