This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LDC1101:Raspberry Pi 4 via SPI–所有寄存器0x00或 LHR 数据始终为零

Guru**** 2457760 points
Other Parts Discussed in Thread: LDC1101

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1497652/ldc1101-raspberry-pi-4-via-spi-all-registers-0x00-or-lhr-data-always-zero

器件型号:LDC1101

工具与软件:

大家好!

我目前使用 SPI 与德州仪器(TI)的 LDC1101连接到 Raspberry Pi 4 Model B、但无法实现可靠的通信。 具体来说、我使用的 是 LDC1101 Click (MIKROE-3240)、该按钮上已连接一个线圈。

下面是发生的情况:

  1. 有时、所有寄存器读取为0x00、包括 CHIP_ID 寄存器(应返回0xD4)。 我不确定为什么会发生这种情况、因为我已经进行了连续性测试和环回测试(通过在没有传感器的情况下连接 MISO 和 MOSI)、结果都恢复正常。 有时重新启动会有所帮助、有时则不会。

  2. 当我确实获得了有效的 CHIP_ID 并且 SPI 看起来正常工作时、LHR_DATA 寄存器始终返回零、而 LHR_STATUS 寄存器保持在0x01。

我怀疑我可能忘记配置正确启用 LHR 模式所需的一个或多个关键寄存器。 可能我缺少在 RCOUNT 或 LHR_CONFIG 中设置特定位的写入、但我不确定。

我已经附上了我用来与 LDC110进行通信的 Python 源代码、以及一个 显示 Raspberry Pi 和 LDC1101板之间布线/连接的表。如果有人对此器件和 Pi 上的 SPI 通信有经验、我非常感谢您提供有关导致这些问题的建议。

提前感谢您。

import spidev
import time
import RPi.GPIO as GPIO

# === SPI and GPIO Config ===
SPI_BUS = 0
SPI_DEVICE = 0
SPI_SPEED = 50000  # 50 kHz
SPI_MODE = 0b00    # Mode 0: CPOL = 0, CPHA = 0

CS_PIN = 8   # GPIO8 (CE0)
SCK_PIN = 11 # Clock
MISO_PIN = 9 # MISO
MOSI_PIN = 10 # MOSI

# === LDC1101 Register Addresses ===
REG = {
    "START_CONFIG": 0x0B,
    "RP_SET": 0x01,
    "TC1": 0x02,
    "TC2": 0x03,
    "DIG_CONFIG": 0x04,
    "ALT_CONFIG": 0x05,
    "RP_THRESH_H_MSB": 0x07,
    "RP_THRESH_L_LSB": 0x08,
    "RP_THRESH_L_MSB": 0x09,
    "INTB_MODE": 0x0A,
    "D_CONF": 0x0C,
    "L_THRESH_HI_LSB": 0x16,
    "L_THRESH_HI_MSB": 0x17,
    "L_THRESH_LO_LSB": 0x18,
    "L_THRESH_LO_MSB": 0x19,
    "STATUS": 0x20,
    "RP_DATA_LSB": 0x21,
    "RP_DATA_MSB": 0x22,
    "L_DATA_LSB": 0x23,
    "L_DATA_MSB": 0x24,
    "LHR_RCOUNT_LSB": 0x30,
    "LHR_RCOUNT_MSB": 0x31,
    "LHR_OFFSET_LSB": 0x32,
    "LHR_OFFSET_MSB": 0x33,
    "LHR_CONFIG": 0x34,
    "LHR_DATA_LSB": 0x38,
    "LHR_DATA_MID": 0x39,
    "LHR_DATA_MSB": 0x3A,
    "LHR_STATUS": 0x3B,
    "CHIP_ID": 0x3F,
}

# === Device Constants ===
DEVICE_OK = 0x00
DEVICE_ERROR = 0x01

# Power Modes
ACTIVE_MODE = 0x00
SLEEP_MODE = 0x01
SHUTDOWN_MODE = 0x02

# === SPI Init ===
spi = spidev.SpiDev()
spi.open(SPI_BUS, SPI_DEVICE)
spi.max_speed_hz = SPI_SPEED
spi.mode = SPI_MODE

