您好、TI 支持。
一段时间以来、我一直尝试使其正常工作、但不知怎么说、当 ADC 转换准备就绪时、我没有收到任何中断。
因此、我将在电池工作模式期间手动触发 ADC 转换(ADCCTRL0.ADC_CONV_START = 1)。 此外、我还设置了 VBAT 的 MASK2 (MASK2.ADC_READY_MASK = 1)和 ADC_READ_EN (ADC_READ_EN.EN_VBAT_READ = 1)。 然后、如果我没有错过数据表中的某个内容、则应在 ADC 转换准备就绪时触发中断引脚。 但由于某种原因、它不会。 然后、如果我在 ADC 转换开始1秒后手动读取 FLAG2寄存器、我会看到 FLAG2.ADC_READY_FLAG 位被置位。 此外、通常还可以读取 VBAT 值、它也是正确的值(如预期的那样)...
我通常可以写入和读取寄存器、我确信 I2C 通信正常工作。 我可以读取所有默认寄存器值、我可以设置 LDO 电压等 我确信中断在其他情况下可以正常工作、比如说是连接了 VIN、还是按下了 MR 等
以下是一些基本寄存器设置、我认为这些设置应该足以满足我的需求...
基本代码示例(不包括代码的某些方以提高可读性):
/*
目标是在电池激活模式下(仅连接电池)手动启动 ADC 转换、并
在 ADC 转换完成后接收中断(上升沿)。
所需的寄存器说明:
•FLAG2- ADC 标志->标志 ADC_READY_FLAG 指示 ADC 转换的状态(读取时清除)。
•MASK2-中断屏蔽2.->触发中断线的事件屏蔽。 ADC 就绪的 ADC_READY_MASK。
•ADCCTRL0- ADC Control 0->手动启动 ADC 转换。 将 ADC_CONV_START 位设置为"1"。
•ADC_READ_EN-通道启用->启用特定的 ADC 转换。 在本例中为 EN_VBAT_READ。
*
#define BQ2515X_ADC_READ_EN 0x58
#define BQ2515X_MASK2 0x09
#define BQ2515X_ADCCTRL0 0x40
#define BQ2515X_FLAG2 0x05
结构 FLAG2{
bool TS_open_FLAG :1;
uint8_t 保留:3;
bool comp3_alarm_flag :1;
bool comp2_alarm_flag :1;
bool COMP1_ALARM_FLAG :1;
bool adc_ready_flag :1;
}FLAG2;
结构 MASK2{
bool TS_open_mask :1;
uint8_t 保留:3;
bool comp3_alarm_mask :1;
bool comp2_alarm_mask :1;
bool COMP1_ALARM_MASK :1;
bool adc_ready_mask:1;
}MASK2;
结构 ICCTRL0{
bool sw_reset :1;
bool hw_reset :1;
bool global_INT_MASK :1;
bool 保留:1;
uint8_t AUTOWAKE :2;
bool reserved_1:1;
bool EN_ship_mode:1;
}ICCTRL0;
结构 ADC_READ_EN{
bool 保留:1;
bool EN_ADCIN_READ:1;
bool EN_TS_Read:1;
bool EN_VBAT_READ:1;
bool EN_VIN_READ:1;
bool EN_ICHG_READ:1;
bool EN_PMID_READ:1;
bool EN_IIN_READ:1;
}ADC_READ_EN;
//初始化 BQ25155。
void bq25155_init(){
//所有寄存器都设置为默认值。
ADC_READ_EN.EN_VBAT_READ = 1;//启用 VBAT ADC 转换。
bq25155_WRITE_REG (BQ2515X_ADC_READ_EN、&ADC_READ_EN);//写入 ADC_READ_EN 寄存器。
MASK2.ADC_READY_MASK = 1;//启用 ADC 就绪中断触发屏蔽。
bq25155_WRITE_reg (BQ2515X_MASK2、&MASK2);//写入 MASK2寄存器。
}
//每2秒调用一次。
void start_adc_conv (){
ADCCTRL0.adc_conV_start = 1;//设置此位以启动 ADC 转换。
bq25155_WRITE_reg (BQ2515X_ADCCTRL0、&ADCCTRL0);
}
//在上升沿和/或下降沿调用 ISR。
void bq25515_ON_INT_CHANGE (){
//读取 FLAG2寄存器并清除其值,以便下次触发中断。
bq25155_READ_reg (BQ2515X_FLAG2、&FLAG2);//读取 FLAG2寄存器。
printf ("F2:0x%.2X\n"、FLAG2);
if (FLAG2.ADC_READY_FLAG){
// ADC 转换已完成。
//读取 ADC VBAT MSB 和 LSB 寄存器->读取正确的值(电池电压)
。}
}
请您帮助我弄清楚数据表中缺少什么以及我做了什么错误...
并展望解决问题的前景。
此致、Ales Zupanc。
固件开发人员、Polabs d.o.o.