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;
}
请问,到底是什么原因呢??谢谢!!!