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.

[参考译文] ADS124S08:ADS124S08

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1075823/ads124s08-ads124s08

部件号:ADS124S08

你好  

我正在尝试使用 ADS124s08读取电池的电压  

AVDD = 5V

DVDD = 3.3V  

我正在尝试检查从微控制器到 ADC 的 SPI 通信  

正在使用 WREG 命令编写04h 的数据寄存器,并尝试使用 RREG 命令重新读取数据。 但是,当我使用 RREG 命令并传输 NOP 以获取寄存器值时,错误行上不会反映任何内容。 相反,即使 NOP (00h)也在 MOSI 行中得到反映  

请帮我解决这个问题。  

我已经附加了代码和逻辑分析器文件  

#include <SPI.h>

内部 Cs = 10;
Int miso = 12;
内部模式=11;
内部 SCLK = 13;

UINT8_t 虚拟;
国际一级;
UINT8_t ulDataTx[3];
UINT8_t ulDataRx[3];

SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);

void setup(){
//将您的设置代码放在此处,运行一次:
PinMode (SCLK,输出);
PinMode (mosi,输出);
PinMode (输入错误);
PintMode (cs,输出);
SPI.begin();
SPI.beginTransaction(mySPISettings);
DigitalWrite (CS,低);
延迟(10);
SPI.TRANSFER (0x06);//重置命令
延迟(10);
DigitalWrite (cs,高);
SPI.endTransaction ();
Serial.begin(9600);

延迟(1000);


}

