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

关于ADS122C04的咨询

ADS122C04的寄存器可以正确配置,但是DRDY引脚一直等不来低电平,电路如下:

程序如下:

#define N 12

//A0-DGND A1-DGND
#define ADS122C_ADDR_WRITE 0x80
#define ADS122C_ADDR_READ 0x81

#define ADS122CREG_RESET 0x06 //复位
#define ADS122CREG_START 0x08 //启动转换
#define ADS122CREG_PD 0x02 //进入断电模式
#define ADS122CREG_DATA 0x10 //读取数据
#define ADS122CREG_RREG 0x20 //从rr地址开始读取nn个寄存器
#define ADS122CREG_WREG 0x40 //从rr地址开始写nn个寄存器

#define ADS122CDRDY_IN HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

void ADS122C_DRDY(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//ADS1220软件复位
void ADS122C_Reset(void)
{
I2C_SendByte(ADS122CREG_RESET);
}

//ADS1220进入断电模式
void ADS122C_PowerDown(void)
{
I2C_SendByte(ADS122CREG_PD);
}

//配置ADS1220
static uint8_t ADS122C_Write_Config(uint8_t RegAddr,uint8_t RegData)
{
if(!I2C_Start())
return HAL_I2C_ERROR_TIMEOUT;
I2C_SendByte((ADS122C_ADDR_WRITE));//写從地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_SendByte((RegAddr));//写器件地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_SendByte((RegData));//写器件地址
if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
} I2C_Stop(); return HAL_I2C_ERROR_NONE;
}

static uint8_t ADS122C_Read_Config(uint8_t RegAddr,uint8_t *RegData)
{
if(!I2C_Start())
return HAL_I2C_ERROR_TIMEOUT;
I2C_SendByte((ADS122C_ADDR_WRITE));//写器件地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_SendByte((RegAddr));//写器件地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_Stop(); if(!I2C_Start())
return HAL_I2C_ERROR_TIMEOUT;
I2C_SendByte(ADS122C_ADDR_READ); //读器件地址
if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}

*RegData = I2C_ReceiveByte(); //读数据
I2C_NoAck();
I2C_Stop(); return HAL_I2C_ERROR_NONE;}

//ADS1220初始化
uint8_t ADS122C_Config_Init(void)
{
uint8_t j = 0;
uint8_t ret = 0;
for(uint8_t i=0;i<3;i++)
{
ADS122C_Reset();
delay_ms(100);
ADS122C_Write_Config(ADS122CREG_WREG | 0x00, C_ADS122C_Par_Default_W[0]);
ADS122C_Write_Config(ADS122CREG_WREG | 0x04, C_ADS122C_Par_Default_W[1]);
ADS122C_Write_Config(ADS122CREG_WREG | 0x08, C_ADS122C_Par_Default_W[2]);
ADS122C_Write_Config(ADS122CREG_WREG | 0x0C, C_ADS122C_Par_Default_W[3]);
ADS122C_Read_Config(ADS122CREG_RREG | 0x00, &C_ADS122C_Par_R[0]);
ADS122C_Read_Config(ADS122CREG_RREG | 0x04, &C_ADS122C_Par_R[1]);
ADS122C_Read_Config(ADS122CREG_RREG | 0x08, &C_ADS122C_Par_R[2]);
ADS122C_Read_Config(ADS122CREG_RREG | 0x0C, &C_ADS122C_Par_R[3]);
/*
for(j=0;j<4;j++)
{
if(C_ADS122C_Par_R[j] != C_ADS122C_Par_Default_W[j])
{
break;
}
}
if(j == 4)
{
ret = 1;
break;
}
else
{
delay_ms(5);
}
*/
ret = 1;
}
return ret;
}

//ADS1220开始转换数据
void ADS122C_StartConversion(void)
{
I2C_SendByte(ADS122CREG_START);
}

//读取AD1220转换数据
uint8_t ADS122C_Read_Data(uint32_t *R_Data)
{
uint32_t l_Data = 0;
if(!I2C_Start())
return HAL_I2C_ERROR_TIMEOUT;
I2C_SendByte((ADS122C_ADDR_WRITE));//写器件地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_SendByte((ADS122CREG_DATA));//写器件地址 if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
}
I2C_Stop(); if(!I2C_Start())
return HAL_I2C_ERROR_TIMEOUT;
I2C_SendByte(ADS122C_ADDR_READ); //读器件地址
if(!I2C_WaitAck())
{
I2C_Stop(); return HAL_I2C_ERROR_TIMEOUT;
} l_Data = I2C_ReceiveByte();
I2C_Ack();
l_Data = (l_Data<<8) | I2C_ReceiveByte();
I2C_Ack();
l_Data = (l_Data<<8) | I2C_ReceiveByte();
I2C_NoAck();
I2C_Stop(); *R_Data = l_Data;
return HAL_I2C_ERROR_NONE;
}

uint32_t ADS122C_GetData(void)
{
uint8_t ret;
uint32_t L_ADS122C_Data = 0;
uint32_t L_ADS122C_Buf[N];
ADS122C_DRDY();
ret = ADS122C_Config_Init();
if(ret == 1)
{
ADS122C_StartConversion();
for(uint16_t i = 0; i < N; i++)
{
while(ADS122CDRDY_IN);
ADS122C_Read_Data(&L_ADS122C_Buf[i]);
}
for(uint16_t i = 0; i < N; i++)
{
L_ADS122C_Data += L_ADS122C_Buf[i];
}
L_ADS122C_Data = (uint32_t)(L_ADS122C_Data / N);//取平均值

}
else
{
//异常
L_ADS122C_Data = 0;
}
ADS122C_PowerDown();
return L_ADS122C_Data;
}

请问,到底是什么原因呢??谢谢!!!

Kailyn Chen:

问题解决了是吗?可以给大家分享一下,谢谢。

通常DRDY一直为高电平,说明不转换,硬件上先检查是否一致处于shut down状态,硬件没问题的话先检查寄存器读写是否正确,其次检查sync/start是否配置正确,sync是restart,如果sync一直处于复位的话,那么也不会发生转换。

赞(0)
未经允许不得转载:TI中文支持网 » 关于ADS122C04的咨询
分享到: 更多 (0)