TI中文支持网
TI专业的中文技术问题搜集分享网站

ads1256读寄存器的内容总是0x00和0xff,不知道程序哪里出了问题,急需解决啊,已经调了一个星期了

#include "ads1256.h"

#include "delay.h"

#include "usart.h"

 

/**********************************************************************/

/****************************************

延时uS  

*****************************************/

 

void ads1256_delayus(u16 time)   

{

u16 i=0;

while(time–)

{

i=3;

while(i–);

  }

}

 

/****************************************

功能:延时Ms

*****************************************/

void ads1256_delayms(u16 time)

{

 u16 i;

 while(time–)

 {

 i=4000;

 while(i–);

 }  

}

 

/****************************************

功能:寄存器设置初始化,如果初始化成功返回0,失败返回1

*****************************************/

u8 ADS1256_Init(void)

{

    GPIO_InitTypeDef GPIO_Initure;

    

    __HAL_RCC_GPIOA_CLK_ENABLE();           //使能GPIOB时钟

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOE_CLK_ENABLE();           //使能GPIOB时钟

    

//PA15 CS,PA5 SCK

GPIO_Initure.Pin=GPIO_PIN_15|GPIO_PIN_5;          

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         

    HAL_GPIO_Init(GPIOA,&GPIO_Initure);     //初始化

//PB5 MOSI

GPIO_Initure.Pin=GPIO_PIN_5;          

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化

//PB4 MISO

GPIO_Initure.Pin=GPIO_PIN_4;          

    GPIO_Initure.Mode=GPIO_MODE_INPUT;  //推挽输出

    GPIO_Initure.Pull=GPIO_NOPULL;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化

//PE1 RESET

GPIO_Initure.Pin=GPIO_PIN_1;        

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         

    HAL_GPIO_Init(GPIOE,&GPIO_Initure);     //初始化

    //PE0 DRDY

GPIO_Initure.Pin=GPIO_PIN_0;        

    GPIO_Initure.Mode=GPIO_MODE_INPUT;  //推挽输出  GPIO_MODE_INPUT

    GPIO_Initure.Pull=GPIO_NOPULL;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         

    HAL_GPIO_Init(GPIOE,&GPIO_Initure);     //初始化

 

u8 ReturnData = 0;

u8 ADS1256_reg_Init[4]={

                       0x04,  //状态寄存器初始化值

                   0x01,  //模拟多路选择器初始化值

                   0x00,  //AD控制寄存器初始化值

                   0x03,  //数据速度寄存器初始化值

                  // 0x00, //I/O控制寄存器初始化值

};

ADS1256_CS=1;

ADS1256_SCK=0;

ADS1256_RESET=0;

ads1256_delayms(1);

ADS1256_RESET=1;

ads1256_delayms(1);

ADS1256_CS=0;

ads1256_delayms(1);

 

while(ADS1256_Read_DRDY) ;                               //当ADS1256_DRDY为低时才能写寄存器

ADS1256_SYNC();               //同步命令

ADS1256_WAKEUP();               //同步唤醒

 

 

while(ADS1256_Read_DRDY);

ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化  自我校准不使能

ads1256_delayus(1);

ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化 P是0,N是2.

ads1256_delayus(1);

ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化 增益是1

ads1256_delayus(1);

ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化 速度2.5 SPS

ads1256_delayus(1);

//ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化    设置为输出

// ads1256_delayus(1);

if(ADS1256_reg_Init[0] != ADS1256_read_reg(0x00))  

{

printf("第一个寄存器的内容为 %x\r\n",ADS1256_reg_Init[0]);

printf("实际读出的内容为 %x\r\n",ADS1256_read_reg(0x00));

printf("状态寄存器器初始化失败!\r\n");

ReturnData = 1;

}

 

if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01))

{

printf("第二个寄存器的内容为 %x\r\n",ADS1256_reg_Init[1]);

printf("实际读出的内容为 %x\r\n",ADS1256_read_reg(0x01));

printf("模拟多路寄存器器初始化失败! \r\n");

ReturnData = 1;

}

