首页 > 代码库 > 【调试记录】ADS1247参考程序

【调试记录】ADS1247参考程序

       以前在做一个项目中,算是我人生的第一个项目,在大四保研后跟着师兄做的,师兄选定方案、芯片和制作板子,我主要负责软件调试和测试。项目使用了一款TI的24位ADC,是ADS1247,与单片机通信采用的SPI,其实是模拟SPI时序,当时在网上查找了相关资料,发现资料太少了,而且例程也没有,但是调试其与单片机通信时总是出错,费了一个多星期,数据手册也看了多遍,发现这片子确实有点不好调,没办后来像许多人请教最后终于调通了。后来发现仍然有很多的网友找我要例程,虽然很想直接沟通和交流,但是有时真的没时间,很抱歉,现在把例程贴出来,希望对大家会有帮助。有问题可以评论,我也会时常来看看。

 

模拟SPI时序,采用内部参考电压,其实问题出在读数据和写数据两个子函数上。

头文件:

#ifndef _ADS_SPI_H
#define _ADS_SPI_H

 

//**************端口映射**************//
#define ADC_Start _RC7
#define ADC_CS _RC6
#define ADC_DRDY _RB6
#define ADC_Dout _RB7
#define ADC_Din _RB9
#define ADC_SCLK _RB8
#define ADC_RESET _RB5

//**************指令集**************//
#define WakeUp 0x00 //唤醒
#define Sleep_C 0x02 //休眠
#define SYNC 0x04 //同步ad转换
#define Reset 0x06 //复位
#define NOP 0xff //空指令
#define RData 0x12 //读一次数据
#define RDataC 0x14 //连续读数据
#define SDataC 0x16 //停止连续读数据
#define RReg 0x20 //读寄存器
#define WReg 0x40 //写寄存器

//**************寄存器地址***************//
#define Reg_MUX0 0x00 //Multiplexer Control Register 0
#define Reg_VBias 0x01 //Bias Voltage Register
#define Reg_MUX1 0x02 //Multiplexer Control Register 1
#define Reg_SYS0 0x03 //System Control Register 0
#define Reg_CFC0 0x04
#define Reg_CFC1 0x05
#define Reg_CFC2 0x06
#define Reg_FSC0 0x07
#define Reg_FSC1 0x08
#define Reg_FSC2 0x09
#define Reg_IDAC0 0x0a //IDAC Control Register 0
#define Reg_IDAC1 0x0b
#define Reg_GPIOCFG 0x0c
#define Reg_GPIODIR 0x0d
#define Reg_GPIODAT 0x0e

#define AD_REF 2.047998
#define AD_LSB AD_REF/262143.0
//#define AD_LSB AD_REF/8388608.0

#define nop() asm("nop")

void delay_AD(int num);
void ADS1247_Init(void);
unsigned char ADS1247SPI(unsigned char WriteData);
void ADS1247WREG(unsigned char Address,unsigned char databyte);
unsigned char ADS1247RREG(unsigned char Address);
unsigned long ADS1247ReadData( );
unsigned char ADS1247ReadByte( );

#endif

 

源程序:

#include "ADS_SPI.h"

//********AD延时函数********//
void delay_AD(int num)//延时1.25*num(us)
{
int i=0;
for (i= 0; i < num ;i++ )
;
}


//********连续读数据******//
void AD_RDATAC()
{
ADS1247SPI(RDataC);
delay_AD(100);
}


//***************************************************
//函数名 : ADS1247SPI();
//功能说明:ADS1247全双工通信
//输入说明:写操作时,写入WriteData;
// 读操作时,写入0xFF,读出SDOUT输出值
//作者/时间/版本号:
//修改记录: 无
//***************************************************
unsigned char ADS1247SPI(unsigned char WriteData)
{
unsigned char i,ReadData=http://www.mamicode.com/0;
for(i=0;i<8;i++)
{
ADC_SCLK=1;
nop();nop();nop();
ReadData<<=1;
if (WriteData & 0x80)
ADC_Din=1;
else
ADC_Din=0;
nop();nop();nop();
if (ADC_Dout==1)
ReadData++;
ADC_SCLK=0;
nop();nop();nop();
WriteData<<=1;
}
return ReadData;
}


