微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS1247驱动程序

ADS1247驱动程序

时间:10-02 整理:3721RD 点击:

下面一段关于ADS1247的驱动程序,不知道是否正确,还请各位大神指点一下,,,

 

 

 

void ADS_WriteByte(unsigned char WriteData)       //写一个字节数据
{
  unsigned char i;  
  ADS_CS_0;
 ADS_SCLK_0;
 Delay(10);
  for(i = 0 ; i < 8 ;i++)  
  {  
    if (WriteData & 0x80)
      ADS_Din_1;  
    else
      ADS_Din_0;
  ADS_SCLK_1;     
       Delay(1);
    WriteData = WriteData << 1 ;    
    ADS_SCLK_0;
 
  }  
     ADS_CS_1;
}

 

void ADS_Reset()                           //复位ADS1247
{
  ADS_WriteByte(Reset);
  delay_AD(30000);//延时大于0.6ms
}

 

void ADS_Init(void)                      //AD初始化
{

 ADS_Reset();                                        //首先复位AD,其次向指定寄存器写操作命令
 
 //Multiplexer Control Register 0
  WriteReg_S(Reg_MUX0 | 0x40 , 0x00 , 0x01);          // 设置AD0(9脚)为+,AD1(10脚)为-
 
 
 //Bias Voltage Register
  WriteReg_S(Reg_VBias | 0x40 , 0x00 , 0x00);          //默认值

 
 //Multiplexer Control Register 1
  WriteReg_S(Reg_MUX1 | 0x40 , 0x00 , 0x00);  //     //Bit7:启用内部晶振,Bit6-5:外部基准2.5V,Bit2-0:普通模式

 
 //System Control Register 0
  WriteReg_S(Reg_SYS0 | 0x40 , 0x00 ,0x09);   //     //Bit7:必须设置为0,Bit6-4:选择1倍增益,Bit3-0:选择2000SPS测量速度

 
 //IDAC Control Register 0
  WriteReg_S(Reg_IDAC0 | 0x40 , 0x00 , 0x08); //Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源

}
 


 

 

signed long ReadAds1247Data(void)   //读AD数据
{
  
  unsigned char i;
 unsigned char WriteData=0x12;//读一次数据命令
  unsigned long r=0;
 signed long rr=0;

  while ((rP2_IN & ADS_Dout) == 0x02);

  ADS_CS_0;
 ADS_SCLK_0;
 
  for(i = 0 ; i < 8 ;i++)    //发送读一次数据命令(发送读数据命令)   
  {  
    if (WriteData & 0x80)
      ADS_Din_1;  
    else
      ADS_Din_0;
  ADS_SCLK_1;
  Delay(1);     //延时1uS
    WriteData = WriteData << 1 ;    
    ADS_SCLK_0;
 
  }  
     
 
    ADS_Din_1; 
 for(i=0;i<24;i++)//在24个工作时钟的作用下,DOUT输出24位数据高位在前,即读取DOUT数据,同时对DIN进行空操作(拉高)
    {    
      ADS_SCLK_1;
   Delay(1);//延时1uS
      r=r<<1;
      if (rP2_IN&ADS_Dout)
    r++;    
   ADS_SCLK_0;
 
  }    
 
   ADS_CS_1;       

  // 转换输出格式为直接二进制,有符号位
  if(r & 0x800000)         //判断是正数还是负数
  {                     
 
  r =(r-0x000001)^ 0xffffff;
    fushu=1;
     } 
   else
   {
   fushu=0;
   }
  rr=r;
  
  return rr;//返回数据
}

 


void ADC_initPort() //AD端口初始化    CS:P2^4片选(4脚)   DIN:P2^3向AD发送数据(5脚), SCK:P2^2时钟口(6脚),  DOUT:P2^1来自AD的数据(7脚)
{

 
 rP2_CFG = P21_IO|P22_IO|P23_IO|P24_IO;//端口配置成I/o模式
 rP2_DIR = P22_OUT|P23_OUT|P24_OUT;//P2^2输出,P2^3输出,P2^4输出 ,P2^1输入(默认)
 rP2_OUT = BIT2|BIT3|BIT4;//第2位,第3位,第4位置1
 
}

 

写得挺规范, 建议找 bug 还是请你的调试器帮忙吧

有去实验过么?  建议用示波器观察接口时序跟数据手册里面的想比较

我用示波器看了,没有采样开始到采样结束的时间间隔不是很固定

还有我想问ADS1247可以连续读取数据的,如何实现,,,

肯定可以连续读取数据的,具体实现请参考数据手册 Figure 76. Read Data Continuously 示意图

可以酌情参考以下链接中的例程:

http://www.deyisupport.com/question_answer/analog/data_converters/f/58/t/68454.aspx

恩,我就是参考数据手册的,搞了半天都没有搞出来

这个例程早些时候我就下载过了。里面写的很全面,就是太多了,看不过来!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top