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 always sends zeroes back during data reads, but registers read fine.

Part Number: ADS124S08


I've got a system with several ADS124S08 devices connected to a Kintex7 FPGA.  SPI is running at 12.5MHz (slower makes no difference).  Each device shares CS/DIN/SCK, but has its own dedicated DOUT pin connected to the FPGA.  In the target application, single shot conversions are desired, though the speed of those conversions is not really important. 

IOVDD=3.3V

DVDD=3.3V

CLK = 3.3V logic 4.096MHz clock from FPGA

RESET=3.3V

AVDD = +2.5V

AVSS = -2.5V

REFN0= 0V

REFP0 = 2.5V

START/SYNC = 0V

DRDY= floating

CS/DIN/SCK/DOUT connected to FPGA through resistor, 3.3v logic.  DOUT has an on-fpga pullup resistor enabled.

As a basic test, I've configured the ADS124S08 to read the on die temperature sensor, with PGA enabled at gain of 1.  This should give some data to read without caring about the inputs yet.  Trying various sampling rates does change the behavior of DRDY/DOUT line, but always results in all-zero data. 

Test register config:


        constant ADS124S08_REGMAP_DEBUG_USING_INTERNAL_TEMPERATURE_SENSOR : ADS124S08_REGMAP_T:=(
        X"00", -- ID
        X"00", -- STATUS   : Clear power-on-reset flag
        X"01", -- INPMUX
        X"C8", -- PGA      : Maximum settling time, PGA enabled, 1x gain
        X"EB", -- DATARATE : Global chop enabled, external clock, single shot, 1000samples/second
        X"10", -- REF    
        X"00", -- IDACMAG
        X"FF", -- IDACMUX
        X"00", -- VBIAS  
        X"51", -- SYS    : use internal temperature sensor as data source, 8 sample calbiration, no spi timeout, with crc, no status byte
        X"00", -- OFCAL0
        X"00", -- OFCAL1
        X"00", -- OFCAL2
        X"00", -- FSCAL0
        X"00", -- FSCAL1
        X"00", -- FSCAL2
        X"00", -- GPIODAT
        X"00"  -- GPIOCON        
        );

Please see captured waveforms using saleae logic to open the file here:

https://drive.google.com/file/d/1j6fNTROt7RuhNDG9zIZKk6qooRoInuyI/view?usp=sharing

I can successfully read the power-on default register contents and verify against datasheet, so the SPI communication seems to be OK.  I can also write to the registers and read back to verify the new contents. DOUT/DRDY combo pin transitions from high to low after some time which is dependent on sampling rate, but the subsequent toggling of CLK for a  results in all-zero responses from ADS124S08.

Any input on this issue is welcome.  

Thanks,

