搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 2011-8-15 18:56:26 | 显示全部楼层 |阅读模式
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);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-8-16 09:07:35 | 显示全部楼层
没有人用过1247这个系列的片子么。。

出0入0汤圆

 楼主| 发表于 2011-8-19 09:04:15 | 显示全部楼层
自我偏移校准 这个指令发了,DADY脚极短时间内跳高了一次,但是查看datastreet,数据率5的情况下,大概需要3s多的时间。。真不明白这是接到了,还是没接到。。。

出0入0汤圆

发表于 2011-8-19 09:37:51 | 显示全部楼层
回复【2楼】yylooker
-----------------------------------------------------------------------

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

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

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


平台: MDK   
MCU:  STM32  72MHz


#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_pin  GPIOD

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[0] |= addr;
         send[2] |= 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[0] |= addr;
         j=2;
          while(R_AD);
         for(i=0;i<j;i++)
         {
              SendSPIByte(send);
         }
         for(i=0;i<183;i++);
       
         send[0]=GetSPIByte();
         return send[0];
}

出0入0汤圆

 楼主| 发表于 2011-8-19 18:35:54 | 显示全部楼层
回复【3楼】MCUAVR  
-----------------------------------------------------------------------

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

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

出0入0汤圆

发表于 2011-8-20 00:33:26 | 显示全部楼层
顶下

出0入0汤圆

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



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

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

出0入0汤圆

发表于 2011-10-11 19:05:25 | 显示全部楼层
最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读不出来。

出0入0汤圆

发表于 2011-10-11 19:22:37 | 显示全部楼层
最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读出来FF。

出0入85汤圆

发表于 2011-10-11 19:30:54 | 显示全部楼层
用过ADS124x系列的,郁闷的是读AD转换值都正常了,但读写入的寄存器死活不对,建议LZ参考TI的ADS1247 DEMO板上的测试程序

出0入0汤圆

发表于 2011-10-11 20:04:34 | 显示全部楼层
现在的情况和lz一样的

出0入0汤圆

发表于 2013-2-25 20:45:51 | 显示全部楼层
现在这个问题解决没有

出500入0汤圆

发表于 2013-2-25 21:04:27 来自手机 | 显示全部楼层
ti的部分ad芯片在读取之前需要设置读取模式,连续读取或者一次一个字

出0入53汤圆

发表于 2013-4-22 17:01:00 | 显示全部楼层
songzh1436 发表于 2011-10-11 19:22
最近调1247遇到的问题和lz类似,我dout有电平输出,但是寄存器的值读出来FF。 ...

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

出0入53汤圆

发表于 2013-4-22 17:04:27 | 显示全部楼层
marshallemon 发表于 2011-10-11 19:30
用过ADS124x系列的,郁闷的是读AD转换值都正常了,但读写入的寄存器死活不对,建议LZ参考TI的ADS1247 DEMO ...

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

出0入0汤圆

发表于 2013-6-20 18:48:05 | 显示全部楼层
这么多年了。。。 想问一个问题。。这个芯片如果使用内部基准。clk接地。 上电后vref脚输出就是2.5v 还是说要用软件初始化?  现在焊了2块vref都没有电压。
不知道坏了没有

出0入0汤圆

发表于 2013-6-24 15:35:11 | 显示全部楼层
roguebear2012 发表于 2013-6-20 18:48
这么多年了。。。 想问一个问题。。这个芯片如果使用内部基准。clk接地。 上电后vref脚输出就是2.5v 还是说 ...

是2.048V而不是2.5V吧,这个是需要设置寄存器的,默认的情况下是上电之后不开启内部基准,要打开内部基准要配置MUX1寄存器的,可以仔细看下手册,有说明。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 22:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表