This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

STM32 对ADS1255的初始配置

Other Parts Discussed in Thread: ADS1255

STM32 对ADS1255的初始配置,源代码如下:

#include "math.h"
#include "misc.h"


 /*Registers' Address*/
#define REG_STATUS  0
#define REG_MUX     1
#define REG_ADCON   2
#define REG_DRATE   3
#define REG_IO      4
#define REG_OFC0    5
#define REG_OFC1    6
#define REG_OPC2    7
#define REG_FSC0    8
#define REG_FSC1    9
#define REG_FSC2    10

#define ADS1255_STATUS 0x00    //状态寄存器(ADDRESS 00h)
#define ADS1255_MUX    0x01    //模拟多路选择控制器(Address 01h)
#define ADS1255_ADCON  0x02    //AD控制寄存器 (Address 02h)
#define ADS1255_DRATE  0x03    //AD数据速度寄存器(Address 03h)
#define ADS1255_IO     0x04    //i/o控制寄存器(Address 04H)
#define ADS1255_OFC0   0x05    //Offset Calibration Byte 0, least significant byte (Address 05h)
#define ADS1255_OFC1   0x06    //Offset Calibration Byte 1 (Address 06h)
#define ADS1255_OFC2   0x07    //Offset Calibration Byte 2, most significant byte (Address 07h)
#define ADS1255_FSC0   0x08    //Full.scale Calibration Byte 0, least significant byte (Address 08h)
#define ADS1255_FSC1   0x09    //Full.scale Calibration Byte 1 (Address 09h)
#define ADS1255_FSC2   0x0a    //Full.scale Calibration Byte 2, most significant byte (Address 0Ah)

/*Operation Command*/

//#define ADS1255_WAKEUP          0x00    //Completes SYNC and Exits Standby Mode
#define ADS1255_RDATA           0x01    //单次读取数据
#define ADS1255_RDATAC          0x03    //连续读取数据
#define ADS1255_SDATAC          0x0f    //停止连续读数据
#define ADS1255_RREG            0x10    //从寄存器中读取数据Read from REG rrr 0001 rrrr (1xh) 0000 nnnn
#define ADS1255_WREG            0x50    //向寄存器中写入数据Write to REG rrr 0101 rrrr (5xh) 0000 nnnn
#define ADS1255_SELFCAL         0xf0    //补偿和增益自我校准Offset and Gain Self-Calibration
#define ADS1255_SELFOCAL        0xf1    //补偿自我校准Offset Self-Calibration
#define ADS1255_SELFGCAL        0xf2    //增益自我校准Gain Self-Calibration
#define ADS1255_SYSOCAL         0xf3    //系统补偿校准System Offset Calibration
#define ADS1255_SYSGCAL         0xf4    //系统增益校准System Gain Calibration
#define ADS1255_SYNC            0xfc    //使ad转换同步Synchronize the A/D Conversion
#define ADS1255_STANDBY         0xfd    //启动待机模式Begin Standby Mode
#define ADS1255_RESET           0xfe    //重置升高值Reset to Power-Up Values
#define ADS1255_WAKEUP          0xff    //结束退出待机模式Completes SYNC and Exits Standby Mode

#define ADS1255_DRDY      GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)

#define SetADS1255_OUT    GPIO_ResetBits(GPIOA,GPIO_Pin_9)  //0
#define SetADS1255_IN     GPIO_ResetBits(GPIOA,GPIO_Pin_10)
#define SetADS1255_DRDY   GPIO_ResetBits(GPIOA,GPIO_Pin_11)
#define SetADS1255_CLK    GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define SetADS1255_CS     GPIO_ResetBits(GPIOA,GPIO_Pin_8)

#define ClrADS1255_OUT    GPIO_SetBits(GPIOA,GPIO_Pin_9)   //1
#define ClrADS1255_IN     GPIO_SetBits(GPIOA,GPIO_Pin_10)
#define ClrADS1255_DRDY   GPIO_SetBits(GPIOA,GPIO_Pin_11)
#define ClrADS1255_CLK    GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define ClrADS1255_CS     GPIO_SetBits(GPIOA,GPIO_Pin_8)

