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.

[参考译文] ADS131A04:使用 Arduino 对菊花链中的3个 ADS131A04芯片进行编程

Guru**** 2391415 points
Other Parts Discussed in Thread: ADS131A04

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1222666/ads131a04-programming-3-ads131a04-chips-in-daisy-chain-using-arduino

器件型号:ADS131A04

大家好

我有一种配置、其中3个 ADS131A04芯片采用菊花链配置、第一个芯片处于异步中断模式、另外两个芯片处于同步从模式、以24位字长运行。 我按照设计的数据表配置进行了操作。

我是一名新手、但我很难确定如何根据我的要求编程芯片。 我的目标是读取传入的模拟信号并将其转换为数字、使用 Arduino 在串行监视器(如果可能)中对其进行监控、并将数据保存到文件中以供进一步分析。

下面是到目前为止已有的代码。 我甚至不确定它是否准确。 我能验证的唯一状态是就绪状态、正如我在发送复位命令后在串行监视器上看到的0xFF04。  

为了使 ADC 正常工作、我需要初始化所有的值是什么?

2.如果我在第一个芯片执行一次命令、保持 CS 管脚为低电平、是否会传播到下一个芯片? 如果没有、我将如何在全部3个芯片中执行命令?

3.以下代码是否有效?  

4.我可以做什么来监控/验证命令是否成功执行?

5.在读取转换后的数据时、我从哪些寄存器读取数据?

6.如何输出转换后的数据?

7.如果我只想查看寄存器中的值、我应该发送什么命令?

再次,我是完全新的这一点,任何类型的反馈和建议,感谢. 提前感谢您。

#include

int cs_pin = 8;
int drdy_pin=4;


空 setup()

Serial.begin(115200);

引脚模式(cs_pin、output);
digitalWrite (cs_pin、HIGH);

pinMode (drdy_pin、输入);//通过 Arduino 串行监视器监视 DRDY


}

void loop()

延迟(1000);

SPI.begin();

SPI.beginTransaction(SPISettings(4000000,MSBFIRST,SPI_MODE1));

digitalWrite (cs_pin、low);

延迟(200);

SPI.TRANSMIT (0x00);//RESET 命令
spi.transfer (0x11);
SPI.transfer (0x00);


延迟(1000);

Read_status();

延迟(200);


digitalWrite (cs_pin、HIGH);


延迟(1000);

digitalWrite (cs_pin、low);

SPI.TRANSMIT (0x06);//UNLOCK 命令
spi.transfer (0x55);
SPI.transfer (0x00);


延迟(200);

digitalWrite (cs_pin、HIGH);


enable_adcs ();
Set_gain();

}

void read_status()

STATUS_hi_1 = spi.transfer (0);//读取状态字的第一个字节
STATUS_LO_1 = spi.transfer (0);//读取状态字的第二个字节

STATUS_hi_2 = spi.transfer (0);//读取状态字的第一个字节


STATUS_1=(STATUS_HI_1 <<16)|(STATUS_LO_1 <<8)|STATUS_HI_2;//因为字长是24位?


serial.println (STATUS_1、HEX);

serial.println ("");

延迟(D2);

}


void set_gain()

digitalWrite (cs_pin、low);

//010A AAAA DDDDdd 11h 12h 13h 14h AAaa reg 添加,nnnnn 编号#of regs.

//增益为8 011
//0101 0001 0000 0011
//0x5102 WREG - REG 从11h 开始、n# regs n=3减1、因为从0开始


SPI.TRACE (0x51);//WREG 命令、用于 ADC1 11h 的增益
SPI.transfer (0x04);
SPI.transfer (0x00);


digitalWrite (cs_pin、HIGH);

延迟(200);

digitalWrite (cs_pin、low);

SPI.TRACE (0x52);//WREG 命令、用于 ADC2 12h 增益
SPI.transfer (0x04);
SPI.transfer (0x00);


延迟(200);


digitalWrite (cs_pin、HIGH);

延迟(200);

digitalWrite (cs_pin、low);

SPI.TRACE (0x53);//WREG 命令、用于 ADC3 13h 增益
SPI.transfer (0x04);
SPI.transfer (0x00);

延迟(200);

digitalWrite (cs_pin、HIGH);

延迟(200);

digitalWrite (cs_pin、low);

SPI.TRACE (0x54);//WREG 命令、用于 ADC4 14h 增益
SPI.transfer (0x04);
SPI.transfer (0x00);

延迟(200);

digitalWrite (cs_pin、HIGH);

}

void enable_adcs ()

digitalWrite (cs_pin、low);

延迟(200);
//addr 0Fh 写入0F
//010A AAAA DDdd 11 12 13 14 ADC 1 2 3 4 AAAAA reg add、nnnnnnn no#of regs.

//增益为8 011
//0100 1111 0000 1111
//0x4F0F WREG - REG 从11h 开始,n# regs n=3减1,因为从0开始


用于启用所有 ADC 的 SPI.Transfer (0x4F);//WREG 命令
spi.transfer (0x0F);
SPI.transfer (0x00);

延迟(200);

digitalWrite (cs_pin、HIGH);

