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.

[参考译文] ADS131M08:ADS131M08帮助! 配置问题- Raspberry PI 4b

Guru**** 657930 points
Other Parts Discussed in Thread: ADS131M08, ADS131M08EVM, ADS131M04
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1263595/ads131m08-ads131m08-help-configuration-issues---raspberry-pi-4b

器件型号:ADS131M08
主题中讨论的其他器件:ADS131M04

大家好、不久前我购买了一款 ADS131M08EVM 进行测试、但现在我需要跳出舒适区、并使用 Raspberry Pi 4b 通过电路板开始实现。 我想使用 Raspberry Pi 4b 通过 SPI 以 Python 语言编程来控制 ADS131M08。 我的目标是从读取寄存器开始、使用数据表中提供的默认值作为基础。

 

我不确定我的代码是否结构良好、

代码:

导入 spidev
将 rpi.gpio 导入为 GPIO
导入时间

类 ads131m08 ():
# ADS131M08命令
命令={
'CMD_NULL':[0b00000000、0b00000000]、#请求 ADS 样本
'CMD_RESET_DEVICE':[0b00000000、0b00010001]、#重置设备
'CMD_STANDBY':[0b00000000、0b00100010]、
'CMD_WAKEUP':[0b00000000、0b00110011]、
'CMD_LOCK':[0b00000000、0b10101010]]、
'CMD_UNLOCK ':[0b00000000、0b11001010]、
'CMD_RREG':[0b10100000、0b00000000]、#读取寄存器
'CMD_WREG':[0b01100000、0b00000000]、#写寄存器

DEF _init__(self、SyncResetGpio、DrdyGpio、DeviseSpi、cs、 SCLK=12000000):

# SPI 配置
self.spi = spidev.SpiDev ()
self.spi.open (DeviseSpi、cs)
self.spi.max_speed_Hz = SCLK
self.spi.mode = 1
self.spi.lsbfirst = False #默认值

# ADS131M08工作模式1
self.chEnable = 8
# GPIO 配置
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(DrdyGpio、gpio.in)#要读取引脚--> DrdyState = GPIO.input(DrdyGpio)
GPIO.setup(SyncResetGpio、GPIO.out)#写入引脚高电平=停用、低电平=激活--> GPIO.output (SyncResetGpio、GPIO.low)
# gpio.output (SyncResetGpio、gpio.high)
GPIO.setup(self.ChEnable、GPIO.out)

GPIO.OUTPUT (SyncResetGpio、GPIO.low)
时间睡眠(1)
GPIO.OUTPUT (SyncResetGpio、GPIO.high)

默认 ID (自):
GPIO.Output (self.chEnable、GPIO.low)
respons = self.spi.xfer2 ([0xA0、0x01、0x00])#发送地址为0x01 (STATUS)的读取命令
GPIO.Output (self.chEnable、GPIO.high)
打印("status:"、respons)
时间睡眠(1)

默认关闭(自):
self.spi.close()

DEF 反转(自):
print ("将位反转以使用模式3作为模式1")

ADS = ads131m08 (22、24、0、01000000)
尝试:
While True:
ads.id()

除了键盘中断:
ads.close()
gpio.clean()


结果:

状态:[255、40、0]

状态:[224、1、0]

状态:[5255、0]

状态:[224、1、0]

状态:[5255、0]

状态:[224、1、0]

状态:[5255、0]

状态:[224、1、0]

状态:[5255、0]

状态:[224、1、0]

对于同一个命令,我收到了各种响应,但没有一个像预期的那样---0x500h。

用于--> respons = self.spi.xfer2([0xA0, 0x00, 0x00])

