#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;
}