打印

那位有ADS1248驱动程序代码?急求,

[复制链接]
5565|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lifenganhui|  楼主 | 2012-3-26 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
木字四点水| | 2012-4-13 14:39 | 只看该作者
我有源代码,要哇

使用特权

评论回复
板凳
fx-sg| | 2013-3-17 18:26 | 只看该作者
木字四点水 发表于 2012-4-13 14:39
我有源代码,要哇

最近我也在调试,但调了好久都没成功,不知道能不能给我一份?610285504@qq.com

使用特权

评论回复
地板
tyw| | 2013-3-17 18:59 | 只看该作者
ADS1248.cpp.rar (2.41 KB)

#include "device.h"
  unsigned char D_ADS1248_REG_SYS0 = 0;  // ADS1248的增益和速度
  signed long results=0;
  extern signed long main_results[20];
  unsigned char AD_cnt=0;
  unsigned char  AD_reg[6];
//-----------------------------------------------------------------//
// 功    能:延时
// 入口参数: 延时时间 delaytime * us
// 出口参数: /
// 全局变量: /
// 备    注: 10:72us;50:271us;100:515us
//-----------------------------------------------------------------//

#pragma vector=PORT2_VECTOR
__interrupt void Ads1248(void)
{
    unsigned char i=0;
    WDTCTL =  WDT_ARST_1000;
    //关闭IO中断
    P2IE =0;
    P2IES=0;
    //清中断标志位
    P2IFG &=~ADSO ;
   
   
    //发送单次读数据命令
    ADS1248SPI(ADS1248_CMD_RDATA);
    //读取ADC转换完成的数据
    results=ADS1248ReadData(0xFFFFFF);
    //发送空操作指令,强迫D_OUT变高
    ADS1248SPI(ADS1248_CMD_NOP);
    //简单数据处理
    main_results[0]=results>>5;
   
   
    //ADS1248内部寄存器校验,如果寄存器值发生改变则重写该寄存器
   
    AD_cnt++;
    if(AD_cnt>AD_CHECK-1)
    {
      AD_cnt=0;
      i=ADS1248RREG(ADS1248_REG_MUX0);
      if(i!=AD_reg[0])
      {
        ADS1248WREG(ADS1248_REG_MUX0,AD_reg[0]);
      }
      i=0;
      i=ADS1248RREG(ADS1248_REG_MUX1);
      if(i!=AD_reg[1])
      {
        ADS1248WREG(ADS1248_REG_MUX1,AD_reg[1]);
      }
      i=0;
      i=ADS1248RREG(ADS1248_REG_VBIAS);
      if(i!=AD_reg[2])
      {
        ADS1248WREG(ADS1248_REG_VBIAS,AD_reg[2]);
      }
      i=0;
      i=ADS1248RREG(ADS1248_REG_IDAC1);
      if(i!=AD_reg[3])
      {
        ADS1248WREG(ADS1248_REG_IDAC1,AD_reg[3]);
      }
      i=0;
      i=ADS1248RREG(ADS1248_REG_IDAC0);
      if(i!=AD_reg[4])
      {
        ADS1248WREG(ADS1248_REG_IDAC0,AD_reg[4]);
      }
      i=0;
      i=ADS1248RREG(ADS1248_REG_SYS0);
      if(i!=AD_reg[5])
      {
        ADS1248WREG(ADS1248_REG_SYS0,AD_reg[5]);
      }
      i=0;
    }
   
    //打开IO中断
    P2IE |= ADSO;
    //下降沿触发中断
    P2IES|= ADSO;
    //清中断标志位                          
    P2IFG &=~ADSO ;
}
//-----------------------------------------------------------------//
// 功    能:ADS1248初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: /
//-----------------------------------------------------------------//
void InitADS1248(void)
{
      
  //发送复位命令
    P4OUT&=~BIT4;
    Delay(2*DELAY_10ms);
    P4OUT|= BIT4 ;
    Delay(DELAY_10ms);
    //ADS1248SPI(ADS1248_CMD_RESET);
    //初始化MUX0寄存器
    AD_reg[0]=0x25;
    ADS1248WREG(ADS1248_REG_MUX0,0x25); //00100101,Bit7-6:Burnout不使用,Bit5-3:正输入为AIN4,Bit2-0:负输入为AIN5
    //初始化MUX1寄存器
    AD_reg[1]=0x30;
    ADS1248WREG(ADS1248_REG_MUX1,0x30); //00110000,Bit7:启用内部晶振,Bit6-5:内部基准一直打开,Bit4-3:输入基准为片上基准,Bit2-0:普通模式
    //延时等待10ms,等待内部基准稳定
    Delay(6*DELAY_10ms);
    //初始化VBIAS
    AD_reg[2]=0x00;
    ADS1248WREG(ADS1248_REG_VBIAS,0); //00000000,Bit7-0:偏置电压选择关闭(默认)
    //初始化IDAC1
    AD_reg[3]=0xff;
    ADS1248WREG(ADS1248_REG_IDAC1,0xFF);//11111111,Bit7-4:断开内部第一恒流源的连接,Bit3-0:断开内部第二恒流源的连接  0X8F打开第一内部恒流源
    //初始化IDAC0
    AD_reg[4]=0x08;
    ADS1248WREG(ADS1248_REG_IDAC0,0x08); //00001000,Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源
    //初始化SYS0
    AD_reg[5]=0x00;
    ADS1248WREG(ADS1248_REG_SYS0,0x00); //00000000,Bit7:必须设置为0,Bit6-41:选择1倍增益,Bit3-0:选择5SPS测量速度
}