结果:状态:[255、40、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

状态:[40、1、0]

对于同一个命令,我收到了各种响应,没有一个是预期 ID --> 0x28XXh。

用于--> respons = self.spi.xfer2([0xA0, 0x03, 0x00])

结果:

状态:[255、40、0]

状态:[224、3、0]

状态:[5255、0]

状态:[224、3、0]

状态:[5255、0]

状态:[224、3、0]

状态:[5255、0]

状态:[224、3、0]

状态:[5255、0]

对于同一条命令,我收到了各种响应,但没有一个响应符合预期-->0xFF0Eh。







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

    您好、 

    您能否提供以下信息?

    1. SCLK、/CS、DIN、DOUT 和/DRDY 的时序图? 对于每个寄存器读取、两个帧的时序都很好、因为寄存器数据将在第二个帧中移出。
    2.  Raspberry Pi 4b 的信号连接。
    3. 电源连接。
    4. EVM 上的跳线配置。

    数据表在93-94页有一个代码示例、可作为您的参考。

    此致、

    戴尔

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

    大家好、晚上好。 感谢您的答复。 我将在第一次捕获后连接我的信号。 使能信号正确无误;我只能绘制4个信号、因此图表中没有包括使能信号、但我确认其正确无误

    详情从+90us 至+40us:

    我将仅进行传输、并且响应来自 ADS。 但发送数据后、我读取我发送的字节数(从+2us 到+5us 进行了详细说明)

    详细信息从+2us 到+5us:

    这是我的当前代码;我实施了中断、如数据表第93-94页的示例所示

    代码:

    导入 spidev
    将 rpi.gpio 导入为 GPIO
    导入时间

    类 ads131m08 ():
    # ADS131M08命令
    命令={
    'CMD_NULL':[0b00000000、0b00000000]、#请求 ADS 样本
    'CMD_RESET_DEVICE':[0b00000000、0b00010001]、#重置设备
    'CMD_STANDBY':[0b00000000、0b00100010]、
    'CMD_WAKEUP':[0b00000000、0b00110011]、
    'CMD_LOCK':[0b00000000、0b10101010]]、
    'CMD_UNLOCK ':[0b00000000、0b11001010]、
    'CMD_RREG':[0b10100000、0b00000000]、#读取寄存器
    'CMD_WREG':[0b01100000、0b00000000]、#写寄存器

    DEF _init__(self、SyncResetGpio、DrdyGpio、DeviseSpi、cs、 SCLK=12000000):

    # SPI 配置
    self.spi = spidev.SpiDev ()
    self.spi.open (DeviseSpi、cs)
    self.spi.max_speed_Hz = SCLK
    self.spi.mode = 1
    self.spi.lsbfirst = False #默认值

    # ADS131M08工作模式1
    self.chEnable = 8
    self.DrdyGpio_init = DrdyGpio
    # GPIO 配置
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(9、gpio.in、pull_up_down=gpio.pud_down)#下拉以消除噪声问题

    GPIO.setup(self.DrdyGpio_init、gpio.in)#要读取引脚--> DrdyState = GPIO.input(DrdyGpio)

    GPIO.setup(SyncResetGpio、GPIO.out)#写入引脚高电平=停用、低电平=激活--> GPIO.output (SyncResetGpio、GPIO.low)
    # gpio.output (SyncResetGpio、gpio.high)
    GPIO.setup(self.ChEnable、GPIO.out)

    GPIO.OUTPUT (SyncResetGpio、GPIO.low)

    time.sleep (0.000125)

    GPIO.OUTPUT (SyncResetGpio、GPIO.high)

    DEF DrdyInterrup (自、通道):
    """如果 GPIO.input(self.DrdyGpio_init)== GPIO.LOW:"""
    self.id()

    默认 init_interrup (self):
    #初始化中断

    GPIO.add_event_detect (self.DrdyGpio_init、GPIO.falling)
    GPIO.add_event_callback (self.DrdyGpio_init、self.DrdyInterrup)

    默认 Cali (自):
    TX_DATA =[0x00、0x00、0x00]#要发送的数据
    self.spi.writebytes (TX_DATA)
    TX_DATA =[0x00、0x00、0x00]#要发送的数据
    self.spi.writebytes (TX_DATA)
    TX_DATA =[0x00、0x00、0x00]#要发送的数据
    self.spi.writebytes (TX_DATA)

    默认 ID (自):
    # gpio.output (self.chEnable、gpio.low)

    #调整信号。
    adrress = 0x01 # ID、使其成为通用读取函数的参数。

    TX_DATA =[0xA0、地址、0x00]#要发送的数据
    self.spi.writebytes (TX_DATA)
    self.spi.writebytes (TX_DATA)
    self.spi.writebytes (TX_DATA)

    rx_data = self.spi.readbytes (len (3 * TX_DATA))#读取与发送的字节数相同的字节数
    # print ("已收到回复:"、rx_data)
    # gpio.output (self.chEnable、gpio.high)

    默认关闭(自):
    self.spi.close()

    DEF 反转(自):
    通过
    # print ("将位反转以使用模式3作为模式1 ")

    尝试:
    ADS = ads131m08 (22、24、0、012000000)
    ads.cali ()
    ads.init_interrup ()
    While True:
    通过

    除了键盘中断:
    ads.close()
    gpio.clean()

    连接:

    观察原理图、我从3V3_LP 获取电源输入、并将其连接到 Raspberry Pi 上的3V3电源引脚(引脚1)。 我将 GND 连接到 Raspberry Pi 上的接地引脚(引脚39)。

    进行了以下连接:

    • SYNC/RESET 至 GPIO22
    • DIN 至 GPIO10 -引脚19
    • DIGITAL .CLK -未连接
    • CS 至 GPIO8 -引脚24
    • SCLK 至 GPIO11 -引脚23
    • DRDY 至 GPIO24 -引脚18
    • DOUT 至 GPIO9 -引脚21
    • GND -引脚39
    • VCC -引脚1

    首先、我没有修改 ads131m08evm 电路板。 默认时钟为8192MHz。 我的初始目标是按照数据表正确读取寄存器、以验证数据是否准确。 非常感谢您提前提供的帮助。 此致

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

    您好、 

      检查时间并不容易。 下面是在 ADS131M04 上捕获的用于读取 CFG 寄存器(0x06地址)的时序示例、该寄存器已写入0x0700以在上一步中使用默认延迟来启用全局斩波模式。 如您所见、寄存器数据(0x0700)在第二帧的 DOUT 线路上成功移出、无需检查和等待/DRDY 信号。

    您能否向我展示您的时间安排、以便我能够轻松读取数据?  

    当您将 EVM 上的3V3_LP 连接 到 Raspberry Pi 上的3V3电源引脚时 ,DII 上有一根跳线,用于将 JP12的引脚1和2短接? 此外、您是否为 EVM 上 ADC 的 DVDD 供电?

    此致、

    戴尔

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

    下午好! 我将详细介绍我所做的更新。 为了实现更好的时钟和计时精度、我修改了代码、仅在 Raspberry Pi 4B 上使用 Pigpio。 我将 SPI 频率配置为2 MHz;我不确定这个频率是否正确。 数据表指定了25 MHz 的最大 SPI 时钟频率、但未提及最小频率。 ads131m08可以工作的已知最低频率是多少?

    我使用的是一个简单的8通道25Ms/s 逻辑分析仪。 因此、我将使用的频率为2 MHz、我想确认它是否正确。

    我编辑了我的代码、以读取 ID 和状态寄存器、以及读取广告的所有通道、并实现了此链接中所述的时序: ADS131M08:DRDY 不会变为低电平-数据转换器论坛-数据转换器- TI E2E 支持论坛

    ADS131M08EVM 电源:我根据数据表中的此说明进行了外部电源连接:


         



    Código:  

    进口鸽子
    导入时间

    ads131m08 ():

    #地址寄存器地址131
    寄存器={
    'ID'0x00
    '状态'0x01
    'Mode'0x02
    'Clock'0x03
    'gain1'0x04
    'gain2'0x05
    'CFG'0x06
    'thrshld_msb'0x07
    'thrshld_lsb'0x08
    'ch0_cfg'0x09
    'ch0_ocal_msb'0x0A
    'ch0_ocal_lsb'0x0b
    'ch0_FCAL_MSB'0x0C
    'ch0_FCAL_lsb'0x0D
    'ch1_cfg'0x0E
    'CH1_ocal_MSB'0x0F
    'ch1_ocal_lsb'0x10
    'CH1_FCAL_MSB'0x11
    'CH1_FCAL_lsb'0x12
    'ch2_cfg'0x13
    'CH2_ocal_msb'0x14
    'ch2_ocal_lsb'0x15
    'CH2_FCAL_MSB'0x16
    'CH2_FCAL_lsb'0x17
    'ch3_cfg'0x18
    'CH3_ocal_MSB'0x19
    'ch3_ocal_lsb'0x1A
    'CH3_FCAL_MSB'0x1b
    'CH3_FCAL_lsb'0x1C
    'Ch4_cfg'0x1D
    'CH4_ocal_MSB'0x1E
    'ch4_ocal_lsb'0x1f
    'CH4_GCL_MSB'0x20
    'CH4_FCAL_lsb'0x21
    'Ch5_cfg'0x22
    'Ch5_ocal_MSB'0x23
    'Ch5_ocal_lsb'0x24
    'Ch5_GCL_MSB'0x25
    'Ch5_FCAL_lsb'0x26
    'Ch6_cfg'0x27
    'Ch6_ocal_MSB'0x28
    'Ch6_ocal_lsb'0x29
    'Ch6_FCAL_MSB'0x2A
    'Ch6_FCAL_lsb'0x2B
    'ch7_cfg'0x2C
    'CH7_ocal_MSB'0x2D
    'ch7_ocal_lsb'0x2E
    'CH7_FCAL_MSB'0x2F
    'CH7_FCAL_lsb'0x30
    'regap_crc'0x3E
    'Resserved'0x3F

    DEF _init__(selfSyncResetGpio、DrdyGpio、DeviseSpi、cs、 SCLK=12000000):
    self.pi = pigpio.pi ()# iniciar PIGPIO
    # SPI 配置
    self.spi = self.pi.spi_open (cs、SCLK、1)

    self.DrdyGpio_init = DrdyGpio
    #配置密码
    self.pi.set_mode(SyncResetGpiopigpio.output)
    self.pi.set_mode(self.DrdyGpio_initpigpio.input)

    self.pi.write (SyncResetGpio0)
    time.sleep (0.000125)
    self.pi.write (SyncResetGpio1)

    DEF CMD_RESET (SELF):
    self.pi.wait_for_edge (self.DrdyGpio_initpigpio.FALLING_EDGE0)
    TX_DATA =[0x000x110x00、0x00、0x00、 0x000x000x000x00、0x000x000x000x000x00、0x000x000x000x000x00、0x000x000x000x000x00、0x000x000x000x000x000x00]#数据名称环境
    RX_DATA = self.pi.spi_xfer (self.SPITX_DATA)#读取输出
    print ("reset:"rx_data)

    DEF CMD_READ_reg (selfkey):
    REG = self.register.get (key)

    #self.pi.wait_for_edge (self.DrdyGpio_init、pigpio.FALLING_EDGE、0)
    antes = time.time_ns ()
    while self.pi.read (self.DrdyGpio_init):
    如果 time.time_ns()- antes >= 10
    中断

    TX_DATA =[0xA0reg、0x00、0x00、0x00、 0x00]#帧24位默认值。
    RX_DATA = self.pi.spi_xfer (self.SPITX_DATA)
    打印("registric leido:"rx_data)

    DEF CMD_WRITE_reg (selfkey、data):
    REG = self.register.get (key)

    DEF CMD_READ_ADS_ALL_CHANNEL (SELF):

    #self.pi.wait_for_edge (self.DrdyGpio_init、pigpio.FALLING_EDGE、0)
    antes = time.time_ns ()
    while self.pi.read (self.DrdyGpio_init):
    如果 time.time_ns()- antes >= 10
    中断

    TX_DATA =[0x00]* 27 #读取状态寄存器+通道1 +通道2 +通道3…… 通道8
    RX_DATA = self.pi.spi_xfer (self.SPITX_DATA)#读取输出
    print ("canales leidos:"rx_data)

    默认关闭():
    self.pi.spi_close (self.spi)
    self.pi.stop()

    尝试
    ADS = ads131m08 (2224、0、02000000)
    PEPE = 1
    峰值:
    #ads.cmd_reset()
    时间睡眠(1)
    ads.cmd_read_reg ('id')
    ads.cmd_read_reg ("状态")
    ads.cmd_read_ads_all_channel ()
    PEPE = 0


    除了键盘中断
    ads.close()




    随附了您请求的时间图形。

    时间轴图-读取 ID 寄存器




    第二个样片:

    时间轴图-读取 状态寄存器

    第二个样片:


    时间图形读取所有 ADC 通道

    第二个样片:

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

    尊敬的 Celeste GONZALEZ CANTERO

    当您的 SCLK 频率为2MHz 时、一个时钟周期为0.5us。 如果要读取所有通道的数据、并且 数据大小为24位、 一个周期具有一个状态字+8个通道数据+ CRC 字、则一个周期的最短时间为(1+8+1)*24*0.5us=120us、因此应将数据速率限制为1/120US=8.3ksps ( 忽略其他延迟)。

    除了第1次计时外、很难看到您的计时。 读取 ID 寄存器的命令是正确的、您的应该能够在第二帧中获得 ID 寄存器的数据、请查看下面刚刚在 M08EVM 上捕获的时间。 下面的第二帧中的0x2801是 M08 ADC 中 ID 寄存器的数据。

    要读取 ID 寄存器的第1个帧:

    读取 ID 寄存器的第2帧:

    我无法清楚地看到您读取地址为01h 的状态寄存器的时序、但是您似乎是向 ADC 发送0xA001命令、这是不正确的、正确的命令是0xA080。 请仔细检查您的命令。

    顺便说一下、如果禁用了输入 CRC (默认)、您只需要发送24个 SCLK 来从 ADC 读取寄存器、而不需要48个 SCLK、并且您只需要在第二个采样/帧中发送 NULL (全零)。 请在上一篇文章中查看我的计时情况。

    我无法在您读取所有通道数据的计时中看到详细信息、因此我无法进行检查。

    此致、

    戴尔