//***************************************************
//函数名 : ADS1247WREG();
//功能说明:ADS1247写寄存器
//输入说明:将databyte 的值写入地址为Address 的寄存器中
//作者/时间/版本号:
//修改记录: 无
//***************************************************
void ADS1247WREG(unsigned char Address,unsigned char databyte)
{
ADS1247SPI(0x40+(Address&0x0F));
ADS1247SPI(0X00);
ADS1247SPI(databyte);
}


//***************************************************
//函数名 : ADS1247RREG();
//功能说明:ADS1247读寄存器
//输入说明:读地址为Address 的寄存器中的数据,返回该值
//作者/时间/版本号:
//修改记录: 无
//***************************************************
unsigned char ADS1247RREG(unsigned char Address)
{
unsigned char RegData=http://www.mamicode.com/0X00;
ADS1247SPI(0x20+(Address&0x0F));
ADS1247SPI(0X00);
RegData=http://www.mamicode.com/ADS1247SPI(0XFF);
return RegData;
}


//***************************************************
//函数名 : ADS1247ReadData();
//功能说明:ADS1247读19位数据
//输入说明:
//作者/时间/版本号:
//修改记录: 无
//***************************************************
unsigned long ADS1247ReadData()
{
unsigned char i=0;
unsigned long WriteDataOut =0xFFFFFF;
unsigned long ADCData=http://www.mamicode.com/0;
for(i=0;i<19;i++)//AD取19bit
{
ADC_SCLK=1;
nop();nop();nop();
ADCData<<=1;
if (WriteDataOut & 0x800000)
ADC_Din=1;
else
ADC_Din=0;
nop();nop();nop();
if (ADC_Dout==1)
ADCData++;
ADC_SCLK=0;
nop();nop();nop();
WriteDataOut<<=1;
}
return ADCData;
}

//***************************************************
//函数名 : ADS1247ReadByte();
//功能说明:ADS1247读8位数据
//输入说明:
//作者/时间/版本号:
//修改记录: 无
//***************************************************
unsigned char ADS1247ReadByte()
{
unsigned char i=0;
unsigned char WriteDataOut =0xFF;
unsigned char ADCData=http://www.mamicode.com/0;
for(i=0;i<8;i++)
{
ADC_SCLK=1;
nop();nop();nop();
ADCData<<=1;
if (WriteDataOut & 0x80)
ADC_Din=1;
else
ADC_Din=0;
nop();nop();nop();
if (ADC_Dout==1)
ADCData++;
ADC_SCLK=0;
nop();nop();nop();
WriteDataOut<<=1;
}
return ADCData;
}


//***************************************************
//函数名 : ADS1247_Init();
//功能说明:ads1247初始化
//输入说明:
//作者/时间/版本号:
//修改记录: 无
//***************************************************
void ADS1247_Init(void)
{
//端口设置
_TRISC7 =0; //start是输出端
_TRISC6 =0; //cs是输出端
_TRISB6 =1; //DRDY是输入端
_TRISB7 =1; //DOUT是输入端
_TRISB9 =0; //din是输出端
_TRISB8 =0; //sclk是输出端
_TRISB5 =0; //Rsest是输出端

_RB5=0; //reset
delay_AD(1);
_RB5=1;
delay_AD(500);//delay 0.6ms
_RC7=1; //start
delay_AD(10);
_RC6=0; //CS=0
delay_AD(10);
ADS1247WREG(Reg_MUX0 , 0x08); //AIN1 as positive input channel;AIN0 as negative input channel;
ADS1247WREG(Reg_VBias , 0x00); //Bias voltage not enabled
ADS1247WREG(Reg_MUX1 , 0x30); //Onboard reference;
ADS1247WREG(Reg_SYS0 , 0x02); //PGA=1;rate=20SPS 修改了
ADS1247WREG(Reg_IDAC0 , 0x00); //DOUT/DRDY pin functions only as Data Out

ADS1247SPI(0x62);// 0110 0010 Self offset Calibration
delay_AD(100);

AD_RDATAC( );
}

 

【调试记录】ADS1247参考程序