延迟(D3);

}

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

    尊敬的 Abhijith:

    欢迎来到 E2E 论坛。

    您是如何连接这3个 ADC 的? 您是否与以下方框图(图96)具有相同的连接? ADS131A04数据表 是您可以首先查看的最佳文档、它可以帮助您了解 ADC 的工作原理、应发送哪些命令以及如何从 ADC 读取数据、 尤其是您应该阅读第10.1.3.1节中的内容、其中包括多个器件的硬件连接和时序。

    1.您需要正确配置 ADC 器件: 通过在 ADC_ENA 寄存器中将 ENA[3]位从默认值0000b 编程为1111b 来启用 ADC 通道、通过对 CLKX 寄存器进行编程来选择时钟源、为所需的数据速率设置 CLK 分频比和过采样率、 发送解锁命令以启用接口并开始与器件通信、等等。

    2.检查下面的多器件配置时序。  假设您采用 菊花链设置、如下面的图96所示。  要通过 DIN 对器件进行编程、您可以使用 单个/CS 信号写入第一个器件。 只要对整个帧进行通信、 它就会在第一个 ADC 上变为活动状态、因此如果您 发送写入 寄存器的命令、它将 立即更新第一个 ADC。  在传输完整个帧后、来自第一个 ADC 的 DONE 信号变为低电平、然后启用第二个 ADC、因此进一步写入的任何内容都将传输到第二个 ADC、相同的步骤将应用于第三个 ADC。

    3.我建议你一步一步地测试,首先捕捉和检查你的时间安排。

    您可以 对寄存器进行编程并从 ADC 读回它、以查看编程是否成功。  

    5和6。 没有寄存器用于读取转换数据。 /DRDY 信号指示新转换结果何时可供检索。 当 DRDY 从高电平转换为低电平时、新转换数据就绪。 null 命令通常用于检索转换数据。 DOUT 中的数据在 SCLK 上升沿移出。

    7.应使用 RREG 命令。 查看 ADS131A04数据表中表13命令定义中的命令

    此致、

    戴尔

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

    尊敬的 Dale:

    感谢您快速而详细的答复。 它有助于澄清我就此提出的几个问题。  我能够根据您提供的信息对芯片进行一些基本配置。

    是的、我按照图96中的配置进行操作。 我参考了数据表以了解相关信息。 我一直有问题是确定如何通过 Arduino 本身发送寄存器值,我能够找出。

    我仍无法确定的一件事是通过一种方法来验证我发送的命令/配置是否已设置到芯片。 我尝试发送 RREG 命令来读取某些寄存器上的值。 当我输出它时、我获得了预期的第一个值、而其余值不符合预期。 这可能是输出格式问题。 我仍在测试它。 如果我能够获得它、我将进行更新。

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

    尊敬的 Abhijith:

    您能告诉我您曾尝试读取哪个寄存器以及发送了什么命令吗?  数字接口的屏幕计时可能有助于理解和解决该问题。

    此致、

    戴尔

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

    大家好、Dale、

    很抱歉这么晚才回复。 下面随附了初始化的寄存器和视为状态的值的屏幕截图。  

    下面是解锁 ADC 的函数:

    void unlock_adcs()
     digitalWrite (cs_pin、low);

        SPI.transfer16 (0x0655);  
        SPI.transfer (0x00);

        
       delayMicroseconds(100);

        SPI.transfer16 (0x0655);  
        SPI.transfer (0x00);

       delayMicroseconds(100);

        SPI.transfer16 (0x0655);
        SPI.transfer (0x00);

       delayMicroseconds(100);

       digitalWrite (cs_pin、HIGH);
       延迟(1)

     digitalWrite (cs_pin、low);
        serial.println ("\nUNLOCK:");
        serial.println (spi.transfer16 (0)、hex);
        SPI.transfer (0x00);
        delayMicroseconds(100);

        serial.println (spi.transfer16 (0)、hex);
        SPI.transfer (0x00);
        delayMicroseconds(100);

        serial.println (spi.transfer16 (0)、hex);
        SPI.transfer (0x00);
        delayMicroseconds(100);

     digitalWrite (cs_pin、HIGH);
    }
    其余的函数也使用相同的格式。 以下是我要发送的命令值  
    复位:0x0011 00
    使能 ADC:0x4F0F 00
    增益:0x7103 0303
    Clk1 divi 比率:0x4D02 00
    Clk2 divi OSR : 0x4E1F 00
    唤醒:0x0033 00
    每条命令之间都有100微秒的延迟。  
    我对我获得的重置、增益、启用和唤醒响应感到困惑。 此外, 我完全依赖 Arduino 串行显示器,因为我没有逻辑分析仪。  
    目前我还有另一个问题、那就是当我发送 NULL 命令来输出数据时、这些数据会如何显示在数据帧中?
    它会按照 STATUS、CH1 DATA、CH2 DATA、CH3和 CH4的顺序  发送、并且是否会通过 DOUT 执行一条 NULL 命令来发送所有数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Abhijith:

    当您向 ADC 发送命令时、无需多次发送。 下面的第一个时序示例显示了使用 WREG 命令将0x02写入 CLK1寄存器、然后、当您在下一帧中发送 NULL 命令时、可以看到 A04 ADC 的响应(COMMAND+DATA):

    下面的第二个时序展示了如何使用 RREG 命令读取 CLK1寄存器、并且 当您在下一帧中发送 NULL 命令时、可以看到命令加上寄存器数据:

    下面是从 A04 ADC、DOUT 读取转换数据的另一个示例:在 DIN 上向 ADC 发送 NULL 命令时、状态字+CH1数据+CH2数据+CH3数据+CH4数据(24位字大小):

    此致、

    戴尔

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

    您好,Dale  

    非常感谢您提供的详细解释。 这就解决了我的很多问题。 我将尝试它、并让您知道它的运行情况。