delay_us(1);

if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02))

{

printf("第三个寄存器的内容为 %x\r\n",ADS1256_reg_Init[2]);

printf("实际读出的内容为 %x\r\n",ADS1256_read_reg(0x02));

printf("AD控制寄存器初始化失败! \r\n");

ReturnData = 1;

}

delay_us(1);

if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03))

{

printf("第四个寄存器的内容为 %x\r\n",ADS1256_reg_Init[3]);

printf("实际读出的内容为 %x\r\n",ADS1256_read_reg(0x03));

printf("数据速度寄存器初始化失败!\r\n");

ReturnData = 1;

}

delay_us(1);

while(ADS1256_Read_DRDY)

printf("寄存器初始化完成后没有转换低电平!\r\n");

ADS1256_SELFCAL(); //补偿和增益自校准

ads1256_delayus(5);

ADS1256_SYNC();     //AD转换同步

ads1256_delayms(20);

ADS1256_WAKEUP();   //退出待机模式

ads1256_delayus(5);

 

return(ReturnData);

}

 

 

void ADS1256_write_bit(u8 temp)

{

u8 i;

ADS1256_SCK=1;

ads1256_delayus(1);

for(i=0;i<8;i++)

{

if(temp&(0x80>>i))

ADS1256_MOSI=1;

else

ADS1256_MOSI=0;

ads1256_delayus(1);  

ADS1256_SCK=0;

ads1256_delayus(1);

ADS1256_SCK=1;

}

ads1256_delayus(1);

}

 

/****************************************

功能:读一字节数据

ADS1256_Read_MISO PBin(4)

ADS1256_Read_DRDY PEin(0)

ADS1256_CS PAout(15)

ADS1256_RESET PEout(1)

ADS1256_DRDY PAout(15)

ADS1256_MISO PBout(4)

ADS1256_MOSI PBout(5)

ADS1256_SCK PAout(5)

*****************************************/

 

u8 ADS1256_read_bit(void)  

{

 u8 i;

 u8 date;

//ADS1256_SCK=0;

for(i=0;i<8;i++)

{

ADS1256_SCK=1;

date=date<<1;

ads1256_delayus(1);

ADS1256_SCK=0;

date= date | ADS1256_Read_MISO;

ads1256_delayus(1);

}

  return date;

}

 

/****************************************

功能:读DRDY引脚状态

*****************************************/

u8 ADS1256_DRDY(void)

{

return ADS1256_Read_DRDY;

}

 

/****************************************

功能:读单次数据命令

*****************************************/

void ADS1256_RDATA(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_RDATA_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0x01);

}

 

 

/****************************************

功能:连续读数据命令

*****************************************/

void ADS1256_RDATAC(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_RDATAC_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0x03);

}

 

 

/****************************************

功能:停止连续读数据命令

*****************************************/

void ADS1256_SDATAC(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_SDATAC_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0x0F);

}

 

 

/****************************************

功能:补偿和增益自我校准命令

*****************************************/

void ADS1256_SELFCAL(void)

{

  while(ADS1256_Read_DRDY)

printf("ADS1256_SELFCAL_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xF0);

}

 

 

/****************************************

功能:补偿自我校准

*****************************************/

void ADS1256_SELFOCAL(void)

{

  while(ADS1256_Read_DRDY)

printf("ADS1256_SELFOCAL_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xF1);

}

 

 

/****************************************

功能:增益自我校准

*****************************************/

void ADS1256_SELFGCAL(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_SELFGCAL_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xF2);

}

 

 

/****************************************

功能:系统补偿校准

*****************************************/

void ADS1256_SYSOCAL(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_SYSOCAL_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xF3);

}

 

 

/****************************************

功能:系统增益校准

*****************************************/

void ADS1256_SYSGCAL(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_SYSGCAL_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xF4);

}

 

 

/****************************************

功能:AD转换同步

*****************************************/

void ADS1256_SYNC(void)

