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.

[参考译文] ADS1220:ADS1220:在不使用 DRDY 的情况下读取数据。 RDATA 问题

Guru**** 2554440 points
Other Parts Discussed in Thread: ADS1220

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/763170/ads1220-ads1220-reading-data-without-drdy-rdata-problem

器件型号:ADS1220

大家好。

我尝试在标准模式下与 ADS1220通信、但没有 DOUT/DRDY 引脚。 我设置寄存器并读取其值、接收有效结果。

现在、我尝试读取温度和电压。 寄存器如下所示:

#define DEFAULT_CONFIG_REG0 0b00000000 // AINP=AIN0、AINN=AIN1、增益1、PGA 启用
#define DEFAULT_CONFIG_REG1 0b00000100 //数据速率:20SPS、正常工作模式、连续转换模式、温度传感器禁用、烧毁禁用
#define DEFAULT_CONFIG_REG2 0b00010000 //内部2.048V 基准电压、同步50Hz 和60Hz 抑制、开关始终打开、IDAC 关闭
#define DEFAULT_CONFIG_REG3 0b00000000 // IDAC1禁用、IDAC2禁用、仅 DRDY

通用代码如下所示:

writeSingleRegister (1、default_config_REG1 &(1 << 1));
int temp = ReadData();
writeSingleRegister (1,default_config_REG1);
int 电压= ReadData();

