yylooker 发表于 2011-8-15 18:56:26

有人用过ADS1247么?进来帮忙看看

ADS1246.1247.1248大概一个系列的,做过的都帮下忙吧!!这个片子网上的资料真少。

本人用F169与ADS1247通讯,阵脚关系如下:
MSP430F169            ADS1247
P3.1(SIM0)------------DIN(主出从进)
P3.2(SOMI)------------DOUT(主进从出)
P3.3(UCLK0)-----------SCLK(SPI时钟)
P3.4--------------------START
P3.5--------------------reset(低电平有效,重置)
P3.6--------------------cs(低电平有效,芯片选择位)
P3.7--------------------DRDY(低电平有效,转换结束标识位)


尝试过用硬件SPI和软件模拟SPI,与1247通讯,但是无法读到正确的寄存器值(先写入,再读出);具体表现是:SCLK有信号,DIN有信号,但是DOUT完全是一个低电平。读ADC结果时,同样无法获得正确数值,全部为0


下边是SPI初始化程序。
// ADS1247初始化
void Init_ADS1247(void)
{
   // 初始化MSP430与ADS1247的通信端口
   P3SEL |= ADS_SCLK + ADS_Din + ADS_Dout;         // Setup P3 for SPI mode
   P3DIR |= ADS_CS;
   
   ADS_CS_0;
   delay_AD( 10* delay_1ms);
   ADS_Power_OFF;
   delay_AD( 20* delay_1ms);
   ADS_Power_On;
   delay_AD( 20* delay_1ms);
   
   init_SPI();

   ADS_WriteByte(SELF0CAL);                        //自我偏移校准
   delay_AD(delay_1ms);
   
   //多路复用器控制寄存器0:00000001,BIT7-6开路电流源断开,
   //BIT5-3正极输入管道AIN0,BIT2-0负极AIN1
   WriteReg_S(Reg_MUX0 , 0x01);
   
   //偏置电压寄存器:00000000,偏置电压选择关闭
   WriteReg_S(Reg_VBias , 0x00);
   
   //多路复用器控制寄存器1:00110000,BIT7启用内部晶振,
   //BIT6-5内部参考电压总是启动,BIT4-3ref0默认为片上基准,BIT2-0默认模式
   WriteReg_S(Reg_MUX1 , 0x30);//0x70 外部时钟
   
   //系统控制寄存器:0000000,BIT7必须设为0,
   //BIT6-4 PGA1倍增益,BIT3-0 ADS输出速率为默认(5SPS)
   WriteReg_S(Reg_SYS0 ,0x00);
   
   //IDAC控制寄存器1:00000000,BIT7-4只读,BIT3 DRDY/DOUT针脚只DOUT;BIT2-0 关闭内部恒流源
   WriteReg_S(Reg_IDAC0 , 0x00);
}

yylooker 发表于 2011-8-16 09:07:35

没有人用过1247这个系列的片子么。。

yylooker 发表于 2011-8-19 09:04:15

自我偏移校准 这个指令发了,DADY脚极短时间内跳高了一次,但是查看datastreet,数据率5的情况下,大概需要3s多的时间。。真不明白这是接到了,还是没接到。。。

MCUAVR 发表于 2011-8-19 09:37:51

回复【2楼】yylooker
-----------------------------------------------------------------------