{

while(ADS1256_Read_DRDY)

printf("ADS1256_SYNC_DRDY没有转换低电平!\r\n");

ADS1256_write_bit(0xFC);

}

 

 

/****************************************

功能:启动待机模式

*****************************************/

void ADS1256_ATANDBY(void)

{

 ADS1256_write_bit(0xFD);

}

 

/****************************************

功能:系统复位

*****************************************/

void ADS1255_RESET(void)

{

 ADS1256_write_bit(0xFE);

}

 

 

/****************************************

功能:退出待机模式

*****************************************/

void ADS1256_WAKEUP(void)

{

 ADS1256_write_bit(0xFF);

}

 

 

/****************************************

功能:ADS1255写寄存器

说明:根据要求写入寄存器和命令字

@para1* command 对应的是寄存器地址,@para2* 对应写入寄存器的值

*****************************************/

 

void ADS1256_write_reg(u8 ADS1256_command,u8 ADS1256_data)

{

while(ADS1256_Read_DRDY)

{

printf("ADS1256写寄存器DRDY未能转换低电平\r\n");

}

ADS1256_write_bit(ADS1256_command | 0x50);  //需要写某个寄存器的命令

ADS1256_write_bit(0x00);        //第二个命令,表示写入寄存器的数量为 n-1 即为1.

ADS1256_write_bit(ADS1256_data);   //写入的值

ads1256_delayus(10);

}

 

 

/****************************************

功能:ADS1255读寄存器

说明:根据要求写入寄存器地址

@para1* 对应的是寄存器地址

*****************************************/

 

u8 ADS1256_read_reg(u8 ADS1256_command)

{

  u8 reg_date;

while(ADS1256_Read_DRDY)

{

printf("读寄存器DRDY未能转换低电平\r\n");

}

  ADS1256_write_bit(ADS1256_command | 0x10);   //需要读某个寄存器的命令

  ADS1256_write_bit(0x00);             //第二个命令,表示读入寄存器的数量为 n-1 即为1.

  ads1256_delayus(50);

  reg_date=ADS1256_read_bit();          //读操作

if(reg_date==0)

printf("读取数据失败\r\n");

  return reg_date;

}

 

 

 

/****************************************

//功能:读一次转化完成的数据

*****************************************/

u32 ADS1256_Read_a_Data(void)

{

u32 Data,Data1,Data2,Data3;

Data1 = ADS1256_read_bit();

Data2 = ADS1256_read_bit();

Data3 = ADS1256_read_bit();

Data = (Data1<<16) | (Data2<<8) | Data3;

return (Data);

}

 

/****************************************

//功能:把读数转化成电压值,输入分别为 : 读回的二进制值   参考电压   内置增益

*****************************************/

double ADS1256_DataFormatting(u32 Data , double Vref ,u8 PGA)

{

/*

电压计算公式;

设:AD采样的电压为Vin ,AD采样二进制值为X,参考电压为 Vr ,内部集成运放增益为G

Vin = ( (2*Vr) / G ) * ( x / (2^23 -1))

*/

double ReadVoltage;

if(Data & 0x00800000)

{

Data = (~Data) & 0x00FFFFFF;

ReadVoltage = -(((double)Data) / 8388607) * ((2*Vref) / ((double)PGA));

}

else

ReadVoltage =  (((double)Data) / 8388607) * ((2*Vref) / ((double)PGA));

return(ReadVoltage);

}

 

 

 

user5320188:

user5324430:

回复 user5320188:

谁会,来帮他一下呗

Mickey Zhang:

回复 user5320188:

寄存器的话,您可以下载如下链接下的ADS1255-7 Design Calculator 来配置:
www.ti.com/…/toolssoftware

user5320188:

回复 Mickey Zhang:

谢谢您提供的资料,很有参考价值,但是我的芯片初始化不成功,芯片手册也没有讲初始化的步骤,想请教您如何初始化,谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » ads1256读寄存器的内容总是0x00和0xff,不知道程序哪里出了问题,急需解决啊,已经调了一个星期了
分享到: 更多 (0)