Thread 中讨论的其他器件: CC3230SF
工具/软件:
我期望的行为:
- 当湿度/温度超过阈值时、INT 引脚变为高电平。
- 读取传感器后、我预计 INT 会变为低电平。
- 如果在休眠之前它仍为高电平、则系统将无法正确唤醒、因为不会发生 GPIO 边沿触发(它已经为高电平)。
有时、 在进入休眠模式之前、INT 引脚会保持 高电平、因此当我进入休眠 模式时、系统稍后无法检测到上升沿(因为该引脚已经为高电平)。 我想要这样的行为:
- INT 在发生阈值事件时变为高电平
- 它会保持高电平、直到读取传感器为止
- 读取后、它会被清除
- 然后在休眠模式下、新的阈值交叉会导致其再次变为高电平 、该上升沿唤醒 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;
