打印

ADS1255 懂的朋友进来下。

[复制链接]
3539|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
twins7713|  楼主 | 2013-5-29 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 twins7713 于 2013-5-29 16:03 编辑

#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;
SetADS1255_CLK;
for(i=0;i<8;i++)
{
  SetADS1255_CLK;
  delayus(248);
  ClrADS1255_CLK;   
  delayus(248);
  GPIO_WriteBit( GPIOA , GPIO_Pin_9 , ( (temp&0x80)>>7) ); //在下降沿的时候写入数据//GPIO_Write
  delayus(248);
  SetADS1255_CLK;
  delayus(248);
  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(50);
  ClrADS1255_CLK;
  delayus(50);
  date=date|GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10);//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=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(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
MYADS1255_write_reg(ADS1255_STATUS,0xf4);
delayus(1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);   
MYADS1255_write_reg(ADS1255_MUX,0x08);
delayus(1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
MYADS1255_write_reg(ADS1255_ADCON,0x00);
delayus(1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
MYADS1255_write_reg(ADS1255_DRATE,0xf0);
delayus(1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
MYADS1255_write_reg(ADS1255_IO,0x00);
delayus(1);
}
void MYADS1255_out_reg(void)
{
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date4=MYADS1255_read_reg(0x15);
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date5=MYADS1255_read_reg(0x16);
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date6=MYADS1255_read_reg(0x17);
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date7=MYADS1255_read_reg(0x18);
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date8=MYADS1255_read_reg(0x19);
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1);
   date9=MYADS1255_read_reg(0x1a);
}
char Read_Register(char Addr)
{
  char data;
  char Command=0;
  Command|=0x40;
  Addr&=0x0f;
  Command|=Addr;
  
   SPI_ReadWriteByte(Command);
   data=SPI_ReadWriteByte(0x55);
  return (data);
}
void Write_Register(char Addr,char data)
{
  char Command=0;
  Command|=0x60;
  Addr&=0x0F;
  Command|=Addr;
   SPI_ReadWriteByte(Command);
   SPI_ReadWriteByte(data);
}
/****************************************
功能描述:ADS1255写寄存器
设计人:孙占山
说明:根据要求写入寄存器和命令字
*****************************************/
void MYADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data)
{
ADS1255_write_bit(ADS1255_command);
ADS1255_write_bit(0x50);    //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(0x10);    //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;
}
#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 SetADS1255_OUT GPIOA->BRR = GPIO_Pin_9 //0
#define SetADS1255_IN GPIOA->BRR = GPIO_Pin_10
#define SetADS1255_DRDY GPIOA->BRR = GPIO_Pin_11
#define SetADS1255_CLK GPIOB->BRR = GPIO_Pin_5

#define ClrADS1255_OUT GPIOA->BSRR = GPIO_Pin_9 //1
#define ClrADS1255_IN GPIOA->BSRR = GPIO_Pin_10
#define ClrADS1255_DRDY GPIOA->BSRR = GPIO_Pin_11
#define ClrADS1255_CLK GPIOB->BSRR = GPIO_Pin_5


这是我结合别人例子写的ADS1255配置,但是就是采不出数据,到底是哪里有错呀?

相关帖子

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

本版积分规则

10

主题

29

帖子

1

粉丝