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.

[参考译文] ADS131M06:通过 Python 对 SPI 进行编程

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1177161/ads131m06-programming-spi-via-python

器件型号:ADS131M06

您好!

我目前正在习惯我的 Thesis 的第一个 SPI-ADC。

我遇到的问题是、我可以向 ADC 发送和接收消息、但我无法找到每个接收消息发送了多少数据。 此外、我无法获取有关接收到的消息中哪些位数据正在传入的信息。 数据表在"典型通信帧"一章中指出、始终发送来自模拟通道的数据的帧以及 rreg 命令的以下答案。 这是我的问题开始的地方。 如何从数据表中获取每条消息的位数、以便在下一条消息中接收"所有内容"。

对于上下文,我正在等待!DRDY 引脚,然后再接收和发送数据。 我的 MCU 是 RaspberryPi 3B+、主时钟由其 PWM 引脚提供2048000Hz 频率。 我正在使用 SPIDEV 库来累积通信帧。

我们非常感谢您的帮助、开放源码论坛对您帮助不大、我在这个问题上停留了大约2周。

提前感谢、

C. Naumer

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

    尊敬的 Christian:

    我不确定我是否完全理解了您的问题。 我想您所说的"消息"实际上是一个帧、它从/CS 的下降沿开始、到/CS 的上升沿结束。 您想知道 ADC 发送的帧中有多少数据、还想知道转换数据在帧中的起始位置或转换数据的位、如果我的理解不正确、请纠正。

    您能否向我展示您捕获的时序、包括/CS、SCLK、DIN 和 DOUT? 此外、如果您启用了输入 CRC、请告诉我您的字大小、该字大小可通过对模式寄存器中的 WLENGTH[1:0]位进行编程来配置。 谢谢。

    此致、

    戴尔

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

    您好 Dale、

    您的理解非常正确。 我正在寻找 Dataframe 的构造、因此我可以从 SPI "消息"中获取模拟数据。 我不确定我是否使用我的小程序进行了正确测试。 我没有操作任何寄存器(我只尝试读取它们)、因此它就像出厂设置。 据我所知、它不包括 CRC、字长应为24位?

    显示了我使用 Oszilloscope 测量的时序图的视图:

    此外、我不确定我是否必须执行启动操作。 在测量暂停或启动后、我读取了2次模拟数据寄存器以将其清除。 由于我正在使用库"SPIdev"在 python 中进行编程、因此我认为读取寄存器2时间意味着、我通过发送 NULL 读取两条消息、然后发送一条 rreg 命令来进行读取。 我的此计划如下所示:

    #imports
    import time
    import spidev
    import RPi.GPIO as GPIO
    
    # clk is a mini class to generate a Master-Clock signal over a PWM Pin
    import clk as clk
    
    #includes all Commands for the ADS131M06
    #and also a function which gets two hex numbers and gives back the "Message" for send
    from ADS131_Command import *
    
    adcC = ADS131_Command()
    
    #settings
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(17,GPIO.FALLING)
    
    spi = spidev.SpiDev()
    
    spi.open(0,0) 
    spi.mode = 0b01
    spi.max_speed_hz = 2048000
    spi.lsbfirst = False
    
    def send(msg):
        while True:
            if GPIO.event_detected(17):
                #print("send some Data")
                spi.writebytes(msg)
                break
        
    def receive(n):
        while True:
            if GPIO.event_detected(17):
                #print("receive some Data")
                respbin= 0
                resp = spi.readbytes(n)
                
                for i in resp:
                    respbin = respbin<<8
                    respbin = respbin+i
                        
                print(bin(respbin))
                break
            
    if __name__ == '__main__':
        clk.clock_en(True)
        send([0b1010, 0b0001])
        receive(24)
        spi.close()
        clk.clock_en(False)

    我得到了有关"首次使用"帧编程的提示、但我没有尝试使其运行。 目前、复杂性仍然令人不知所措。

    提前感谢您的帮助。

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

    尊敬的 Christian:

    感谢您提供更多信息。

    是的、字大小为24位、默认情况下禁用 ADC 输入端的 CRC、但输出 CRC 始终显示在 输出帧的末尾、不能禁用它。 如果未使用输出 CRC、您的微控制器可以忽略数据。 在一个帧中、 如果您没有在前一帧中读取或写入寄存器、则应该能够在开头看到状态寄存器数据、后跟4通道转换数据和 CRC 字、因此您需要在一帧中总共192个 SCLK (24+24+24+24+24+24+24+24+24+24+24+24+24+24)。 现在、您仅在一个帧中发送4个字节=32个 SCLK。  

    最后、我想您说的是"首次收集数据或暂停数据收集后收集数据"。 您可以使用数据表中第8.5.1.9.1节介绍的两种方法之一。清除 FIFO 并将 ADC 输出与主机控制器重新对齐。 如果控制器控制此引脚、则可以使用/SYNC/RSTn 引脚、也可以读取数据两次、而不是使用 /SYNC/RSTn 引脚。

    此致、

    戴尔