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.

[参考译文] HDC2080:读取寄存器后 HDC2080 中断未清除

Guru**** 2555630 points
Other Parts Discussed in Thread: HDC2080, CC3230SF

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1542322/hdc2080-hdc2080-interrupt-not-clearing-after-register-read

器件型号:HDC2080
Thread 中讨论的其他器件: CC3230SF

工具/软件:

我将 HDC2080 温度和湿度传感器与 CC3230SF 器件搭配使用、并已将传感器配置为在温度或湿度超过阈值时触发中断。 INT 引脚连接到配置为从休眠状态唤醒源的 GPIO 13。
我期望的行为:
  • 当湿度/温度超过阈值时、INT 引脚变为高电平。
  • 读取传感器后、我预计 INT 会变为低电平。
  • 如果在休眠之前它仍为高电平、则系统将无法正确唤醒、因为不会发生 GPIO 边沿触发(它已经为高电平)。
问题:
 有时、 在进入休眠模式之前、INT 引脚会保持 高电平、因此当我进入休眠  模式时、系统稍后无法检测到上升沿(因为该引脚已经为高电平)。 我想要这样的行为:
  1. INT 在发生阈值事件时变为高电平
  2. 它会保持高电平、直到读取传感器为止
  3. 读取后、它会被清除
  4. 然后在休眠模式下、新的阈值交叉会导致其再次变为高电平 、该上升沿唤醒 MCU
问题:
 是否建议 在进入休眠状态之前从 HDC2080 “复位“或清除中断引脚 (INT)、以便其可以在发生下一个事件时再次变为高电平并产生唤醒? 在休眠之前、我是否应该手动读取寄存器或清除软件中的中断以强制 INT 引脚为低电平?

下面的 cofig_func:

//设置温度阈值低
Buf[0]= 0x0A;// TEMP_THR_L 寄存器地址
Buf[1]= tempToRaw8Bit (tempLow);
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

//将温度阈值设置为高
Buf[0]= 0x0B;// TEMP_THR_H 寄存器地址
Buf[1]= tempToRaw8Bit (tempHigh);
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

//将湿度阈值设置为低值
Buf[0]= 0x0C;// RH_THR_L 寄存器地址
Buf[1]= humToRaw8Bit (humLow);
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

//将湿度阈值设置为高
BUF[0]= 0x0D;// RH_THR_H 寄存器地址
Buf[1]= humToRaw8Bit (humHigh);
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

Buf[0]= 0x07;//中断使能寄存器地址
Buf[1]=(1 << 6)|(1 << 5)|(1 << 4)|(1 << 3);
//buf[1]= 0x80;
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

Buf[0]= 0x0E;
Buf[1]=(0b101 << 4)|(0 << 3)|(1 << 2)|(1 << 1)|(0 << 0);
//buf[1]= 0x56;
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

Buf[0]= 0x08;// TEMP_OFFSET_ADJUST 寄存器地址
Buf[1]= 0xF3;//–2.08
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

Buf[0]= 0x0F;// measurement_config 寄存器
Buf[1]= 0x01;
TXn.writeBuf = buf;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);

清除下面的中断功能:


uint8_t TRIG[2]={0x0F、0x01};
TXn.targetAddress = HDC2080_SLAVE_ADDR;
TXn.writeBuf = TRIG;
TXn.writeCount = 2;
TXn.ReadCount = 0;
I2C_TRANSFER (i2cHandle、&txn);
}

vTaskDelay (PDMs_to_ticks (300));

//读取温度和湿度数据
CMD = 0x00;
TXn.writeBuf =&cmd;
TXn.writeCount = 1;
TXn.readBuf = Rx;
TXn.ReadCount = 4;
if (I2C_TRANSFER (i2cHandle、&txn)){
uint16_t rawT =(rx[1]<< 8)| rx[0];
uint16_t rawH =(rx[3]<< 8)| rx[2];
浮点 tempRaw = rawToTemp (rawT);
Float humRaw = rawToHum (rawH);

如果 (firstRead){
Filtered_temperature = tempRaw;
Filtered_weight = humRaw;
firstRead = false;
}其他{

Filtered_temperature = alpha * tempRaw +(1 - alpha)* Filtered_temperature;
Filtered_hydage = alpha * humRaw +(1 - alpha)* Filtered_hydage;
}

温度= FILTED_TEMPERATURE;
湿度= FILTED_HUMIDITY;

UART_print(温度:%.2f°C、嗡嗡声:%.2f %%RH \n“,温度,湿度);


uint8_t interrupt_status_cmd = 0x04;
uint8_t interrupt_status_rx;
TXn.writeBuf =&INTERRUPT_STATUS_cmd;
TXn.writeCount = 1;
TXn.readBuf =&INTERRUPT_STATUS_Rx;
TXn.ReadCount = 1;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hamza:

    要清除 DRDY/INT 引脚、需要读取中断 DRDY 寄存器、地址为 0x04

    读取该寄存器后、DRDY 就会雕像和销钉清晰。 您可以在 MCU 触发并读取数据后执行此操作。

    谢谢

    -亚历克斯·汤普森