# === GPIO Init ===
GPIO.setmode(GPIO.BCM)
GPIO.setup(CS_PIN, GPIO.OUT)
GPIO.setup(SCK_PIN, GPIO.OUT)
GPIO.setup(MISO_PIN, GPIO.IN)
GPIO.setup(MOSI_PIN, GPIO.OUT)

# === Helper Functions ===

def write_register(addr, value):
    GPIO.output(CS_PIN, GPIO.LOW)
    spi.xfer2([addr & 0x7F, value])
    GPIO.output(CS_PIN, GPIO.HIGH)

def read_register(addr):
    GPIO.output(CS_PIN, GPIO.LOW)
    resp = spi.xfer2([addr | 0x80, 0x00])
    GPIO.output(CS_PIN, GPIO.HIGH)
    return resp[1]

# === Initialization ===

def initialize_ldc1101():
    chip_id = read_register(REG["CHIP_ID"])
    if chip_id != 0xD4:
        print(f"Unexpected CHIP ID: 0x{chip_id:02X}")
        return DEVICE_ERROR

    write_register(REG["RP_SET"], 0x07)
    write_register(REG["TC1"], 0x90)
    write_register(REG["TC2"], 0xA0)
    write_register(REG["DIG_CONFIG"], 0x03)
    write_register(REG["ALT_CONFIG"], 0x00)
    write_register(REG["RP_THRESH_H_MSB"], 0x00)
    write_register(REG["RP_THRESH_L_LSB"], 0x00)
    write_register(REG["RP_THRESH_L_MSB"], 0x00)
    write_register(REG["INTB_MODE"], 0x00)
    write_register(REG["START_CONFIG"], SLEEP_MODE)
    write_register(REG["D_CONF"], 0x00)
    write_register(REG["L_THRESH_HI_LSB"], 0x00)
    write_register(REG["L_THRESH_HI_MSB"], 0x00)
    write_register(REG["L_THRESH_LO_LSB"], 0x00)
    write_register(REG["L_THRESH_LO_MSB"], 0x00)
    write_register(REG["LHR_RCOUNT_LSB"], 0x00)
    write_register(REG["LHR_RCOUNT_MSB"], 0x00)
    write_register(REG["LHR_OFFSET_LSB"], 0x00)
    write_register(REG["LHR_OFFSET_MSB"], 0x00)
    write_register(REG["LHR_CONFIG"], 0x00)
    time.sleep(0.1)

    return DEVICE_OK

# === Mode Config ===

def set_powermode(mode):
    write_register(REG["START_CONFIG"], mode)

def enable_lhr_mode():
    write_register(REG["LHR_RCOUNT_LSB"], 0x00)
    write_register(REG["LHR_RCOUNT_MSB"], 0x80)
    write_register(REG["LHR_OFFSET_LSB"], 0x00)
    write_register(REG["LHR_OFFSET_MSB"], 0x00)
    write_register(REG["LHR_CONFIG"], 0x01)

# === Data Fetch ===

def read_lhr_data():
    msb = read_register(REG["LHR_DATA_MSB"])
    mid = read_register(REG["LHR_DATA_MID"])
    lsb = read_register(REG["LHR_DATA_LSB"])
    return (msb << 16) | (mid << 8) | lsb

# === Debug ===

def display_all_registers():
    print("=== LDC1101 Register Dump ===")
    for name, addr in REG.items():
        try:
            val = read_register(addr)
            print(f"{name:20s} (0x{addr:02X}): 0x{val:02X}")
        except Exception as e:
            print(f"{name:20s} (0x{addr:02X}): Error: {e}")

# === Main ===

def main():
    if initialize_ldc1101() != DEVICE_OK:
        print("Initialization failed.")
        return

    print("LDC1101 initialized successfully. Switching to LHR mode...")
    set_powermode(ACTIVE_MODE)
    enable_lhr_mode()
    time.sleep(1)

    try:
        while True:
            lhr = read_lhr_data()
            print(f"LHR Data: {lhr}")
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("\nTerminated by user.")
    finally:
        spi.close()
        GPIO.cleanup()

if __name__ == '__main__':
    main()

LDC1101 RPI
PWM 引脚12 (PCM_CLK)
CS 引脚24 (CE0)
SCK 引脚23 (SCLK)
SDO 引脚21 (MISO)
SDI 引脚19 (MOSI)
3V3 引脚17 (3.3V)
GND 引脚25 (GND)