void loo(){
//将主代码放在此处重复运行:
DigitalWrite (CS,低);
延迟(10);
SPI.begin();

SPI.beginTransaction(mySPISettings);

//延迟(10);

//SPI.transfer (0x06);

//延迟(10);

//SPI.endTransaction();


//SPI.beginTransaction(mySPISettings);
延迟(10);
//SPI.transfer (0xAA);
//延迟(10);
//SPI.transfer (0x55);
//延迟(10);
//dummy = SPI.transfer (0x00);
UINT8_t ulDataTx[3];
ulDataTx[0]= 0x40 +(0x04和0x1f);/WREG 命令,用于4小时
ulDataTx[1]= 0x00;
ulDataTx[2]= 0x18;
//selectDeviceCSLow();
SPI.transfer (ulDataTx[0]);
delayMicroseconds (100);
SPI.transfer (ulDataTx[1]);
delayMicroseconds (100);
SPI.transfer (ulDataTx[2]);
//releaseChipSelect();
延迟(10);
//SPI.endTransaction();
//digitalWrite (cs,高);
//延迟(10);

字节 temp2;
字节 temp1;
字节 temp0;
serial.println(temp2);
serial.println(temp1);
serial.println(temp0);
//SPI.beginTransaction(mySPISettings);
//将 CS 设置为低以选择设备:
//digitalWrite (cs,低);
延迟(10);
//向设备发送读取命令以开始读取:
SPI.TRANSFER (0x24);/RREG 命令,用于4小时
SPI.transfer (0x00);
TEMP1 = SPI.TRANSFER (0x00);
serial.println (temp1,十六进制);
//temp0 = SPI.TRANSFER (0x00);
延迟(10);
DigitalWrite (cs,高);
延迟(10);
SPI.endTransaction ();

}

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

    您好,Amugh,

    逻辑分析器镜头和代码非常有用,但您还可以向我发送原理图吗?  有几个注意事项:

    • 确保重置销被拉高。
    • 在尝试通信之前,请确保所有电源针脚均已正确连接并处于额定工作电压。  换言之,AVDD/AVSS 电源以及 DVDD 和 IOVDD 电源必须处于活动状态。  如果其中一个耗材丢失,ADS124S08将保持重置状态,直到所有耗材都处于活动状态。
    • 尽可能简化沟通,直至您取得成功。  例如,不要发送 reset 命令,而是在尝试写入寄存器之前先尝试读取寄存器。  例如,读取设备通电后应具有非零设置的寄存器0 (ID)或寄存器1 (状态)。
    • 验证 MOSI 是否已连接至 ADS124S08上的 DIN 针脚,DOUT/DRDY 是否已连接至 miso。
    • 如果可能,请使用 CS 确保帧保持一致,并且没有任何无关的 SCLKs 可能影响结果。  在循环()函数中,您将 CS 值拉低,然后设置 SPI 参数。  SCLK 可能出现故障。  此外,您不需要在设置和循环功能中设置 SPI。  因此,读取/写入后将 CS 拉高,并在读取/写入前再次将其设置为低。

    此致,

    鲍勃·B

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

    嗨,Bob,  

    感谢您的建议。 我已经实施了所有这些措施。

    现在,我可以写信给寄存器并读回它们的值。 但我在使用 RDATA 命令检索转换数据时遇到问题。  

    我已附上逻辑分析器的原理图,代码和剪刀。 请帮助我解决此问题  

    代码:  

    #include <SPI.h>

    内部 Cs = 10;
    Int miso = 12;
    内部模式=11;
    内部 SCLK = 13;

    UINT8_t 虚拟,temp1;
    UINT8_t i;
    UINT8_t ulDataTx[3];
    UINT8_t ulDataRx[3];

    SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);

    void setup(){
    //将您的设置代码放在此处,运行一次:
    PinMode (SCLK,输出);
    PinMode (mosi,输出);
    PinMode (输入错误);
    PintMode (cs,输出);
    SPI.begin();
    SPI.beginTransaction(mySPISettings);

    Serial.begin(9600);

    写入注册(0x01,0x80);
    延迟(10);
    写入注册(0x02,0x01);
    延迟(10);
    写入注册(0x03, 0x00);
    延迟(10);
    写入注册(0x04,0x5D);
    延迟(10);
    写入注册(0x05,0x10);

    延迟(1000);


    }

    void loo(){

    /*writeReg (0x01,0x80);
    延迟(10);
    写入注册(0x02,0x01);
    延迟(10);
    写入注册(0x03, 0x00);
    延迟(10);
    写入注册(0x04,0x5D);
    延迟(10);
    写入注册(0x05,0x10);*/



    /*延迟(10);
    UINT8_t ManC0 =读数注册(0x00);
    serial.print (“第0个 Val”);
    serial.println (ManC0,十六进制);
    延迟(1);

    UINT8_t val =读数注册(0x05);
    serial.print (“第五个 Val”);
    serial.println (val,hex);
    延迟(1);

    UINT8_t Manc =读数注册(0x01);
    //Serial.println("The value is,Manc);
    serial.print (“第一个 Val”);
    serial.println (manc,hex);
    延迟(1);

    UINT8_t ManC1 =读数注册(0x02);
    //Serial.println("The value is,ManC1);
    serial.print (“第二个 Val”);
    serial.println (ManC1,十六进制);
    延迟(1);

    UINT8_t ManC2 =读数注册(0x03);
    //Serial.println("The value is,Manc2);
    serial.print (“第三个 Val”);
    serial.println (manC2,十六进制);
    延迟(1);

    UINT8_t ManC3 =读数注册(0x04);
    //Serial.println("The value is,Manc3);
    serial.print (“第4个 Val”);
    serial.println (ManC3,十六进制);
    延迟(1);*

    /*for (I=0x00;I<=0x0B;I++)

    serial.println (readReg (i),hex);
    serial.println("");
    }*/

    readData1();

    }

    UINT8_t 读数注册(uint8_t reg)

    DigitalWrite (CS,低);
    延迟(10);

    UINT8_t 编号= 0x20 + REG;
    SPI.transfer (number);
    SPI.transfer (0x00);
    TEMP1 = SPI.TRANSFER (0x00);

    延迟(10);
    DigitalWrite (cs,高);
    延迟(10);

    返回(temp1);
    }

    无效写入注册(uint8_t Regnum, uint8_t data)

    DigitalWrite (CS,低);
    延迟(10);

    UINT8_t ulDataTx[3];
    ulDataTx[0]= 0x40 +(RegNum & 0x1f);
    ulDataTx[1]= 0x00;
    ulDataTx[2]=数据;

    SPI.transfer (ulDataTx[0]);

    SPI.transfer (ulDataTx[1]);

    SPI.transfer (ulDataTx[2]);

    延迟(10);
    DigitalWrite (cs,高);

    延迟(10);
    }

    无效的 readData1()

    字节模板;
    字节 tempb;
    字节 tempe;
    //Serial.println(temp2);
    //Serial.println (temp1);
    //Serial.println(temp0);
    //SPI.beginTransaction(SPISettings(SPEED,MSFIRST,SPI_MODE1);
    //将 CS 设置为低以选择设备:
    DigitalWrite (CS,低);
    延迟(10);
    //向设备发送读取命令以开始读取:
    SPI.transfer (0x12);
    tempe = SPI.transfer (0x00);
    //delayMicroseconds (10);
    tempb = SPI.transfer (0x00);
    //delayMicroseconds (10);
    Tempa = SPI.transfer (0x00);
    延迟(10);
    DigitalWrite (cs,高);
    延迟(10);
    //SPI.endTransaction();
    serial.println("after trans");
    serial.println(temc);
    serial.println(temb);
    serial.println(Tema);
    字节结果=(tempc<<16)|(tempb<8)|(Tema);
    serial.print (“结果:”);
    serial.println (结果,十六进制);
    }

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

    您好,Amugh,

    我看到示意图有几个问题。  一是启动/同步引脚浮动。  当 Low 使用设备命令启动和停止转换时,此引脚将被关闭。  当针脚高时,ADC 将始终处于转换模式。  我建议现在将这根销钉固定到地面上。

    我看到的最大问题和最可能导致问题的问题是 CLK 针脚的连接方式。  CLK 引脚是设备的主时钟引脚,需要连续时钟。  目前,此引脚连接到 SCLK,SCLK 是间歇性的,频率错误。  将此引脚设为接地,以便内部振荡器启动并成为 ADC 的主时钟。

    此致,

    鲍勃·B

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

    嗨,Bob,

    感谢您的建议。 我按照您的建议对原理图进行了必要的更改。 使用 RDATA 命令时,我会在串行监视器上看到数据。 但是,当 AIN0和 AINCOM 引脚都接地时, 将出现941EB (随机)等值,当 AIN0和 AINCOM 之间连接了1.5V 电池时,将生成7FFFFF。 可能出现什么错误?  

    请帮我解决这个问题  

    代码:  

    #include <SPI.h>

    内部 Cs = 10;
    Int miso = 12;
    内部模式=11;
    内部 SCLK = 13;

    UINT8_t 虚拟,temp1;
    UINT8_t i;
    UINT8_t ulDataTx[3];
    UINT8_t ulDataRx[3];

    SPISettings mySPISettings (4000000,MSFIRST,SPI_MODE1);

    void setup(){
    //将您的设置代码放在此处,运行一次:
    PinMode (SCLK,输出);
    PinMode (mosi,输出);
    PinMode (输入错误);
    PintMode (cs,输出);
    SPI.begin();
    SPI.beginTransaction(mySPISettings);

    Serial.begin(9600);

    写入注册(0x01,0x00);
    延迟(10);
    写入注册(0x02,0x0C);
    延迟(10);
    /*writeReg (0x03,0x00);
    延迟(10);
    写入注册(0x04,0x5D);
    延迟(10);*
    写入注册(0x05,0x0A);

    延迟(1000);

    DigitalWrite (CS,低);
    延迟(10);
    SPI.transfer (0x08);
    延迟(10);
    DigitalWrite (cs,高);

    }

    void loo(){

    对于(I=0x00;I<=0x07;I++)

    serial.println (readReg (i),hex);
    serial.println("");
    }

    readData1();

    }

    UINT8_t 读数注册(uint8_t reg)

    DigitalWrite (CS,低);
    延迟(10);

    UINT8_t 编号= 0x20 + REG;
    SPI.transfer (number);
    SPI.transfer (0x00);
    TEMP1 = SPI.TRANSFER (0x00);

    延迟(10);
    DigitalWrite (cs,高);
    延迟(10);

    返回(temp1);
    }

    无效写入注册(uint8_t Regnum, uint8_t data)

    DigitalWrite (CS,低);
    延迟(10);

    UINT8_t ulDataTx[3];
    ulDataTx[0]= 0x40 +(RegNum & 0x1f);
    ulDataTx[1]= 0x00;
    ulDataTx[2]=数据;

    SPI.transfer (ulDataTx[0]);

    SPI.transfer (ulDataTx[1]);

    SPI.transfer (ulDataTx[2]);

    延迟(10);
    DigitalWrite (cs,高);

    延迟(10);
    }

    无效的 readData1()

    字节模板;
    字节 tempb;
    字节 tempe,tempd, tempe;
    //Serial.println(temp2);
    //Serial.println (temp1);
    //Serial.println(temp0);
    //SPI.beginTransaction(SPISettings(SPEED,MSFIRST,SPI_MODE1);
    //将 CS 设置为低以选择设备:
    DigitalWrite (CS,低);
    延迟(10);
    //向设备发送读取命令以开始读取:
    SPI.transfer (0x13);
    tempe = SPI.transfer(0xff);
    //delayMicroseconds (10);
    tempb = SPI.transfer (0xff);
    //delayMicroseconds (10);
    Tempa = SPI.transfer (0xff);
    tempd= SPI.transfer(0xff);
    Tempe = SPI.transfer (0xff);
    延迟(10);
    DigitalWrite (cs,高);
    延迟(10);
    //SPI.endTransaction();
    serial.println("after trans");
    serial.println (tempe,hex);
    serial.println (tempb,hex);
    serial.println (Tempa,十六进制);
    Word 结果=(tempc<<16)|(tempb<8)|(Tema);
    serial.print (“结果:”);
    serial.println (结果,十六进制);
    }

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

    您好,Amugh,

    您是否可以重新向我发送修正后的原理图,以便我验证是否已进行了所有必需的更改?  此外,如果您使用内部参考,则必须在 REFOUT 和 REFCOM 之间设定一个上限,否则参考将不稳定。

    您是否已通过读回寄存器数据来验证寄存器写入是否有效?  此外,在寄存器4中,不要写入使用外部时钟的设置,因此请在此处使用默认设置。

    收集数据时,NOP 命令为0x00,而不是0xFF。  您能给我发送通信中的 Saleae 图解吗?

    此致,

    鲍勃·B