#include "ADS1255.h"
#include "math.h"
#include "misc.h"
#include "mmc_sd.h"
#include "stm32f10x_gpio.h"

#define uchar unsigned char
#define uint unsigned int
float snow,snow1;
uchar date1,date2,date3;
uchar date4,date5,date6,date7,date8,date9;     
unsigned long snow2,snow3,snow4,snow5,snow6;                  
void PORT_Init (void);
char Read_Register(char Addr);
void Write_Register(char Addr,char data);
void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data);
uchar MYADS1255_read_reg(uchar ADS1255_command);
void ADS1255_write_bit(uchar temp);
uchar ADS1255_read_bit(void);
void MYADS1255_RDATAC(void);
void delayus(uchar i);
void delayms(uchar k);
void delayad(void);
void MYADS1255_SELFCAL(void);
void MYADS1255_init(void);
void MYADS1255_out_reg(void);
void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data);

/****************************************
功能描述:微秒可控延时
设计人:孙占山
说明:进行微秒延时,注意while(--i),不能为while(i--)
*****************************************/

void delayus(uchar i)       
{
 while(--i);
}

/****************************************
功能描述:毫可控秒延时
设计人:孙占山
说明:进行毫秒延时,可以改变时间
*****************************************/
void delayms(uchar k)
{
 uchar i,j;
 for(i=0;i<k;i++)
  for(j=0;j<248;j++);
  
}

void delayad(void)
{
 unsigned long i = 10;
    while(i--);
  }

void ADS1255_write_bit(uchar temp)
{
 uchar i,j;
 SetADS1255_CLK;
 for(i=0;i<8;i++)
 {
  SetADS1255_CLK;
  delayus(1);
  ClrADS1255_CLK;  
  delayus(1);
  j=( (temp&0x80)>>7 );
  GPIO_WriteBit( GPIOA , GPIO_Pin_9 ,j ); //在下降沿的时候写入数据//GPIO_Write
  delayus(1);
  SetADS1255_CLK;
  delayus(1);
  temp=temp<<1;
  }
}

/****************************************
功能描述:ADS1255单字节读出
设计人:孙占山
说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
*****************************************/

uchar ADS1255_read_bit(void)
{
uchar i;
uchar date;
 SetADS1255_CLK;
 ClrADS1255_IN;
 for(i=0;i<8;i++)
 {
  date=date<<1;
  SetADS1255_CLK;
  delayus(1);
  ClrADS1255_CLK;
  delayus(1);
  date=date|GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10);//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
  delayus(1);
  SetADS1255_CLK;
  }
  return date;
}

/****************************************
功能描述:ADS1255寄存器设置初始化
设计人:孙占山
说明:1:自校准可以通过写STATUS寄存器的ACAL位,还可以通过写SELFCAL命令来自校准
     2:使能自校准,在写寄存器ADCON(PGA),DRATE(DR),STATUS(BUFEN)自动校准
  3:在STATUS(BUFEN)与ACAL(自校准)位一起使能时,读出校准寄存器有错
*****************************************/

void MYADS1255_init(void)
{
 while(ADS1255_DRDY==0);
 MYADS1255_write_reg(ADS1255_STATUS,0xf4);//f4
 delayus(1);
 //while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
 //MYADS1255_write_reg(0x50,0x02); //写在STATUS(BUFEN)寄存器使能在BUFEN
 //delayus(1);
 while(ADS1255_DRDY==0);
 MYADS1255_write_reg(ADS1255_MUX,0x01); //08

 delayus(1);
 while(ADS1255_DRDY==0);
 MYADS1255_write_reg(ADS1255_ADCON,0x20);

 delayus(1);
 while(ADS1255_DRDY==0);
 MYADS1255_write_reg(ADS1255_DRATE,0xf0);
 
 delayus(1);
 while(ADS1255_DRDY==0);
 MYADS1255_write_reg(ADS1255_IO,0x00);
 delayus(1);

}

