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.

关于ADS122C04的咨询

Other Parts Discussed in Thread: ADS122C04, ADS1220

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

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

  • 但是DRDY引脚一直等不来低电平,那是启动没有转换呢吧, 因为只有数据准备好就能出来.

    当然还有, 你怎么测试的 DRDY 低脉冲. 因为 SPI 时钟会清掉低电平. 还是先检查时序波形来验证和找问题点吧

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

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