//-----------------------------------------------------------------//
// 功    能:ADS1248 SPI接口程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: SPI速度最高2MHz,用于命令发送等操作
//-----------------------------------------------------------------//
unsigned char ADS1248SPI(unsigned char m)
{
    //SPI速度最高2MHz,用于命令发送等操作
    unsigned char i,r=0;
    for(i=0;i<8;i++)
    {
      SET_ADSCK
      r=r<<1;
      if (m & 0x80) {SET_ADSI}  else  CLR_ADSI
      Delay(10);
      CLR_ADSCK
      if (P2IN&ADSO) r++;
      Delay(10);
      m=m<<1;
    }
    return r;
}
//-----------------------------------------------------------------//
// 功    能:ADS1248 读取
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注:
// SPI速度最高2MHz,用于读取AD的24位结果.在使用START引脚控制ADS1248时,可使用此函数
// 输出为有符号数。已经把ADS1248的输出格式转变为有符号数,0输入对应码值0,正最大对应7FFFFF,负最大对应-7FFFFF
// WriteOut是在发送24个SCLK以读取数据的同时写出去的24位指令,比如写入MUX0寄存器以改变通道。注意此次读取的为设置改变前的结果
// 如果WriteOut是操作控制寄存器,则START线应该保持高
//-----------------------------------------------------------------//
signed long ADS1248ReadData(signed long WriteOut)
{
    //SPI速度最高2MHz,用于读取AD的24位结果.在使用START引脚控制ADS1248时,可使用此函数
    //输出为有符号数。已经把ADS1248的输出格式转变为有符号数,0输入对应码值0,正最大对应7FFFFF,负最大对应-7FFFFF
    //WriteOut是在发送24个SCLK以读取数据的同时写出去的24位指令,比如写入MUX0寄存器以改变通道。注意此次读取的为设置改变前的结果
    //如果WriteOut是操作控制寄存器,则START线应该保持高
    unsigned char i=0;
    signed long r=0;
    for(i=0;i<24;i++)
    {
      SET_ADSCK
      r=r<<1;
      if (WriteOut & 0x800000) {SET_ADSI} else CLR_ADSI
      Delay(10);
      CLR_ADSCK
      if (P2IN&ADSO) r++;
      Delay(10);
      WriteOut=WriteOut<<1;
    }
    return r;
}

//-----------------------------------------------------------------//
// 功    能:ADS1248 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: 向ADS1248中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1248WREG(unsigned char regaddr,unsigned char databyte)
{
    //向寄存器写入数据地址
    ADS1248SPI(ADS1248_CMD_WREG+(regaddr & 0xF));
    //写入数据的个数n-1
    ADS1248SPI(0);
    //向regaddr地址指向的寄存器写入数据databyte
    ADS1248SPI(databyte);
}


//-----------------------------------------------------------------//
// 功    能:ADS1248 读数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: 从ADS1248中地址为regaddr的寄存器读出一个字节databyte
//-----------------------------------------------------------------//
unsigned char ADS1248RREG(unsigned char regaddr)
{
    //从ADS1248中地址为regaddr的寄存器读出一个字节
    unsigned char r=0;
    //写入地址
    ADS1248SPI(ADS1248_CMD_RREG+(regaddr & 0xF));
    //写入读取数据的个数n-1
    ADS1248SPI(0);
    //读出regaddr地址指向的寄存器的数据
    r=ADS1248SPI(ADS1248_CMD_NOP);
    return r;//返回数据
}

//-----------------------------------------------------------------//
// 功    能:ADS1248 读数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: 进行一次ADS1248测量,输出格式为直接二进制,有符号位
//-----------------------------------------------------------------//
/*signed long StartADS1248( void )
{
signed long  r = 0;
do { }
while( P2IN & ADSO );  // 等待DRDY变低,指示AD转换结束
   
// r = ADS1248ReadData( (ADS1248_CMD_WREG | ADS1248_REG_SYS0)<<16+D_ADS1248_REG_SYS0 );
// 读取的为设置改变前的结果,写入增益与速度的新设置,START控制的单次采样不能执行此操作。因为START此时为低
// r = ADS1248ReadData( 0x400025 );      
// 读取的为设置改变前的结果,START控制的单次采样不能执行此操作。因为START此时为低
r = ADS1248ReadData( 0xFFFFFF );  // 3个NOP指令
ADS1248WREG( ADS1248_REG_SYS0, D_ADS1248_REG_SYS0 ); // 试验:在每次读取后改变增益
// 如果不使用单独的DRDY线,在进行一次转换并读取测量值后,必须执行NOP或WREG等不影响输出寄存器的指令强制DOUT/DRDY变为高
if(r & 0x800000)  r = -1*(0x1000000-r);  // 转换输出格式为直接二进制,有符号位
return r;
}

*/

使用特权

评论回复
5
漠北的孤狼| | 2013-8-17 15:30 | 只看该作者
谢谢。刚学ADS1248路过。

使用特权

评论回复
6
dcp| | 2018-8-24 13:04 | 只看该作者
谢谢tyw!

使用特权

评论回复
7
ygyh| | 2021-2-7 10:58 | 只看该作者
谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:傻鱼

34

主题

749

帖子

2

粉丝