主题中讨论的其他器件:TPS8802
工具/软件:
TI 团队大家好、
我指的是中所述的睡眠模式功能 TPS8802 AFE 数据表的第 8.4.1 节“睡眠模式“[第 40 页]。
我已将 TPS8802 配置为从睡眠模式转换 () SLEEP_EN = 1以唤醒模式 () SLEEP_DONE / SLEEP_EN = 0方法来实现的。
在此设置中、我将睡眠计时器设置为 10 秒。 这意味着 TPS8802 进入睡眠模式 (由显示的注册表表示) STATUS1VCCLOW等待 10 秒、然后自动唤醒 (显示)STATUS1SLP_DONE。
MCU 持续监控 STATUS1用于检测从睡眠到唤醒的转换的寄存器。
启动时、MCU 会调用函数 afe_i2c_sleep_timer(10000)要配置睡眠计时器 10 秒 (10000ms)、请使用 TPS8802 数据表中指定的相应 I2C 寄存器设置。
计时器启动后、MCU 会重复调用 CheckSleepTimeExpiry()以读取 STATUS1寄存并监控睡眠至唤醒状态。
请参阅以下代码片段:
void CheckSleepTimeExpiry()
{
static uint32_t elapsed_time = 0;
int ret = 0;
elapsed_time += 1000; // Assuming this function is called every 1 second (1000 ms)
ret = afe_i2c_status_read_reg(TPS880X_REG_STATUS1);
if(ret == SLP_DONE)
{
i2c_write_data(i2c_dev, TPS880X_REG_ENABLE2, 0x84); //SLP_EN = 0
StopI2CSleepTimer();
}
else if (elapsed_time >= SetSleeptime+5)
{
i2c_write_data(i2c_dev, TPS880X_REG_ENABLE2, 0x84); //SLP_EN = 0
StopI2CSleepTimer();
elapsed_time = 0; // Reset the elapsed time
printk("Abort Timer.\n");
}
printk("Elapsed time: %u ms\n", elapsed_time);
}
void afe_i2c_sleep_timer(uint16_t sleep_time)
{
SetSleeptime = sleep_time;
// Mask all interrupts, enable INT_MCU
i2c_write_data(i2c_dev, TPS880X_REG_MASK, 0xFF);
i2c_write_data(i2c_dev, TPS880X_REG_CONFIG1, 0x37); //SLP_MCU = SLP_ANALOG = SLP_BST = 1
i2c_write_data(i2c_dev, TPS880X_REG_ENABLE1, 0x3D); // INT_EN = 1
i2c_write_data(i2c_dev, TPS880X_REG_ENABLE2, 0x85); // SLP_EN = LEDPIN_EN = INT_DIR = LEDSEL = 1
if (sleep_time == 0) {
// Disable the Sleep timer
i2c_write_data(i2c_dev, TPS880X_REG_SLPTMR1, 0x00);
i2c_write_data(i2c_dev, TPS880X_REG_SLPTMR2, 0x00);
}
else
{
// Validate interval
if (sleep_time < DUALRAYSMOKEAFE_HAL_TIMING_ULPTIMER_MIN_INTERVAL_MS)
{
sleep_time = DUALRAYSMOKEAFE_HAL_TIMING_ULPTIMER_MIN_INTERVAL_MS;
}
else if (sleep_time > DUALRAYSMOKEAFE_HAL_TIMING_ULPTIMER_MAX_INTERVAL_MS)
{
sleep_time = DUALRAYSMOKEAFE_HAL_TIMING_ULPTIMER_MAX_INTERVAL_MS;
}
}
// MSB
i2c_write_data(i2c_dev, TPS880X_REG_SLPTMR1, sleep_time >> 8);
// LSB
i2c_write_data(i2c_dev, TPS880X_REG_SLPTMR2, sleep_time & 0xFF);
k_timer_init(&si2cSleepTimer, &SleepTimerHandler, nullptr);
k_timer_user_data_set(&si2cSleepTimer, nullptr);
StartSleepTimerHandler();
}
uint8_t afe_i2c_status_read_reg(uint8_t reg_addr)
{
int ret = 0;
uint8_t status = 0;
uint8_t status_val = 0;
ret = i2c_reg_read_byte(i2c_dev, AFE_ADDR, reg_addr, &status);
if (ret != 0)
{
printk("Failed to read Status register\n");
}
printk("Status Value: %d\n", status);
if (reg_addr == TPS880X_REG_STATUS1){
if (status & VCCLOW)
{
printk("VCCLOW\n");
status_val = VCCLOW;
}
if (status & MCULDO_ERR)
{
printk("MCULDO_ERR\n");
status_val = MCULDO_ERR;
}
if (status & OTS_ERR)
{
printk("OTS_ERR\n");
status_val = OTS_ERR;
}
if (status & OTS_WRN)
{
printk("OTS_WRN\n");
status_val = OTS_WRN;
}
if (status & BST_NACT)
{
printk("BST_NACT\n");
status_val = BST_NACT;
}
if (status & BST_ERR)
{
printk("BST_ERR\n");
status_val = BST_ERR;
}
if (status & INT_UNIT)
{
printk("INT_UNIT\n");
status_val = INT_UNIT;
}
if (status & SLP_DONE)
{
printk("SLP_DONE\n");
status_val = SLP_DONE;
}
}
return status_val;
}
根据之前提供的代码、基于计时器的睡眠到唤醒功能按预期工作。
Q1:如何使用 TPS8802 中断引脚 (INT_MCU/GPIO) 配置 TPS8802 以唤醒 MCU?
在当前实现中、我通过写入 I2C 寄存器来启用中断、如下所示:
i2c_write_data(i2c_dev, TPS880X_REG_ENABLE1, 0x3D); // INT_EN = 1 (as per datasheet)
中断引脚连接:
TPS8802 (INT_MCU / GPIO) ----> MCU (GPIO Pin)
但是、当我尝试读取时 INT_MCU / GPIO 在 MCU 的相应 GPIO 引脚上、当 tps8802 将进入睡眠/唤醒时、我不会在 MCU GPIO 上收到任何状态更改。
您能否指导我了解触发中断信号并将其从 TPS8802 读取到 MCU 所需的正确配置或其他步骤?
问题 2:如何使用 MCU GPIO 引脚唤醒 TPS8802(从低电平到高电平转换)?
我还想配置相反方向的设置、MCU 可以使用其中一个 MCU GPIO 引脚通过从低电平切换至高电平来唤醒 TPS8802。
请建议支持此功能所需的正确寄存器设置或硬件配置。
此致、
Pratik Panchal