zis

  • Hi Zisimos,

    Please note that we cannot access Google drive files due to our internal firewall, can you please post the logic analyzer pictures in a subsequent post? I am not sure what you have shared so far, but it will be helpful to see the state of SCLK, CS, DOUT and DIN pins when you write a register and read back results, when you start conversions initially (you seem to see DOUT/DRDY toggling) and when you start conversions after selecting the temp sensor.

    Also if you have a schematic to share that will be helpful.

    Please note that with all 3x CS pins tied together you will not be able to configure each ADC individually i.e. they will all share the same configuration settings. I just wanted to confirm that this is the intended behavior.

    -Bryan

  • Hi Zisimos,

    Two more points for you:

    1. The max SCLK speed you can use on the ADS124S08 is 10 MHz, whereas you are using 12.5 MHz. Please reduce the SCLK speed or the device will not functional as expected
    2. You have set the FSC register to all zeroes in the configuration settings provided above. Note that this register is the gain scaling value, and as such is multiplied by the conversion result. So if FSC=0, then you are multiplying the conversion result by 0, so it would make sense that this is what you are seeing on the output. Specifically check out the default value of FSC[23:16] on pg. 84, as well as section 9.3.14.2 on pg. 57 for more information

    -Bryan

  • Good catch!

    I've corrected the two issues that you picked up on, now using SCLK=5MHz and correctly using the FSC registers (not changing from default values).

    Now the results of the conversions are nonzero but distributed strangely.  Tried using on die temperature sensor source and also DVDD/4 test source.  Both behave in the same way: Conversion results are either very  close to 0x000000 or very close to 0xFFFFFF.


    Some labeled logic analyzer captures are attached.  Here is a dump of the SPI traffic with some annotations.  For ease of implementation, 32bit transfers are always used and unneeded values are filled with NOP (0x00).

    Will share a partial schematic as needed, but the connections are as shown in the first post, and all analog inputs are floating (connected to analog switches which are all open), using DVDD/4 for input source.



    Time MOSI MISO Notes
    5.2E-08 0x02000000 0x00000000 WAKE command ( fresh power-on for all chips)
    1.005E-05 0x20000000 0x00000800 dumping registers
    2.005E-05 0x21000000 0x00008000 dumping registers
    3.005E-05 0x22000000 0x00000100 dumping registers
    4.005E-05 0x23000000 0x00000000 dumping registers
    5.005E-05 0x24000000 0x00001400 dumping registers
    6.005E-05 0x25000000 0x00001000 dumping registers
    7.005E-05 0x26000000 0x00000000 dumping registers
    8.005E-05 0x27000000 0x0000FF00 dumping registers
    9.005E-05 0x28000000 0x00000000 dumping registers
    0.00010005 0x29000000 0x00001000 dumping registers
    0.000110052 0x2A000000 0x00000000 dumping registers
    0.00012005 0x2B000000 0x00000000 dumping registers
    0.00013005 0x2C000000 0x00000000 dumping registers
    0.00014005 0x2D000000 0x00000000 dumping registers
    0.00015005 0x2E000000 0x00000000 dumping registers
    0.00016005 0x2F000000 0x00004000 dumping registers
    0.00017005 0x30000000 0x00000000 dumping registers
    0.00018005 0x31000000 0x00000000 dumping registers
    0.00019005 0x41000000 0x00000000 write
    0.000199848 0x21000000 0x00000000 readback
    0.00020985 0x4300C800 0x00000000 write
    0.00021965 0x23000000 0x0000C800 readback
    0.00022965 0x4400EB00 0x00000000 write
    0.00023945 0x24000000 0x0000EB00 readback
    0.00024945 0x49009200 0x00000000 write
    0.00025925 0x29000000 0x00009200 readback
    0.000269448 0x08270000 0x000000FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.038572438 0x00000000 0x00000309 direct read conversion result with CRC
    0.038583838 0x08270000 0x000003FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.076886834 0x00000000 0x000021E7 direct read conversion result with CRC
    0.076938434 0x08270000 0x000021FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.115241432 0x00000000 0x0000348C direct read conversion result with CRC
    0.11525283 0x08270000 0x000034FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.15355583 0x00000000 0x00001070 direct read conversion result with CRC
    0.15360743 0x08270000 0x000010FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.191910424 0x00000000 0x00001070 direct read conversion result with CRC
    0.191921822 0x08270000 0x000010FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.230225018 0x00000000 0x00000715 direct read conversion result with CRC
    0.230276616 0x08270000 0x000007FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.268579608 0x00000000 0xFFFFFA14 direct read conversion result with CRC
    0.268591008 0x08270000 0xFFFFFAFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.306894002 0x00000000 0x0000041C direct read conversion result with CRC
    0.3069456 0x08270000 0x000004FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.345248394 0x00000000 0x0000194F direct read conversion result with CRC
    0.345259794 0x08270000 0x000019FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.383562782 0x00000000 0xFFFFFA14 direct read conversion result with CRC
    0.38361438 0x08270000 0xFFFFFAFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.421917568 0x00000000 0xFFFFF125 direct read conversion result with CRC
    0.421928968 0x08270000 0xFFFFF1FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.460231956 0x00000000 0x00001070 direct read conversion result with CRC
    0.460283556 0x08270000 0x000010FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.498586538 0x00000000 0x00000F2D direct read conversion result with CRC
    0.498597938 0x08270000 0x00000FFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.536900922 0x00000000 0x00001D53 direct read conversion result with CRC
    0.536952522 0x08270000 0x00001DFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.575255512 0x00000000 0xFFFFED71 direct read conversion result with CRC
    0.575266912 0x08270000 0xFFFFEDFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.613569902 0x00000000 0xFFFFFD01 direct read conversion result with CRC
    0.613621502 0x08270000 0xFFFFFDFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.65192449 0x00000000 0x00001662 direct read conversion result with CRC
    0.65193589 0x08270000 0x000016FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.690239078 0x00000000 0xFFFFCD91 direct read conversion result with CRC
    0.690290678 0x08270000 0xFFFFCDFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.728593864 0x00000000 0xFFFFEA64 direct read conversion result with CRC
    0.728605266 0x08270000 0xFFFFEAFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.766908256 0x00000000 0x0000041C direct read conversion result with CRC
    0.766959856 0x08270000 0x000004FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.805262848 0x00000000 0x00001848 direct read conversion result with CRC
    0.805274248 0x08270000 0x000018FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.843577246 0x00000000 0x00000309 direct read conversion result with CRC
    0.843628844 0x08270000 0x000003FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.881931836 0x00000000 0x00001177 direct read conversion result with CRC
    0.881943236 0x08270000 0x000011FF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.920246228 0x00000000 0xFFFFFE08 direct read conversion result with CRC
    0.920297828 0x08270000 0xFFFFFEFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’
    0.95860082 0x00000000 0xFFFFEA64 direct read conversion result with CRC
    0.95861222 0x08270000 0xFFFFEAFF START + READ + READLENGTH=1 BYTE + NOP. Reading a register which ends in ‘1’

  • Hi Zisimos,

    How are you determining when new conversion data is ready? Since you have not connected the DRDY pin, you must be polling DOUT/DRDY I assume? I did not see any of these transactions in the data you sent (maybe in the zoomed out images, but I cannot see the details of the SPI lines).

    Also, from the table you have provided above, there seems to be a ~38ms delay from the START command being issued to data being read out. But you have set the data rate to 1000 SPS, which should give you a response within ~3 ms using the sinc3 filter and single-shot conversion mode. Can you clarify what is going on here?

    -Bryan

  • Hi Zisimos,

    After reviewing this some more internally, I see now that you are using the maximum delay setting (4096*tMOD) as well as global chop mode, so the 38.3ms makes sense. Please note that this reduces your effective data rate from 1000 SPS to 26 SPS.

    Have you checked that the external reference voltage is valid into your system? You said you were using a 2.5V external VREF, have you measured this voltage at the REFx0 pins on the ADC to make sure you are actually applying 2.5V to these pins?

    Also, make sure that the VREF buffer on REFP0 is disabled, since it is identical to the supply (VREF = AVDD = 2.5V). The buffer will not be able to drive all the way to the supply rail (AVDD), so the VREF voltage might droop even if there is 2.5V at the pin.

    You should also understand that the coding scheme on the ADS124S08 is bipolar using binary 2's complement. So the values you are seeing e.g. FFFFEDh are not close to full-scale but a very low voltage negative value (-5.6uV). So the values you are seeing are all very close to 0V, both positive and negative.

    -Bryan

  • I've figured out the issue.  G_CHOP being enabled was resulting in a near-zero value. 

    Is the chop function averaging x and -x instead of x and -(-x)?  Or maybe chopping doesn't work with these internal test sources?

    After disabling G_CHOP, both DVDD/4 and internal temperature sensor sources result in roughly the expected values. 

    Not a big deal, I can implement chopping on the host side.

    Thanks for your many good suggestions!

  • Hi Zisimos,

    I am glad you were able to find the issue. Since the DVDD/4 and temp sensor measurements are meant to be purely diagnostic and therefore relatively coarse measurements, they bypass the chopping functionality within the device (apologies for overlooking this in the description you gave). So, if you wanted to perform these diagnostic measurements, you would just turn chop off. For the precision signal measurements, you can absolutely use the chopping feature to reduce offset and offset drift, as well as a small reduction in noise due to additional averaging.

    Please let us know if you have any more questions on the ADS124S08. If they are unrelated to this specific topic, please start a new thread and I will answer your question there.

    -Bryan