void writeSingleRegister (uint8_t address、const uint8_t value){
//设置 CS 和其他变量...
SPI.transfer (WREG |(地址<2));
spi.transfer (value);

int32_t ReadData(){
//设置 CS 和其他变量...
SPI.transfer (RDATA);
//读取3个字节

不幸的是、我的代码 未收到任何内容。 变量 temp 和 voltage 均为高位。

我现在无法使用示波器或 LA 测试数据线、但所有这些数据读取似乎都存在一些问题。

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

    欢迎来到 E2E 论坛! 有几个方面需要改变。 我看到的第一件事是缺少 START 命令。 ADS1220在单次模式下加电、并要求在将寄存器设置更改为连续转换模式后发出 START 命令。 发出 START 命令后、ADS1220将开始转换。

    我看到的下一个问题是您写入配置寄存器、然后立即尝试读取结果。 您必须监控 DRDY 或延迟读取转换结果的尝试、直到转换完成。 20sps 时、这将大约为50ms (ADS1220数据表的表11中列出了转换时间)。 如果您不等待转换完成、代码将不断更改寄存器设置、这将重新启动正在进行的转换。 如果这是在循环中、转换将永远不会完成、并且将永远不会有可用的转换结果。

    第三个问题是'readData'函数。 您似乎正在发送 RDATA 命令、但 SPI 通信要求 SPI 主器件再发送三个字节的"虚拟"数据(例如0xFF)、以启动 SPI 时钟以时钟输出数据。 此外、CS 必须在整个通信事务期间保持低电平。

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

    我还面临一些重大问题,无法读取任何有效数据。
    在循环中、我将 REG1设置为测量温度、等待约60ms 并尝试读取值。 接收到的缓冲区看起来随机-例如、 0x04 13 2B 且为常数。 就像它具有与测量相同的东西一样、但测量是一次性完成的、而不是从内部寄存器读取相同和相同的值。 在循环结束时、我再次等待、这一次是1、然后循环重复。
    下面我发布了一些 Arduino 代码、这些代码显示了该过程:

    #include

    #define DEFAULT_CONFIG_REG0 0b00000000 // AINP=AIN0、AINN=AIN1、增益1、PGA 启用
    #define DEFAULT_CONFIG_REG1 0b00000100 //数据速率:20SPS、正常工作模式、连续转换模式、温度传感器禁用、烧毁禁用
    #define DEFAULT_CONFIG_REG2 0b00010000 //内部2.048V 基准电压、同步50Hz 和60Hz 抑制、开关始终打开、IDAC 关闭
    #define DEFAULT_CONFIG_REG3 0b00000000 // IDAC1禁用、IDAC2禁用、仅 DRDY

    #define ADS1220_CS_PIN 1.
    #define PIN_NUM_ADC_PWR 2.
    #define WREG 0x40
    #define RREG 0x20
    #define RDATA 0x10
    #define START 0x08
    #define SPI_MASTER_Dummy_0xFF

    void setup(){
    Serial.begin(115200);
    引脚模式(ADS1220_CS_PIN、输出);
    PinMode (PIN_NUM_ADC_PWR、输出);
    digitalWrite (PIN_NUM_ADC_PWR、LOW);
    延迟(100);
    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode (SPI_MODE1);
    SPI.setClockDivider(SPI_CLOCK_DIV128);

    serial.println ("default_config Write");
    writeSingleRegister (0,default_config_REG0);
    writeSingleRegister (1,default_config_REG1);
    writeSingleRegister (2,default_config_REG2);
    writeSingleRegister (3,default_config_REG3);
    延迟(100);
    serial.println ("default_config read");
    serial.println (readRegister (0)、十六进制);
    serial.println (readRegister (1)、十六进制);
    serial.println (readRegister (2)、十六进制);
    serial.println (readRegister (3)、十六进制);
    serial.println(");
    //确定:阅读我写的内容

    writeCommand( start );
    延迟(1000);
    ReadData();

    void loop(){
    while (1){
    writeSingleRegister (1、default_config_REG1 &(1 << 1));//启用温度传感器
    //如果我在此处添加 START 命令,值开始更改,但仍然看起来是随机的,如"0x4 4-14-3A"、"0x4 4-13-66"。 它不是温度值
    // delay(1);writeCommand( start );
    延迟(60);
    ReadData();
    延迟(1000);

     

    void writeSingleRegister (uint8_t address、const uint8_t value){
    digitalWrite (ADS1220_CS_PIN、低电平);
    SPI.transfer (WREG |(地址<2));
    spi.transfer (value);
    digitalWrite (ADS1220_CS_PIN、HIGH);


    uint8_t readRegister (uint8_t 地址){
    uint8_t 数据;
    digitalWrite (ADS1220_CS_PIN、LOW);
    SPI.transfer (RREG|(address<2));
    数据= SPI.transfer (SPI_MASTER_Dummy);
    digitalWrite (ADS1220_CS_PIN、HIGH);
    返回数据;


    void ReadData(){
    digitalWrite (ADS1220_CS_PIN、LOW);
    serial.print ("\n0x");
    serial.print (spi.transfer (RDATA)、hex);
    serial.print (");
    对于(int i = 0;i < 3;i++、Serial.print ("-")){
    uint8_t data = spi.transfer (spi_master_dummy);
    serial.print (data、hex);


    digitalWrite (ADS1220_CS_PIN、HIGH);

    void writeCommand (uint8_t cmd){
    digitalWrite (ADS1220_CS_PIN、低电平);
    spi.transfer (cmd);
    digitalWrite (ADS1220_CS_PIN、HIGH);

    void setup(){
    Serial.begin(115200);
    引脚模式(ADS1220_CS_PIN、输出);
    PinMode (PIN_NUM_ADC_PWR、输出);
    digitalWrite (PIN_NUM_ADC_PWR、LOW);
    延迟(100);
    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode (SPI_MODE1);
    SPI.setClockDivider(SPI_CLOCK_DIV128);

    serial.println ("default_config Write");
    writeSingleRegister (0,default_config_REG0);
    writeSingleRegister (1,default_config_REG1);
    writeSingleRegister (2,default_config_REG2);
    writeSingleRegister (3,default_config_REG3);
    延迟(100);
    serial.println ("default_config read");
    serial.println (readRegister (0)、十六进制);
    serial.println (readRegister (1)、十六进制);
    serial.println (readRegister (2)、十六进制);
    serial.println (readRegister (3)、十六进制);
    serial.println(");
    //确定:我读了我写的内容

    writeCommand( start );
    延迟(1000);
    ReadData();


    void loop(){
    while (1){
    writeSingleRegister (1、default_config_REG1 &(1 << 1));//启用温度传感器
    //如果我在此处添加 START 命令,值开始更改,但仍然看起来是随机的,如"0x4 4-14-3A"、"0x4 4-13-66"。 它不是温度值
    // delay(1);writeCommand( start );
    延迟(60);
    ReadData();
    延迟(1000);




    遗憾的是、我无法轻松访问逻辑分析仪、也无法测试 MOSI、MISO 上的实际值。

    您还能告诉我在对话准备就绪后读取数据时、只需勾选时钟、以及发送 RDATA 命令时的区别吗? 当没有任何时间延迟时、ADS1220如何知道它应该立即或在一个字节后(因为我正在发送 RDATA)向我发送数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需再读一次我的代码、就能理解我所做的:设置 REG1时出现误传、而不是|。 我正在清除该寄存器。 稍后将进行检查
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michal、

    如您所述、&而不是|将把0x00写入寄存器1。 这绝对是一个问题。

    即使您将 ADS1220置于连续转换模式、上电后的首次转换也需要发出 START 命令来启动转换。 在单次模式下、您需要发出 START 命令来启动每次转换。

    RDATA 命令将始终发出上次完成的转换。 应在 ReadData 函数的末尾添加 CS 高电平。 如果您监控 DRDY、则只需发送 SCLK 即可、而不是发出 RDATA 命令。 DRDY 由高电平转换为低电平表示转换结束。 如果您对环路的时序或转换结束有任何疑问、我建议使用 RDATA 命令。

    此致、
    Bob B