我用过ADS1256,但转换结果不线性,没找到原因,占时放到,当时SPI通信也是搞了一阵,后来能读数据了,发现要将SCLK在一次操作完后,置成低电平。如果是硬件SPI则(SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        //时钟悬空为低)

另,记得有个脚可以输出时钟(DO/CLKOUT),不知你那个片子有没有,测试时,写相当寄存器,可以改变这个脚的输出频率,如查频率可控制了,那写入的数据就正确了。

参考程序:(注:测试能转换,读写数据,但转换结果不线性,???)


平台: MDK   
MCU:STM3272MHz


#define DCLK       12        //PD
#define CS         8   //PD
#define DIN      10        //PD
#define DOUT       11        //PD
#define AD_RD      9   //PD
/**/
#define DCLK_H(GPIOD->ODR |= (1<<DCLK))
#define DCLK_L(GPIOD->ODR &= ~(1<<DCLK))

#define CS_H    (GPIOD->ODR |= (1<<CS))
#define CS_L    (GPIOD->ODR &= ~(1<<CS))

#define DOUT_H(GPIOD->ODR |= (1<<DIN))
#define DOUT_L(GPIOD->ODR &= ~(1<<DIN))

#define DOUT_pinGPIOD

void delayad_nopar(void)
{
        u16 i = 500;
           while(i--);
}

//在SCLK的下降沿,系统通过DIN向ADSl256发送数据; ??
//而在SCLK的上升沿,系统则通过DOUT从ADSl256读取数   ??
// *****************************************************************************
// Function Name: ads1256_wr
// Description    : SPI写数据
// Input          : None
// Output         : None
// Return         : None
// *****************************************************************************

void SendSPIByte(u8 num)
{
   u8 count=0;

    DCLK_L;   
   for(count=0;count<8;count++)
   {
       if((num&0x80)==0)
              DOUT_L;    //pd10
       else DOUT_H;
       
         DCLK_H;      
         delayad_nopar();
         DCLK_L;         
         delayad_nopar();
       num<<=1;
   }
    //CS_H();
}

// *****************************************************************************
// Function Name: ads1256_rd
// Description    : SPI 读数据
// Input          : None
// Output         : None
// Return         : None
// *****************************************************************************
u8 GetSPIByte(void)
{
        u8 i=8,d;   
        DCLK_L;
           while(i--)
          {
                   d <<=1;       
             DCLK_H;
                   delayad_nopar();
                   DCLK_L;       
                delayad_nopar();
                DOUT_H;
                  if(GPIO_ReadInputDataBit(DOUT_pin, GPIO_Pin_11) != 0)
                  d |= 0x01;
                  else
                  d &= 0xfe;                                  
        }

      
           return d;
   
}







//-----------------------写数据到选择的寄存器中-----------------------------

void write_register(u8 addr,u8 date)
{
       u8 i,j;
       u8 send[] = {0x50,0x00,0x00};
       send |= addr;
       send |= date;
       j=3;
       while(R_AD);
       for(i=0;i<j;i++)
       {
          SendSPIByte(send);
       }

}

//-----------------------从选择的寄存器中读出寄存器中的数据-----------------------------

u8 read_register(u8 addr)
{
       u8 i,j;
       u8 send[] = {0x10,0x00};
       send |= addr;
       j=2;
          while(R_AD);
       for(i=0;i<j;i++)
       {
              SendSPIByte(send);
       }
       for(i=0;i<183;i++);
       
       send=GetSPIByte();
       return send;
}

yylooker 发表于 2011-8-19 18:35:54

回复【3楼】MCUAVR
-----------------------------------------------------------------------

我试试每次操作完成将SCLK置成低电平,看看效果。

这个1247片子没有输出时钟(DO/CLKOUT)。

lqsamj 发表于 2011-8-20 00:33:26

顶下

yylooker 发表于 2011-8-22 10:45:15

最近修改了下 电路,然后改动了下软件
将SPI配置为CKPL,然后发送单次转换RDATA指令,DRDY阵脚能检测到高低变换,然后能收到一个固定的数据(7FFFFF);不发送指令,一直为0
这是不是可以认为这个转换-接受结果的过程成功了??(注:未配制测量电路,AIN0与AIN1悬空)



但是读写寄存器没有理想的结果
比如说将MUX0设置为0x01,读取的话接受不到有效数据(一直0x00);读取FSC2(此寄存器默认0x40),还是读不到。。

谁能给个建议,我应该从哪方面查找原因呢???

songzh1436 发表于 2011-10-11 19:05:25

最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读不出来。

songzh1436 发表于 2011-10-11 19:22:37

最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读出来FF。

marshallemon 发表于 2011-10-11 19:30:54

用过ADS124x系列的,郁闷的是读AD转换值都正常了,但读写入的寄存器死活不对,建议LZ参考TI的ADS1247 DEMO板上的测试程序

songzh1436 发表于 2011-10-11 20:04:34

现在的情况和lz一样的

banqiukeji 发表于 2013-2-25 20:45:51

现在这个问题解决没有

JamesErik 发表于 2013-2-25 21:04:27

ti的部分ad芯片在读取之前需要设置读取模式,连续读取或者一次一个字

zhcj66 发表于 2013-4-22 17:01:00

songzh1436 发表于 2011-10-11 19:22 static/image/common/back.gif
最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读出来FF。 ...

我读出的数据是0XFF80000x000000这连个数变化,请问你的调通了吗?

zhcj66 发表于 2013-4-22 17:04:27

marshallemon 发表于 2011-10-11 19:30 static/image/common/back.gif
用过ADS124x系列的,郁闷的是读AD转换值都正常了,但读写入的寄存器死活不对,建议LZ参考TI的ADS1247 DEMO ...

我是写入存储器数据正常,读出正常,配置了一个1ma的恒流,不正常,读取AD值不正常,请问你的ADS1247/6/8搞定了吗?http://www.amobbs.com/thread-5530199-1-1.html这是我的帖子

roguebear2012 发表于 2013-6-20 18:48:05

这么多年了。。。 想问一个问题。。这个芯片如果使用内部基准。clk接地。 上电后vref脚输出就是2.5v 还是说要用软件初始化?现在焊了2块vref都没有电压。
不知道坏了没有

z708875378 发表于 2013-6-24 15:35:11

roguebear2012 发表于 2013-6-20 18:48 static/image/common/back.gif
这么多年了。。。 想问一个问题。。这个芯片如果使用内部基准。clk接地。 上电后vref脚输出就是2.5v 还是说 ...

是2.048V而不是2.5V吧,这个是需要设置寄存器的,默认的情况下是上电之后不开启内部基准,要打开内部基准要配置MUX1寄存器的,可以仔细看下手册,有说明。
页: [1]
查看完整版本: 有人用过ADS1247么?进来帮忙看看