void MYADS1255_out_reg(void)
{
   while(ADS1255_DRDY==1);
   date4=MYADS1255_read_reg(0x15);
   while(ADS1255_DRDY==1);
   date5=MYADS1255_read_reg(0x16);
   while(ADS1255_DRDY==1);
   date6=MYADS1255_read_reg(0x17);
   while(ADS1255_DRDY==1);
   date7=MYADS1255_read_reg(0x18);
   while(ADS1255_DRDY==1);
   date8=MYADS1255_read_reg(0x19);
   while(ADS1255_DRDY==1);
   date9=MYADS1255_read_reg(0x1a);
}

/****************************************
功能描述:ADS1255写寄存器
设计人:孙占山
说明:根据要求写入寄存器和命令字
*****************************************/
void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data)
{
 ADS1255_write_bit(ADS1255_command);
 ADS1255_write_bit(0x00);    //ADS1255_Write_Byte(0x00);
 ADS1255_write_bit(ADS1255_data);
 delayms(248);
}

/****************************************
功能描述:ADS1255读寄存器
设计人:孙占山
说明:根据要求写入寄存器和命令字
*****************************************/

uchar MYADS1255_read_reg(uchar ADS1255_command)
{
 uchar reg_date;
 ADS1255_write_bit(ADS1255_command);
 ADS1255_write_bit(0x00);    //ADS1255_Write_Byte(0x00);
 delayus(50);
 reg_date=ADS1255_read_bit();
 return reg_date;
}

/****************************************
功能描述:ADS1255唤醒
设计人:孙占山
说明:唤醒待机和同步
*****************************************/
void MYADS1255_WAKEUP(void)
{
 ADS1255_write_bit(0x00);
}

/****************************************
功能描述:ADS1255读一次数据命令
设计人:孙占山
说明:在DRDY为低时读出一个数据
*****************************************/

void MYADS1255_RDATA(void)
{
 ADS1255_write_bit(0x01);
}

/****************************************
功能描述:ADS1255连续数据命令
设计人:孙占山
说明:在DRDY为低时连续读出数据
*****************************************/

void MYADS1255_RDATAC(void)
{
 ADS1255_write_bit(0x03);
}

/****************************************
功能描述:ADS1255停止连续数据命令
设计人:孙占山
说明:在ADS1255连续输出24位当中的任何八位时写入,停止连续读数据
*****************************************/

void MYADS1255_SDATAC(void)
{
 ADS1255_write_bit(0x0F);
}

/****************************************
功能描述:偏移和增益自校准
设计人:孙占山
说明:偏移和增益自校准,也可以用STATUS寄存器中的ACAL来自校准
*****************************************/

void MYADS1255_SELFCAL(void)
{
 ADS1255_write_bit(0xf0);
}

/****************************************
功能描述:同步
设计人:孙占山
说明:同步用在命令的开始快速执行,紧接着用WAKE UP命令进行同步
*****************************************/

void MYADS1255_SYNC(void)
{
 ADS1255_write_bit(0xfc);
}

/****************************************
功能描述:复位
设计人:孙占山
说明:复位后不管ACAL位如何,都执行一个自校准
*****************************************/

void MYADS1255_RESET(void)
{
 ADS1255_write_bit(0xfe);
}
/****************************************
功能描述:ADS1255的24位数据分三次读出
设计人:孙占山
说明:1:ADS1255是24位的AD转换器,24位数据可以分三个八位读出,然后再经过公式算出结果
     2:公式有两种,一种是左移右移,一种是date1*65536+snow2*256+snow3
  3:注意公式左移时不好,因为左移有进位,这样可能数据会变化,一般尽量采取右移
*****************************************/

float MYADS1255_read(void)
{
 date1=ADS1255_read_bit();
 date2=ADS1255_read_bit();
 date3=ADS1255_read_bit();
 //snow=((((snow|date1)<<8)|date2)<<8)|date3;
 //snow=snow<<8;
 snow=date1*65536+date2*256+date3;
 return snow;
}

配置与时序都是照着说明写的,请问哪里还有问题,数据一直采集不对。(自认为可能是配置的问题)。

请技术人员帮下忙看下,我在这里卡住有段时间了,初学者,能力有限了。