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.

[参考译文] ADS8689:了解 SPI 命令

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/917918/ads8689-understanding-spi-commands

器件型号:ADS8689

你好! 首先、大家好!

这可能很简单、但我在理解 TI 在 ADS8689数据表中使用的符号时遇到了一些问题。

1)操作码应该是32位长[31:0]、但 NOP 示例显示了由于9位地址而产生的33个零的流、那么它是如何工作的?

我假设我们不必为该位发送额外的字节。 我在表格下方读了有关它的注释、但仍然没有得到。

2) X 和下划线是什么意思? 例如、Read_HWORD 命令:

11001_xx_<9位地址>_000000000000_00000000

我想 X 表示"无关"。

最后的3个下划线分隔了字节、但第一个下划线(_xx)会怎么样? 这是延迟、我们是否应该将 CS 拉为高电平、另一个"无关"?

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

    尊敬的 Victor:

    感谢您在 E2E 论坛上提出问题。

    1) 1) NOP 为33零表5是数据表中的错误、NOP 应为32零、这应该在下次更新数据表时修复。

    2) 2)您对"x"的理解是正确的、它可以是"0"或"1"。

    此外、操作码中的所有"x"都可以是 "0"或"1"。 所有"_" 下划线均用于使操作码清晰易懂、当您将命令从控制器发送到 ADC 时没有延迟。 在整个帧期间、/CS 应保持低电平。

    此致

    戴尔

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

    您能不能简单介绍一下我应该如何调用这些命令? 我应该发送5位命令、然后是地址和2个0块吗? 我还不确定要使用哪9位地址? 以选择范围为目标、它是否只是0x14?   

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

    你好!

    这有点令人困惑、但我成功地让它正常工作、这要归功于此库 https://github.com/Helmuthn/ads8689_Arduino/blob/master/ADC_ads8689.cpp

    您发送4个字节。 7位命令<<1 & 0来自表10的第1个、8位寄存器地址(第2个字节)和16位数据(第3个和第4个字节)。 前导0和8位构成9位地址。

    TI 工程师在另一个主题中建议进行此测试:要将 ADC 的输入范围更改为+/-0.625*Vref,请使用代码 D0 14 0004

    如果使用 Helmuthn 的库、则命令为:
    ADC->传输(ADS8689_WRITE_FULL、ADS8689_RANGE_SEL_REG、0x0004);

    在输入悬空和默认范围下、您应获得约36000的读数、而在+-0.625Vref 下、您将获得约53000的读数。

    希望这对您有所帮助、

    电容器。

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

    我实际上一直在尝试使用该库。 我确信所有器件都已正确通电。 我在我的设置中没有得到这些读数。 以下是我的代码和连接如下:

    UC     <>ADC     

    SCLK        SCLK (引脚12)

    MOSI        SDI (引脚10)

    MISO        SDO (PIN 13)*我也有一个此上拉电阻器*

    CS          CS (引脚11)

    #include 
    
    const int CS_PIN = 10;
    
    adc_ads8689 adc = adc_ads8689 (32、10);
    
    void setup (){
    Serial.begin(9600);
    
    adc.transmit (ADS8689_WRITE_FULL、ADS8689_RANGE_SEL_REG、0x0004);
    
    uint8_t bufferItems = adc.inputAvailable();
    
    serial.print ("缓冲区项目=");
    serial.println (bufferItems、DEC);
    
    uint32_t 结果= adc.readBuffer();
    
    serial.print (“DEC 中的结果为:”);
    serial.println (result、dEC);
    serial.print (二进制结果为:”);
    serial.println (result, bin);
    } 

    运行几次后、该代码的输出低于该值、每个值将进行新的运行和读取。

    缓冲区项目= 1.
    DEC 中的结果为:0
    二进制结果为:0


    缓冲区项目= 1.
    DEC 的结果为:447741962


    二进制结果为:11010110000000000001010
    缓冲区项目= 1.
    DEC 的结果为:447741962
    二进制结果为:11010110000000000001010


    缓冲区项目= 1.
    DEC 的结果为:16777220
    二进制结果为:100000000000000000100


    缓冲区项目= 1.
    DEC 的结果为:176160784
    二进制结果为:101010000000000000010000


    缓冲区项目= 1.
    DEC 的结果为:41943048
    二进制结果为:1010000000000000001000


    缓冲区项目= 1.
    DEC 的结果为:16777220
    二进制结果为:100000000000000000100

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

    尊敬的 David:Victor、

    TI.com 上提供了详细说明、请参阅 E2E 论坛上先前的问题和答案:

    ADS8691: 如何读取位[0:15]的寄存器值

    ADS8689:32位寄存器读取命令序列

    确定要读取或写入的寄存器后、可以确认寄存器地址、然后将命令和寄存器地址组合在一起形成一个32位操作码、从而可以向 ADC 发送两个16位操作码或四个8位操作码来实现该操作。

    以下是使用 READ_HWORD 命令读取 ALARM_H_TH_REG 寄存器的16位的示例:

    (位7-0 = 24h 的字节0地址、位15-8 = 25h 的字节1地址、位23-16的字节2地址= 26h、位31-24的字节3地址= 27h)

    1. 使用 READ_HWORD 命令读取寄存器的16位(0~15位):      <11001_xx><0_0010_0100><00000000000><0000000000000000>
    2. 使用 READ_HWORD 命令读取寄存器的16位(16~31位):     <11001_xx><0_0010_0110><00000000000><0000000000000000>

    因此、当您将 ADC 的输入范围配置为+/-2.5Vref 并同时启用内部基准时、您可以使用地址= 14h 的半字写入命令对 Range_SEL_REG 寄存器进行编程:

    <11010_00><0_0001_0100><00000000><00000001>  

    我希望这对您有所帮助。

     

    此致、

    戴尔

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

    但是、如果我使用 READ_HWORD 并查看该寄存器、即使我没有向该寄存器写入任何新值、它也会在每次读取时不断更改。

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

    让我更详细地解释一下。 这是我要做的一系列事情。

    1. 将 CS 引脚拉至低电平
    2. 将  READ_HWORD 发送到 ALARM_H_TH_REG 寄存器- <11001_00><0_0010_0100><00000000><0000000000000000000000000000>
    3. 将 CS 引脚设置为高电平
    4. 将 CS 引脚设置为低电平
    5. 将  READ_HWORD 发送到 ALARM_H_TH_REG 寄存器的第二个字节地址- <11001_00><0_0010_0110><00000000><0000000000000000000000000000>
    6. 存储 SDO 结果
    7. 将 CS 引脚设置为高电平
    8. 打印出该结果

    我每次跑步都会得到不同的结果。 下面是一些示例。

    100000000100000000000000000000000000000000000000000000000000 1000


    1000010100010000000000000000000000000000000000000010


    1001000010001100000000000011


    1000011000001000000000000100


    10011010000000000000000000000000000000000000000000001000


    100000110010000000000000000000000000000000000100

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

    尊敬的 David:

    您能否提供示波器捕获的 SPI 总线时序图? 谢谢。

    此致、

    戴尔