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.

ADS8329 problem

Other Parts Discussed in Thread: ADS8329

from timing description of datasheet, i can't find how to read/write CFR register and  read ADC data. Is there any sample code for ADS8239?

(1) Is it necessary to send read ADC data command every time? and if send cmd and read data is in the same CS/FS valid period?

(2) why the SDO oupput  is so low(about 1.5V, My Vdd is 5V) when i execute the test functions below? Is there any hardware problem?

/*************ADS8329 AD_Converter********************/
unsigned int ads8329_get_data(void)
{
 unsigned char i;
 unsigned int  x = 0;
 
 ADC_CS  = 0;
    ADC_CLK = 0;
 for(i=0; i<16; i++)
 {
     ADC_CLK = 0;
  ads8329_delay(T_DELAY); 

  x<<=1;
  if(ADC_SDO == 1)
  {
     x++;
  }

     ADC_CLK = 1;
  ads8329_delay(T_DELAY);
 }
 
 ADC_CS  = 1;

 x &= 0xffff;

 return (x);
}

 Thanks a lot

  • 首先ADS8329使用的最低SCLK频率为1MHz. 从你的代码看,是用I/O模拟的。不测试过没有,能不能达到这个速度?并且要求,最长在整个转化周期里把数据读完。上面代码,你用了delay函数,不知延时多长。

    问题1:是的,每次读去时,都要在SDI上写入1101b;

    问题2:显然SDI总线上并没有出现数据。

    你的代码只有SDO读取的部分。如果可以,推荐用MCU的SPI总线读去。

    另外,每一位数据输出是在SCLK的下降沿读数据。上面的代码,在第一个SCLK下降沿之前,就读了一位数据。

  • 1. 1MHz  时钟问题,没太注意,需要确认一下。

    2. 每次读数时,都要在SDI上写入1101b,这个意思是CS 拉低后,先在SDI上写4个Clk ,也就是1101(还是16个clk?),这个时候CS 不拉高,继续开始发16个clk读数据吗?这次读取到的数据是上次转换的数据吗?

    unsigned int ads8329_get_data(void)
    {
         unsigned char i;
         unsigned int  x = 0;
        

        ADC_CS  = 0;
        ADC_CLK = 0;
       

      for(i=0; i<4; i++)        //send read command or for(i=0; i<16; i++) 
     {

        ADC_CLK = 0;
        ads8329_delay(T_DELAY); 

        ADC_SDI = 0xD>>(3-i)& 0x1;   //ADC_SDI = 0xD000>>(15-i)& 0x1;  

        ads8329_delay(T_DELAY); 

         ADC_CLK = 1;
     }

    //这儿CS需要变化吗?

    for(i=0; i<16; i++)
     {
       ads8329_delay(T_DELAY); 

         ADC_CLK = 0;

    ads8329_delay(T_DELAY); 

      x<<=1;
      if(ADC_SDO == 1)
      {
         x++;
      }

      ADC_CLK = 1;
     }
     
     ADC_CS  = 1;

     x &= 0xffff;

     return (x);
    }

     

    3.  想使用#INT输出到处理器,需要修改内部寄存器,内部寄存器的读写方式跟读数据是一样的吗?默认是自动trigger模式吗?

    谢谢!

     

  • 代码貌似有问题。不知你用的是哪款MCU,但推断时钟可能达不到1MHz.

    程序要求,在读取数据的16个clk中,前四个clk要向SDI写入1101b,是与读前四个数据同时进行的。而不是先写1101b,再读16个数据。

    请认真阅读datasheet中12-14页中的时序图,严格按时序图写程序。

  • 问题3:

    请参照datasheet中31页READING THE CONFIGURATION REGISTER。时序是一样的,只是不用CONVST引脚,也没有EOC/INT信号输出。

    命令的前四位为1100b。此时输出数据的前四位,是上一次的数据转化结果。后十二位是CFR寄存器的值。