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.

ADS1259 SPI Issues

Other Parts Discussed in Thread: ADS1259

Dear Support,

I am having issues with the ADS1259.  On power up I initialize a PIC24 Micro after it is initialized, it calls an ADS1259_INIT() routine.  In the routine, I send the SDATAC command so I stop continuous mode,I then update the Delay registers, and then the sampling rate.

I then read back the registers and I don't get any response from the ADS1259.  At first I suspected the SPI module on the PIC24H, then the compiler generating wrong code.  I decided to eliminate two variables by soldering a wire right at the DOUT pin of the ADS1259, and what i found is that no data comes out of the chip at all.

If I put ADS1259_INIT() in a loop of 8 iterations, and repeat this 8 times, the ADS1259 responds on the 3 to 8 trial (all randomly).  I am convinced the compiler is generating the correct code, and the PIC24 SPI module does not have an Errata on the SPI module.

This leaves me with the issue why doesn't the ADS1259 responds on the first trial?  I am worried I will have to loop 6 time to get a sample reliably.  That would be bad!

I have posted the pictures on a different thread, but I am not sure if the thread is closed now

http://e2e.ti.com/support/data_converters/precision_data_converters/f/73/p/340776/1290980.aspx#1290980

Also, the voltage level VOH is around 2.8V. I expected it to be 3.3V since VDDIO is 3.3V.  The datasheet says the voltage typical is 0.75*VDD.  That is a bit strange though it seems to work fine when it finally responds.


I need to use this ADC in the mode of non-continuous sampling.  I want to orchestrate when to get the samples.

Can someone help me troubleshoot this part?  3 different boards are behaving the same way.  So I don't think it is ESD damage.  It is likely I don't know the correct sequence?

What SPI clock frequency should I be using?  I am using 6.57MHz now.  I can go up or down.  I have tried 1MHz, and anywhere in between up to 10MHz.


Below is the code I am using to initialize the part. spi_xfer() is a compiler defined Canned function for quick development.  It sends data, and number of bits to send.  It is extremely easy to use.  I have monitored the input and output of the SPI with a logic analyzer, and indeed, the ADS1259 doesn't respond on the first trial.

If I put this function in a loop of 8 trials it will respond.  This is just too weird.

void Init_ADS1259(void)
{
    signed int32 TempReg[2];
    unsigned char OpCode1 = 0, OpCode2 = 0, RegData1 = 0, RegData2 = 0; 
    unsigned int32 ADS1259_DATAREG = 0;
   
    //RESET THE PART JUST IN CASE
    output_low(ADS1259_nRST_nPWRDN_PIN);
    delay_ms(10);
    output_high(ADS1259_nRST_nPWRDN_PIN);
    
    output_low(ADS1259_CS_N_PIN);                                   //ADS1259 Chip Select High!
    
    spi_xfer(ADS1259,ADS1259_SDATAC,8);                             //Send Stop Data Control Command SDATAC     (sends 0x11)
    
OpCode1 = (ADS1259_WREG | ADDR_CONFIG1); //Select Write command starting from Config1 Opcode2 = 0x01; //Select CONFIG1, and CONFIG2 RegData1 = ADS1259_DLY3; //Create Data to Config1 DELAY<2:0> RegData2 = (ADS1259_PULSE_CTRL | ADS1259_DR7); //Create Data to Config2 DR<2:0> ADS1259_DATAREG = make32(OpCode1,Opcode2,RegData1,RegData2); //Compose the Opcode and Data command 0x41010317 spi_xfer(ADS1259,ADS1259_DATAREG,32); //Write the Data to the ADS1259, DATA, #of bits output_high(ADS1259_CS_N_PIN); //ADS1259 Chip Select High! output_low(ADS1259_CS_N_PIN); //ADS1259 Chip Select High! TempReg[0] = spi_xfer(ADS1259,0x200000,24); //Read back CONFIG1, and CONFIG2 OpCode1 = ADS1259_RREG | ADDR_CONFIG1; //Select Read command starting from Config1 ADS1259_DATAREG = make32(OpCode1,OpCode2,0x00,0x00); //Compose the commands 0x21010000 TempReg[1] = spi_xfer(ADS1259,ADS1259_DATAREG,32); output_high(ADS1259_CS_N_PIN); //ADS1259 Chip Select High! output_low(ADS1259_START_PIN); //START Pin Low - No conversions! output_high(ADS1259_nRST_nPWRDN_PIN); //ADS1259 RESET_N & PWRDN_N Set high }